diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2007-07-01 17:37:11 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2007-07-01 17:37:11 +0000 |
commit | bb6010366ded82475e1b7e2609646b46bb7c01e4 (patch) | |
tree | e788bf26d7883aecbc0ff4a9382f23012233283d /nuttx/lib | |
parent | 4c95a2fbba7328b2c1e6664a0dc9954dfe056f0a (diff) | |
download | px4-nuttx-bb6010366ded82475e1b7e2609646b46bb7c01e4.tar.gz px4-nuttx-bb6010366ded82475e1b7e2609646b46bb7c01e4.tar.bz2 px4-nuttx-bb6010366ded82475e1b7e2609646b46bb7c01e4.zip |
Add basename, dirname, strrchr
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@301 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/lib')
-rw-r--r-- | nuttx/lib/Makefile | 10 | ||||
-rw-r--r-- | nuttx/lib/lib_basename.c | 136 | ||||
-rw-r--r-- | nuttx/lib/lib_dirname.c | 149 | ||||
-rw-r--r-- | nuttx/lib/lib_strrchr.c | 72 |
4 files changed, 364 insertions, 3 deletions
diff --git a/nuttx/lib/Makefile b/nuttx/lib/Makefile index 107ab055c..7c34c3d2d 100644 --- a/nuttx/lib/Makefile +++ b/nuttx/lib/Makefile @@ -47,16 +47,17 @@ endif STRING_SRCS = lib_memset.c lib_memcpy.c lib_memcmp.c lib_memmove.c \ lib_strcpy.c lib_strncpy.c lib_strcmp.c \ - lib_strlen.c lib_strdup.c lib_strtol.c lib_strchr.c \ + lib_strlen.c lib_strdup.c lib_strtol.c lib_strchr.c lib_strrchr.c \ lib_strspn.c lib_strcspn.c \ lib_strtok.c lib_strtokr.c lib_strerror.c - + CTYPE_SRCS = STDIO_SRCS = lib_printf.c lib_rawprintf.c lib_lowprintf.c \ lib_sprintf.c lib_libsprintf.c lib_vsprintf.c lib_libvsprintf.c \ lib_memstream.c lib_lowstream.c lib_nullstream.c \ lib_sscanf.c + ifneq ($(CONFIG_NFILE_DESCRIPTORS),0) STDIO_SRCS += lib_rawstream.c ifneq ($(CONFIG_NFILE_STREAMS),0) @@ -76,6 +77,8 @@ MATH_SRCS = lib_rint.c UNISTD_SRCS = lib_getopt.c +LIBGEN_SRCS = lib_basename.c lib_dirname.c + SQ_SRCS = sq_addlast.c sq_addfirst.c sq_addafter.c \ sq_rem.c sq_remlast.c sq_remfirst.c sq_remafter.c @@ -83,7 +86,8 @@ DQ_SRCS = dq_addlast.c dq_addfirst.c dq_addafter.c dq_addbefore.c \ dq_rem.c dq_remlast.c dq_remfirst.c CSRCS = $(MISC_SRCS) $(STRING_SRCS) $(CTYPE_SRCS) $(STDIO_SRCS) \ - $(STDLIB_SRCS) $(MATH_SRCS) $(UNISTD_SRCS) $(SQ_SRCS) $(DQ_SRCS) + $(STDLIB_SRCS) $(MATH_SRCS) $(UNISTD_SRCS) $(LIBGEN_SRCS) \ + $(SQ_SRCS) $(DQ_SRCS) COBJS = $(CSRCS:.c=$(OBJEXT)) SRCS = $(ASRCS) $(CSRCS) diff --git a/nuttx/lib/lib_basename.c b/nuttx/lib/lib_basename.c new file mode 100644 index 000000000..853110ebd --- /dev/null +++ b/nuttx/lib/lib_basename.c @@ -0,0 +1,136 @@ +/**************************************************************************** + * lib_basename.c + * + * Copyright (C) 2007 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <spudmonkey@racsa.co.cr> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name Gregory Nutt nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Compilation Switches + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> +#include <sys/types.h> + +#include <string.h> +#include <libgen.h> + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static char g_retchar[2]; + +/**************************************************************************** + * Global Functions + ****************************************************************************/ + +/**************************************************************************** + * Function: basename + * + * Description: + * basename() extracts the filename component from a null-terminated + * pathname string. In the usual case, basename() returns the component + * following the final '/'. Trailing '/' characters are not counted as + * part of the pathname. + * + * If path does not contain a slash, basename() returns a copy of path. + * If path is the string "/", then basename() returns the string "/". If + * path is a NULL pointer or points to an empty string, then basename() + * return the string ".". + * + * basename() may modify the contents of path, so copies should be passed. + * basename() may return pointers to statically allocated memory which may + * be overwritten by subsequent calls. + * + * Parameter: + * path The null-terminated string referring to the path to be decomposed + * + * Return: + * On success the filename component of the path is returned. + * + ****************************************************************************/ + +char *basename(char *path) +{ + char *p; + int len; + int ch; + + /* Handle some corner cases */ + + if (!path || *path == '\0') + { + ch = '.'; + goto out_retchar; + } + + /* Check for trailing slash characters */ + + len = strlen(path); + while (path[len-1] == '/') + { + /* Remove trailing '/' UNLESS this would make a zero length string */ + if (len > 1) + { + path[len-1] = '\0'; + len--; + } + else + { + ch = '/'; + goto out_retchar; + } + } + + /* Get the address of the last '/' which is not at the end of the path and, + * therefor, must be just before the beginning of the filename component. + */ + + p = strrchr(path, '/'); + if (p) + { + return p + 1; + } + + /* There is no '/' in the path */ + + return path; + +out_retchar: + g_retchar[0] = ch; + g_retchar[1] = '\0'; + return g_retchar; +} diff --git a/nuttx/lib/lib_dirname.c b/nuttx/lib/lib_dirname.c new file mode 100644 index 000000000..06328a2d6 --- /dev/null +++ b/nuttx/lib/lib_dirname.c @@ -0,0 +1,149 @@ +/**************************************************************************** + * lib_dirname.c + * + * Copyright (C) 2007 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <spudmonkey@racsa.co.cr> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name Gregory Nutt nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Compilation Switches + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> +#include <sys/types.h> + +#include <string.h> +#include <libgen.h> + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static char g_retchar[2]; + +/**************************************************************************** + * Global Functions + ****************************************************************************/ + +/**************************************************************************** + * Function: dirname + * + * Description: + * dirname() extracts the directory component from a null-terminated + * pathname string. In the usual case, dirname() returns the string up + * to, but not including, the final '/'. Trailing '/' characters are not + * counted as part of the pathname. + * + * If path does not contain a slash, dirname() returns the string ".". If + * path is the string "/", then dirname() returns the string "/". If path + * is a NULL pointer or points to an empty string, then dirname() returns + * the string ".". + * + * dirname() may modify the contents of path, so copies should be passed. + * dirname() may return pointers to statically allocated memory which may + * be overwritten by subsequent calls. + * + * Parameter: + * path The null-terminated string referring to the path to be decomposed + * + * Return: + * On success the directory component of the path is returned. + * + ****************************************************************************/ + +char *dirname(char *path) +{ + char *p; + int len; + int ch; + + /* Handle some corner cases */ + + if (!path || *path == '\0') + { + ch = '.'; + goto out_retchar; + } + + /* Check for trailing slash characters */ + + len = strlen(path); + while (path[len-1] = '/') + { + /* Remove trailing '/' UNLESS this would make a zero length string */ + if (len > 1) + { + path[len-1] = '\0'; + len--; + } + else + { + ch = '/'; + goto out_retchar; + } + } + + /* Get the address of the last '/' which is not at the end of the path and, + * therefor, must be the end of the directory component. + */ + + p = strrchr(path, '/'); + if (p) + { + /* Handle the case where the only '/' in the string is the at the beginning + * of the path. + */ + + if (p == path) + { + ch = '/'; + goto out_retchar; + } + + /* No, the directory component is the substring before the '/'. */ + + *p = '\0'; + return path; + } + + /* There is no '/' in the path */ + + ch = '.'; + +out_retchar: + g_retchar[0] = ch; + g_retchar[1] = '\0'; + return g_retchar; +} diff --git a/nuttx/lib/lib_strrchr.c b/nuttx/lib/lib_strrchr.c new file mode 100644 index 000000000..70bc2be6f --- /dev/null +++ b/nuttx/lib/lib_strrchr.c @@ -0,0 +1,72 @@ +/************************************************************ + * lib_strrchr.c + * + * Copyright (C) 2007 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <spudmonkey@racsa.co.cr> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name Gregory Nutt nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ************************************************************/ + +/************************************************************ + * Compilation Switches + ************************************************************/ + +/************************************************************ + * Included Files + ************************************************************/ + +#include <nuttx/config.h> +#include <sys/types.h> +#include <string.h> + +/************************************************************ + * Global Functions + ************************************************************/ + +/* The strrchr() function returns a pointer to the last + * occurrence of the character c in the string s. + */ + +char *strrchr(const char *s, int c) +{ + if (s) + { + const char *p = &s[strlen(s) - 1]; + for (; p > s; p--) + { + if (*p == c) + { + return (char*)p; + } + } + } + + return NULL; +} + |