diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 7e925995f..72d15278c 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2015-03-30 Yaakov Selkowitz + + * common.din (__gnu_basename): Export. + * path.cc (__gnu_basename): New function. + 2015-03-30 Corinna Vinschen * cygheap.h (cygheap_domain_info::add_domain): Add prototype. diff --git a/winsup/cygwin/common.din b/winsup/cygwin/common.din index 42098ff30..f14b33107 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 47c687fb7..b05333fd7 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 @@ -4767,6 +4768,33 @@ basename (char *path) return path; } +/* The differences with the POSIX version above: + - declared in (instead of ); + - 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 814e65156..4f923b6e2 100644 --- a/winsup/doc/ChangeLog +++ b/winsup/doc/ChangeLog @@ -1,3 +1,8 @@ +2015-03-30 Yaakov Selkowitz + + * posix.xml (std-gnu): Add basename. + (std-notes): Add note about two forms of basename. + 2015-03-13 Jon TURNEY * Makefile.in (prefix): Define. diff --git a/winsup/doc/posix.xml b/winsup/doc/posix.xml index 5df808b58..95bc4008c 100644 --- a/winsup/doc/posix.xml +++ b/winsup/doc/posix.xml @@ -50,7 +50,7 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008). 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). 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. qsort_r is available in both BSD and GNU flavors, depending on whether _BSD_SOURCE or _GNU_SOURCE is defined when compiling. +basename is available in both POSIX and GNU flavors, +depending on whether libgen.h is included or not. +