]> sourceware.org Git - newlib-cygwin.git/commitdiff
cygwin: add GNU basename(3)
authorYaakov Selkowitz <yselkowi@redhat.com>
Thu, 26 Mar 2015 05:20:15 +0000 (00:20 -0500)
committerCorinna Vinschen <corinna@vinschen.de>
Thu, 23 Apr 2015 19:57:08 +0000 (21:57 +0200)
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.

winsup/cygwin/ChangeLog
winsup/cygwin/common.din
winsup/cygwin/path.cc
winsup/doc/ChangeLog
winsup/doc/posix.xml

index 7e925995f0869068c64e903f59fc64a4da220264..72d15278ca49bbd874146bb049ee5b93175a7493 100644 (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.
index 42098ff3028114c4d03f40c198f94414d30c16b6..f14b33107a8a38e38c8b11ae9e19ed567c880bd9 100644 (file)
@@ -61,6 +61,7 @@ __fsetlocking SIGFE
 __fwritable NOSIGFE
 __fwriting NOSIGFE
 __getreent NOSIGFE
+__gnu_basename NOSIGFE
 __infinity NOSIGFE
 __isinfd NOSIGFE
 __isinff NOSIGFE
index 47c687fb79ddb2d465dc4b62c932a6b1e296d481..b05333fd74bb10acc76753df10cd86bf195734a6 100644 (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
index 814e65156b2f5d5bda94e1c96c9d1789d85d671b..4f923b6e2fe3061fd4453fb5e10e3c8452ab298f 100644 (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.
index 5df808b586c876f2c10606280e10d29331090937..95bc4008ca8269f58c3b05e035e24d6b67628c14 100644 (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>
This page took 0.045404 seconds and 5 git commands to generate.