Browse Source

Add basename and dirname. Write memrchr.
-Erik

Eric Andersen 22 years ago
parent
commit
336f26dbe1
5 changed files with 142 additions and 2 deletions
  1. 42 0
      include/libgen.h
  2. 3 2
      libc/string/Makefile
  3. 26 0
      libc/string/basename.c
  4. 55 0
      libc/string/dirname.c
  5. 16 0
      libc/string/string.c

+ 42 - 0
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 <features.h>
+
+__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
+   <string.h>) 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 */

+ 3 - 2
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)
 

+ 26 - 0
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;
+}

+ 55 - 0
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;
+}

+ 16 - 0
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