From 336f26dbe1cfffd17b465084bd87d027922467da Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Wed, 19 Dec 2001 12:46:31 +0000 Subject: Add basename and dirname. Write memrchr. -Erik --- include/libgen.h | 42 ++++++++++++++++++++++++++++++++++++++ libc/string/Makefile | 5 +++-- libc/string/basename.c | 26 ++++++++++++++++++++++++ libc/string/dirname.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ libc/string/string.c | 16 +++++++++++++++ 5 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 include/libgen.h create mode 100644 libc/string/basename.c create mode 100644 libc/string/dirname.c diff --git a/include/libgen.h b/include/libgen.h new file mode 100644 index 000000000..dc3f064d3 --- /dev/null +++ b/include/libgen.h @@ -0,0 +1,42 @@ +/* Copyright (C) 1996, 1997, 1999, 2000 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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _LIBGEN_H +#define _LIBGEN_H 1 + +#include + +__BEGIN_DECLS + +/* Return directory part of PATH or "." if none is available. */ +extern char *dirname (char *__path) __THROW; + +#if 0 +/* Return final component of PATH. + + This is the weird XPG version of this function. It sometimes will + modify its argument. Therefore we normally use the GNU version (in + ) and only if this header is included make the XPG + version available under the real name. */ +extern char *__xpg_basename (char *__path) __THROW; +#define basename __xpg_basename +#endif + +__END_DECLS + +#endif /* libgen.h */ 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 + +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 , 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 +#include + + +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 -- cgit v1.2.3