]> Savannah Git Hosting - gnulib.git/commitdiff
basename-lgpl: New module.
authorBruno Haible <bruno@clisp.org>
Sun, 5 Jul 2020 16:06:13 +0000 (18:06 +0200)
committerBruno Haible <bruno@clisp.org>
Sun, 5 Jul 2020 18:01:02 +0000 (20:01 +0200)
* lib/basename-lgpl.h: New file, based on lib/dirname.h and
lib/basename-lgpl.c.
* lib/basename-lgpl.c: Include basename-lgpl.h, not dirname.h. Include
<stdbool.h>, filename.h.
(last_component): Rename a local variable.
* lib/dirname.h: Include basename-lgpl.h.
(DOUBLE_SLASH_IS_DISTINCT_ROOT): Remove macro.
(last_component, base_len): Remove declarations.
* modules/basename-lgpl: New file.
* modules/dirname-lgpl (Files): Remove lib/basename-lgpl.c.
(Depends-on): Add basename-lgpl. Remove double-slash-root.
(Makefile.am): Don't compile basename-lgpl.c.
* doc/posix-functions/basename.texi: Mention the module 'basename-lgpl',
not 'dirname'.

ChangeLog
doc/posix-functions/basename.texi
lib/basename-lgpl.c
lib/basename-lgpl.h [new file with mode: 0644]
lib/dirname.h
modules/basename-lgpl [new file with mode: 0644]
modules/dirname-lgpl

index b2fe127b53e51f877ed7f798331879ba8d806ee1..1396c94f50527510a90e2d8c7848dcd8ffb32e82 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2020-07-05  Bruno Haible  <bruno@clisp.org>
+
+       basename-lgpl: New module.
+       * lib/basename-lgpl.h: New file, based on lib/dirname.h and
+       lib/basename-lgpl.c.
+       * lib/basename-lgpl.c: Include basename-lgpl.h, not dirname.h. Include
+       <stdbool.h>, filename.h.
+       (last_component): Rename a local variable.
+       * lib/dirname.h: Include basename-lgpl.h.
+       (DOUBLE_SLASH_IS_DISTINCT_ROOT): Remove macro.
+       (last_component, base_len): Remove declarations.
+       * modules/basename-lgpl: New file.
+       * modules/dirname-lgpl (Files): Remove lib/basename-lgpl.c.
+       (Depends-on): Add basename-lgpl. Remove double-slash-root.
+       (Makefile.am): Don't compile basename-lgpl.c.
+       * doc/posix-functions/basename.texi: Mention the module 'basename-lgpl',
+       not 'dirname'.
+
 2020-07-05  Bruno Haible  <bruno@clisp.org>
 
        dirname, dirname-lgpl: Simplify.
index e75b510200f704360b1e46cf1856de963b1d9011..ebc616e939875dc4be99b278654d775c3d085dca 100644 (file)
@@ -23,5 +23,5 @@ version and the GNU version.
 names in Windows syntax.
 @end itemize
 
-The Gnulib module @code{dirname} provides similar API, with function
-@code{base_name}, that also works with Windows file names.
+The Gnulib module @code{basename-lgpl} provides similar API, with a function
+@code{last_component}, that also works with Windows file names.
index 565469ea3d106fd8711e9cc66eada9bade82b4c2..6bb28d45f1ffd70a250eb3d5c8be77c5ddddbda4 100644 (file)
 
 #include <config.h>
 
-#include "dirname.h"
+/* Specification.  */
+#include "basename-lgpl.h"
 
+#include <stdbool.h>
 #include <string.h>
 
-/* Return the address of the last file name component of NAME.  If
-   NAME has no relative file name components because it is a file
-   system root, return the empty string.  */
+#include "filename.h"
 
 char *
 last_component (char const *name)
 {
   char const *base = name + FILE_SYSTEM_PREFIX_LEN (name);
   char const *p;
-  bool saw_slash = false;
+  bool last_was_slash = false;
 
   while (ISSLASH (*base))
     base++;
@@ -39,21 +39,17 @@ last_component (char const *name)
   for (p = base; *p; p++)
     {
       if (ISSLASH (*p))
-        saw_slash = true;
-      else if (saw_slash)
+        last_was_slash = true;
+      else if (last_was_slash)
         {
           base = p;
-          saw_slash = false;
+          last_was_slash = false;
         }
     }
 
   return (char *) base;
 }
 
-/* Return the length of the basename NAME.  Typically NAME is the
-   value returned by base_name or last_component.  Act like strlen
-   (NAME), except omit all trailing slashes.  */
-
 size_t
 base_len (char const *name)
 {
diff --git a/lib/basename-lgpl.h b/lib/basename-lgpl.h
new file mode 100644 (file)
index 0000000..203ec23
--- /dev/null
@@ -0,0 +1,78 @@
+/*  Extract the last component (base name) of a file name.
+
+    Copyright (C) 1998, 2001, 2003-2006, 2009-2020 Free Software Foundation,
+    Inc.
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    This program 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 General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _BASENAME_LGPL_H
+#define _BASENAME_LGPL_H
+
+#include <stddef.h>
+
+#ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
+# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Return the address of the last file name component of FILENAME.
+   If FILENAME has some trailing slash(es), they are considered to be
+   part of the last component.
+   If FILENAME has no relative file name components because it is a file
+   system root, return the empty string.
+   Examples:
+              FILENAME      RESULT
+              "foo.c"       "foo.c"
+              "foo/bar.c"   "bar.c"
+              "/foo/bar.c"  "bar.c"
+              "foo/bar/"    "bar/"
+              "foo/bar//"   "bar//"
+              "/"           ""
+              "//"          ""
+             ""            ""
+   The return value is a tail of the given FILENAME; do NOT free() it!  */
+
+/* This function was traditionally called 'basename', but we avoid this
+   function name because
+     * Various platforms have different functions in their libc.
+       In particular, the glibc basename(), defined in <string.h>, does
+       not consider trailing slashes to be part of the component:
+              FILENAME      RESULT
+              "foo/bar/"    ""
+              "foo/bar//"   ""
+     * The 'basename' command eliminates trailing slashes and for a root
+       produces a non-empty result:
+              FILENAME      RESULT
+              "foo/bar/"    "bar"
+              "foo/bar//"   "bar"
+              "/"           "/"
+              "//"          "/"
+ */
+extern char *last_component (char const *filename) _GL_ATTRIBUTE_PURE;
+
+/* Return the length of the basename FILENAME.
+   Typically FILENAME is the value returned by base_name or last_component.
+   Act like strlen (FILENAME), except omit all trailing slashes.  */
+extern size_t base_len (char const *filename) _GL_ATTRIBUTE_PURE;
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* _BASENAME_LGPL_H */
index 5379e8e3d2cd853c3e3d134fb5c0bc71e530cc03..b2a91fd53544b998b50983120662b38fe74001ce 100644 (file)
 # include <stdbool.h>
 # include <stddef.h>
 # include "filename.h"
+# include "basename-lgpl.h"
 
 # ifndef DIRECTORY_SEPARATOR
 #  define DIRECTORY_SEPARATOR '/'
 # endif
 
-# ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
-#  define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
-# endif
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -41,9 +38,7 @@ char *dir_name (char const *file);
 # endif
 
 char *mdir_name (char const *file);
-size_t base_len (char const *file) _GL_ATTRIBUTE_PURE;
 size_t dir_len (char const *file) _GL_ATTRIBUTE_PURE;
-char *last_component (char const *file) _GL_ATTRIBUTE_PURE;
 
 bool strip_trailing_slashes (char *file);
 
diff --git a/modules/basename-lgpl b/modules/basename-lgpl
new file mode 100644 (file)
index 0000000..f81898d
--- /dev/null
@@ -0,0 +1,25 @@
+Description:
+Extract the last component (base name) of a file name.
+
+Files:
+lib/basename-lgpl.h
+lib/basename-lgpl.c
+
+Depends-on:
+double-slash-root
+filename
+stdbool
+
+configure.ac:
+
+Makefile.am:
+lib_SOURCES += basename-lgpl.c
+
+Include:
+"basename-lgpl.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+all
index b919102e670920f75baf75dbaa1f8f4fd33813b5..b7585359feb4ce89c056c0d92c1ac8cc53c21d3d 100644 (file)
@@ -4,11 +4,10 @@ Extract specific portions of filenames.
 Files:
 lib/dirname.h
 lib/dirname-lgpl.c
-lib/basename-lgpl.c
 lib/stripslash.c
 
 Depends-on:
-double-slash-root
+basename-lgpl
 filename
 malloc-posix
 stdbool
@@ -16,7 +15,7 @@ stdbool
 configure.ac:
 
 Makefile.am:
-lib_SOURCES += dirname-lgpl.c basename-lgpl.c stripslash.c
+lib_SOURCES += dirname-lgpl.c stripslash.c
 
 Include:
 "dirname.h"