+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.
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.
#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++;
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)
{
--- /dev/null
+/* 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 */
# 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
# 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);
--- /dev/null
+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
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
configure.ac:
Makefile.am:
-lib_SOURCES += dirname-lgpl.c basename-lgpl.c stripslash.c
+lib_SOURCES += dirname-lgpl.c stripslash.c
Include:
"dirname.h"