>From b32e203eee9c9259996310b6bcf55a13b102348a Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sun, 5 Jul 2020 18:06:13 +0200 Subject: [PATCH 2/7] 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 , 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 | 18 +++++++++ doc/posix-functions/basename.texi | 4 +- lib/basename-lgpl.c | 20 ++++------ lib/basename-lgpl.h | 78 +++++++++++++++++++++++++++++++++++++++ lib/dirname.h | 7 +--- modules/basename-lgpl | 25 +++++++++++++ modules/dirname-lgpl | 5 +-- 7 files changed, 134 insertions(+), 23 deletions(-) create mode 100644 lib/basename-lgpl.h create mode 100644 modules/basename-lgpl diff --git a/ChangeLog b/ChangeLog index b2fe127..1396c94 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,23 @@ 2020-07-05 Bruno Haible + 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 + , 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 + dirname, dirname-lgpl: Simplify. * m4/dirname.m4: Remove file. * modules/dirname (configure.ac): Don't invoke gl_DIRNAME. diff --git a/doc/posix-functions/basename.texi b/doc/posix-functions/basename.texi index e75b510..ebc616e 100644 --- a/doc/posix-functions/basename.texi +++ b/doc/posix-functions/basename.texi @@ -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. diff --git a/lib/basename-lgpl.c b/lib/basename-lgpl.c index 565469e..6bb28d4 100644 --- a/lib/basename-lgpl.c +++ b/lib/basename-lgpl.c @@ -18,20 +18,20 @@ #include -#include "dirname.h" +/* Specification. */ +#include "basename-lgpl.h" +#include #include -/* 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 index 0000000..203ec23 --- /dev/null +++ b/lib/basename-lgpl.h @@ -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 . */ + +#ifndef _BASENAME_LGPL_H +#define _BASENAME_LGPL_H + +#include + +#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 , 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 */ diff --git a/lib/dirname.h b/lib/dirname.h index 5379e8e..b2a91fd 100644 --- a/lib/dirname.h +++ b/lib/dirname.h @@ -22,15 +22,12 @@ # include # include # 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 index 0000000..f81898d --- /dev/null +++ b/modules/basename-lgpl @@ -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 diff --git a/modules/dirname-lgpl b/modules/dirname-lgpl index b919102..b758535 100644 --- a/modules/dirname-lgpl +++ b/modules/dirname-lgpl @@ -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" -- 2.7.4