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

@ -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> 2015-03-30 Corinna Vinschen <corinna@vinschen.de>
* cygheap.h (cygheap_domain_info::add_domain): Add prototype. * cygheap.h (cygheap_domain_info::add_domain): Add prototype.

View File

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

View File

@ -48,6 +48,7 @@
c: means c:\. c: means c:\.
*/ */
#define _BASENAME_DEFINED
#include "winsup.h" #include "winsup.h"
#include "miscfuncs.h" #include "miscfuncs.h"
#include <ctype.h> #include <ctype.h>
@ -4767,6 +4768,33 @@ basename (char *path)
return 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. /* No need to be reentrant or thread-safe according to SUSv3.
/ and \\ are treated equally. Leading drive specifiers and / and \\ are treated equally. Leading drive specifiers and
leading double (back)slashes are kept intact as far as it 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> 2015-03-13 Jon TURNEY <jon.turney@dronecode.org.uk>
* Makefile.in (prefix): Define. * Makefile.in (prefix): Define.

View File

@ -50,7 +50,7 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008).</para>
atoi atoi
atol atol
atoll atoll
basename basename (see chapter "Implementation Notes")
bind bind
bsearch bsearch
btowc btowc
@ -1139,6 +1139,7 @@ also IEEE Std 1003.1-2008 (POSIX.1-2008).</para>
asnprintf asnprintf
asprintf asprintf
asprintf_r asprintf_r
basename (see chapter "Implementation Notes")
canonicalize_file_name canonicalize_file_name
dremf dremf
dup3 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, <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> 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> </sect1>
</chapter> </chapter>