diff options
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/string/Makefile | 5 | ||||
| -rw-r--r-- | libc/string/basename.c | 26 | ||||
| -rw-r--r-- | libc/string/dirname.c | 55 | ||||
| -rw-r--r-- | libc/string/string.c | 16 | 
4 files changed, 100 insertions, 2 deletions
| diff --git a/libc/string/Makefile b/libc/string/Makefile index 7ef900041..f2a183318 100644 --- a/libc/string/Makefile +++ b/libc/string/Makefile @@ -26,7 +26,8 @@ include $(TOPDIR)Rules.mak  MSRC=string.c  MOBJ=strlen.o strcat.o strcpy.o strchr.o strcmp.o strncat.o strncpy.o \  	strncmp.o strrchr.o strdup.o strndup.o memcpy.o memccpy.o memset.o \ -	memmove.o memcmp.o memchr.o ffs.o strnlen.o strxfrm.o stpcpy.o stpncpy.o +	memmove.o memcmp.o memchr.o ffs.o strnlen.o strxfrm.o stpcpy.o \ +	stpncpy.o memrchr.o   ifeq ($(HAS_LOCALE),true)  	MOBJ += strcoll.o @@ -40,7 +41,7 @@ MOBJ2=strstr.o strcasestr.o  CSRC=strpbrk.c strsep.c strtok.c strtok_r.c strcspn.c \  	strspn.c strcasecmp.c strncasecmp.c strerror.c bcopy.c bzero.c \ -	bcmp.c sys_errlist.c +	bcmp.c sys_errlist.c dirname.c basename.c  COBJS=$(patsubst %.c,%.o, $(CSRC))  OBJS=$(MOBJ) $(MOBJ1) $(MOBJ2) $(COBJS) diff --git a/libc/string/basename.c b/libc/string/basename.c new file mode 100644 index 000000000..a158745a9 --- /dev/null +++ b/libc/string/basename.c @@ -0,0 +1,26 @@ +/* Return the name-within-directory of a file name. +   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. +   This file is part of the GNU C Library. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Library General Public License as +   published by the Free Software Foundation; either version 2 of the +   License, or (at your option) any later version. + +   The GNU C Library is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +   Library General Public License for more details. + +   You should have received a copy of the GNU Library General Public +   License along with the GNU C Library; see the file COPYING.LIB.  If not, +   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +   Boston, MA 02111-1307, USA.  */ + +#include <string.h> + +char * basename(const char *filename) +{ +    char *p = strrchr (filename, '/'); +    return p ? p + 1 : (char *) filename; +} diff --git a/libc/string/dirname.c b/libc/string/dirname.c new file mode 100644 index 000000000..89fc31ed8 --- /dev/null +++ b/libc/string/dirname.c @@ -0,0 +1,55 @@ +/* dirname - return directory part of PATH. +   Copyright (C) 1996, 2000 Free Software Foundation, Inc. +   This file is part of the GNU C Library. +   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Library General Public License as +   published by the Free Software Foundation; either version 2 of the +   License, or (at your option) any later version. + +   The GNU C Library is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +   Library General Public License for more details. + +   You should have received a copy of the GNU Library General Public +   License along with the GNU C Library; see the file COPYING.LIB.  If not, +   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +   Boston, MA 02111-1307, USA.  */ + +#define __USE_GNU +#include <libgen.h> +#include <string.h> + + +char * dirname(char *path) +{ +    static const char dot[] = "."; +    char *last_slash; + +    /* Find last '/'.  */ +    last_slash = path != NULL ? strrchr (path, '/') : NULL; + +    if (last_slash != NULL && last_slash != path && last_slash[1] == '\0') +	/* The '/' is the last character, we have to look further.  */ +	last_slash = memrchr (path, '/', last_slash - path); + +    if (last_slash != NULL) +    { +	/* Terminate the path.  */ +	if (last_slash == path) +	    /* The last slash is the first character in the string.  We have to +	       return "/".  */ +	    ++last_slash; + +	last_slash[0] = '\0'; +    } +    else +	/* This assignment is ill-designed but the XPG specs require to +	   return a string containing "." in any case no directory part is +	   found and so a static and constant string is required.  */ +	path = (char *) dot; + +    return path; +} diff --git a/libc/string/string.c b/libc/string/string.c index 94bf542e4..591f875f9 100644 --- a/libc/string/string.c +++ b/libc/string/string.c @@ -376,6 +376,22 @@ void *memchr(const void *str, int c, size_t len)  }  #endif +/********************** Function memrchr ************************************/ + +#ifdef L_memrchr +void *memrchr(const void *str, int c, size_t len) +{ +	register unsigned char *ptr; + +	for (ptr = (unsigned char *) str + len; len > 0; len--) { +		if (*--ptr == (unsigned char) c) +			return ptr; +	} + +	return 0; +} +#endif +  /********************** Function memcmp ************************************/  #ifdef L_memcmp | 
