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.
This commit is contained in:
Yaakov Selkowitz
2015-03-26 00:20:15 -05:00
committed by Corinna Vinschen
parent d67052321e
commit 75d5f68aab
5 changed files with 44 additions and 1 deletions

View File

@ -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