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
parent 779ddb0b48
commit 1f9716e160
5 changed files with 44 additions and 1 deletions

View File

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

View File

@ -61,6 +61,7 @@ __fsetlocking SIGFE
__fwritable NOSIGFE
__fwriting NOSIGFE
__getreent NOSIGFE
__gnu_basename NOSIGFE
__infinity NOSIGFE
__isinfd NOSIGFE
__isinff NOSIGFE

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

View File

@ -1,3 +1,8 @@
2015-03-30 Yaakov Selkowitz <yselkowi@redhat.com>
* posix.xml (std-gnu): Add basename.
(std-notes): Add note about two forms of basename.
2015-03-13 Jon TURNEY <jon.turney@dronecode.org.uk>
* Makefile.in (prefix): Define.

View File

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