changeset 957:8f236bb14756

(base_name_strip_trailing_slashes): new function.
author Jim Meyering <jim@meyering.net>
date Sun, 29 Jun 1997 22:25:54 +0000
parents 24e82295daf8
children 498dc8724967
files lib/basename.c
diffstat 1 files changed, 68 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/lib/basename.c	Sun Jun 29 21:05:05 1997 +0000
+++ b/lib/basename.c	Sun Jun 29 22:25:54 1997 +0000
@@ -28,3 +28,71 @@
 
   return (char *) base;
 }
+
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+#else
+char *malloc ();
+#endif
+
+char *
+base_name_strip_trailing_slashes (name)
+     char const *name;
+{
+  char const *end_p = name += FILESYSTEM_PREFIX_LEN (name);
+  char const *first, *p;
+  char *base;
+  int length;
+
+  /* Make END_P point to the byte after the last non-slash character
+     in NAME if one exists.  */
+  for (p = name; *p; p++)
+    if (!ISSLASH (*p))
+      end_p = p + 1;
+
+  if (end_p == name)
+    {
+      first = end_p;
+    }
+  else
+    {
+      first = end_p - 1;
+      while (first > name && !ISSLASH (*(first - 1)))
+	--first;
+    }
+
+  length = end_p - first;
+  base = (char *) malloc (length + 1);
+  if (base == 0)
+    return 0;
+
+  memcpy (base, first, length);
+  base[length] = '\0';
+
+  return base;
+}
+
+#ifdef TEST
+# include <assert.h>
+# include <stdlib.h>
+
+# define CHECK(a,b) assert (strcmp (base_name_strip_trailing_slashes(a), b) \
+			    == 0)
+
+int
+main ()
+{
+  CHECK ("a", "a");
+  CHECK ("ab", "ab");
+  CHECK ("ab/c", "c");
+  CHECK ("/ab/c", "c");
+  CHECK ("/ab/c/", "c");
+  CHECK ("/ab/c////", "c");
+  CHECK ("/", "");
+  CHECK ("////", "");
+  CHECK ("////a", "a");
+  CHECK ("//a//", "a");
+  CHECK ("/a", "a");
+  exit (0);
+}
+#endif