https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=75d5f68aabf62c42884ff935f888b12bbcd00001
commit 75d5f68aabf62c42884ff935f888b12bbcd00001 Author: Yaakov Selkowitz <yselk...@redhat.com> Date: Thu Mar 26 00:20:15 2015 -0500 cygwin: add GNU basename(3) winsup/cygwin/ * common.din (__gnu_basename): Export. * path.cc (__gnu_basename): New function. winsup/doc/ * posix.xml (std-gnu): Add basename. (std-notes): Add note about two forms of basename. Diff: --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/common.din | 1 + winsup/cygwin/path.cc | 28 ++++++++++++++++++++++++++++ winsup/doc/ChangeLog | 5 +++++ winsup/doc/posix.xml | 6 +++++- 5 files changed, 44 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 7e92599..72d1527 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2015-03-30 Yaakov Selkowitz <yselk...@redhat.com> + + * common.din (__gnu_basename): Export. + * path.cc (__gnu_basename): New function. + 2015-03-30 Corinna Vinschen <cori...@vinschen.de> * cygheap.h (cygheap_domain_info::add_domain): Add prototype. diff --git a/winsup/cygwin/common.din b/winsup/cygwin/common.din index 42098ff..f14b331 100644 --- a/winsup/cygwin/common.din +++ b/winsup/cygwin/common.din @@ -61,6 +61,7 @@ __fsetlocking SIGFE __fwritable NOSIGFE __fwriting NOSIGFE __getreent NOSIGFE +__gnu_basename NOSIGFE __infinity NOSIGFE __isinfd NOSIGFE __isinff NOSIGFE diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 47c687f..b05333f 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -48,6 +48,7 @@ c: means c:\. */ +#define _BASENAME_DEFINED #include "winsup.h" #include "miscfuncs.h" #include <ctype.h> @@ -4767,6 +4768,33 @@ basename (char *path) return path; } +/* The differences with the POSIX version above: + - declared in <string.h> (instead of <libgen.h>); + - the argument is never modified, and therefore is marked const; + - the empty string is returned if path is an empty string, "/", or ends + with a trailing slash. */ +extern "C" char * +__gnu_basename (const char *path) +{ + static char buf[1]; + char *c, *d, *bs = (char *)path; + + if (!path || !*path) + return strcpy (buf, ""); + if (isalpha (path[0]) && path[1] == ':') + bs += 2; + else if (strspn (path, "/\\") > 1) + ++bs; + c = strrchr (bs, '/'); + if ((d = strrchr (c ?: bs, '\\')) > c) + c = d; + if (c) + return c + 1; + else if (!bs[0]) + return strcpy (buf, ""); + return (char *)path; +} + /* No need to be reentrant or thread-safe according to SUSv3. / and \\ are treated equally. Leading drive specifiers and leading double (back)slashes are kept intact as far as it diff --git a/winsup/doc/ChangeLog b/winsup/doc/ChangeLog index 814e651..4f923b6 100644 --- a/winsup/doc/ChangeLog +++ b/winsup/doc/ChangeLog @@ -1,3 +1,8 @@ +2015-03-30 Yaakov Selkowitz <yselk...@redhat.com> + + * posix.xml (std-gnu): Add basename. + (std-notes): Add note about two forms of basename. + 2015-03-13 Jon TURNEY <jon.tur...@dronecode.org.uk> * Makefile.in (prefix): Define. diff --git a/winsup/doc/posix.xml b/winsup/doc/posix.xml index 5df808b..95bc400 100644 --- a/winsup/doc/posix.xml +++ b/winsup/doc/posix.xml @@ -50,7 +50,7 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008).</para> atoi atol atoll - basename + basename (see chapter "Implementation Notes") bind bsearch btowc @@ -1139,6 +1139,7 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008).</para> asnprintf asprintf asprintf_r + basename (see chapter "Implementation Notes") canonicalize_file_name dremf dup3 @@ -1603,6 +1604,9 @@ group quotas, no inode quotas, no time constraints.</para> <para><function>qsort_r</function> is available in both BSD and GNU flavors, depending on whether _BSD_SOURCE or _GNU_SOURCE is defined when compiling.</para> +<para><function>basename</function> is available in both POSIX and GNU flavors, +depending on whether libgen.h is included or not.</para> + </sect1> </chapter>