diff options
Diffstat (limited to 'winsup/cygwin')
-rw-r--r-- | winsup/cygwin/ChangeLog | 5 | ||||
-rw-r--r-- | winsup/cygwin/common.din | 1 | ||||
-rw-r--r-- | winsup/cygwin/path.cc | 28 |
3 files changed, 34 insertions, 0 deletions
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 <yselkowi@redhat.com> + + * common.din (__gnu_basename): Export. + * path.cc (__gnu_basename): New function. + 2015-03-30 Corinna Vinschen <corinna@vinschen.de> * 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 <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 |