OSDN Git Service

* cygwin.din (basename): Export.
authorcorinna <corinna>
Tue, 22 Feb 2005 19:45:38 +0000 (19:45 +0000)
committercorinna <corinna>
Tue, 22 Feb 2005 19:45:38 +0000 (19:45 +0000)
(dirname): Export.
* path.cc (basename): New function.
(dirname): New function.
* include/libgen.h: New file.
* include/cygwin/version.h: Bump API minor version.

winsup/cygwin/ChangeLog
winsup/cygwin/cygwin.din
winsup/cygwin/include/cygwin/version.h
winsup/cygwin/include/libgen.h [new file with mode: 0644]
winsup/cygwin/path.cc

index 1752775..9aec7ef 100644 (file)
@@ -1,5 +1,14 @@
 2005-02-22  Corinna Vinschen  <corinna@vinschen.de>
 
+       * cygwin.din (basename): Export.
+       (dirname): Export.
+       * path.cc (basename): New function.
+       (dirname): New function.
+       * include/libgen.h: New file.
+       * include/cygwin/version.h: Bump API minor version.
+
+2005-02-22  Corinna Vinschen  <corinna@vinschen.de>
+
        * select.cc (peek_pipe): Disable new pipe code until there's
        a working substitute.
 
index fe4730e..877a544 100644 (file)
@@ -210,6 +210,7 @@ _atoi = atoi NOSIGFE
 atol NOSIGFE
 _atol = atol NOSIGFE
 atoll NOSIGFE
+basename SIGFE
 bcmp NOSIGFE
 _bcmp = bcmp NOSIGFE
 bcopy NOSIGFE
@@ -369,6 +370,7 @@ difftime NOSIGFE
 _difftime = difftime NOSIGFE
 dirfd SIGFE
 _dirfd = dirfd SIGFE
+dirname SIGFE
 div NOSIGFE
 _div = div NOSIGFE
 dlclose SIGFE
index cb1294f..fac4ea2 100644 (file)
@@ -247,12 +247,13 @@ details. */
       117: Export utmpx functions, Return utmp * from pututent.
       118: Export getpriority, setpriority.
       119: Export fdatasync.
+      120: Export basename, dirname.
      */
 
      /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
 
 #define CYGWIN_VERSION_API_MAJOR 0
-#define CYGWIN_VERSION_API_MINOR 119
+#define CYGWIN_VERSION_API_MINOR 120
 
      /* There is also a compatibity version number associated with the
        shared memory regions.  It is incremented when incompatible
diff --git a/winsup/cygwin/include/libgen.h b/winsup/cygwin/include/libgen.h
new file mode 100644 (file)
index 0000000..f5c24a8
--- /dev/null
@@ -0,0 +1,23 @@
+/* libgen.h
+
+   Copyright 2005 Red Hat, Inc.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef _LIBGEN_H
+#define _LIBGEN_H
+
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+
+extern char *basename (char *path);
+extern char *dirname (char *path);
+
+__END_DECLS
+
+#endif /* _LIBGEN_H */
index c7f8721..0615077 100644 (file)
@@ -53,6 +53,7 @@ details. */
 #include <sys/mount.h>
 #include <mntent.h>
 #include <unistd.h>
+#include <libgen.h>
 #include <ctype.h>
 #include <winioctl.h>
 #include <wingdi.h>
@@ -3930,3 +3931,87 @@ etc::file_changed (int n)
   paranoid_printf ("fn[%d] %s res %d", n, fn[n], res);
   return res;
 }
+
+/* No need to be reentrant or thread-safe according to SUSv3.
+   / and \\ are treated equally.  Leading drive specifiers are
+   kept intact as far as it makes sense.  Everything else is
+   POSIX compatible. */
+extern "C" char *
+basename (char *path)
+{
+  static char buf[CYG_MAX_PATH + 1];
+  char *c, *d, *bs = buf;
+
+  if (!path || !*path)
+    return strcpy (buf, ".");
+  strncpy (buf, path, CYG_MAX_PATH);
+  if (isalpha (buf[0]) && buf[1] == ':')
+    bs += 2;
+  else if (strspn (buf, "/\\") > 1)
+    ++bs;
+  c = strrchr (bs, '/');
+  if ((d = strrchr (c ?: bs, '\\')) > c)
+    c = d;
+  if (c)
+    {
+      /* Trailing (back)slashes are eliminated. */
+      while (c && c > bs && c[1] == '\0')
+        {
+         *c = '\0';
+         c = strrchr (bs, '/');
+         if ((d = strrchr (c ?: bs, '\\')) > c)
+           c = d;
+       }
+      if (c && (c > bs || c[1]))
+       return c + 1;
+    }
+  else if (!bs[0])
+    strcpy (bs, ".");
+  return buf;
+}
+
+/* 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
+   makes sense.  Everything else is POSIX compatible. */
+extern "C" char *
+dirname (char *path)
+{
+  static char buf[CYG_MAX_PATH + 1];
+  char *c, *d, *bs = buf;
+
+  if (!path || !*path)
+    return strcpy (buf, ".");
+  strncpy (buf, path, CYG_MAX_PATH);
+  if (isalpha (buf[0]) && buf[1] == ':')
+    bs += 2;
+  else if (strspn (buf, "/\\") > 1)
+    ++bs;
+  c = strrchr (bs, '/');
+  if ((d = strrchr (c ?: bs, '\\')) > c)
+    c = d;
+  if (c)
+    {
+      /* Trailing (back)slashes are eliminated. */
+      while (c && c > bs && c[1] == '\0')
+        {
+         *c = '\0';
+         c = strrchr (bs, '/');
+         if ((d = strrchr (c ?: bs, '\\')) > c)
+           c = d;
+       }
+      if (!c)
+        strcpy (bs, ".");
+      else if (c > bs)
+       {
+         /* More trailing (back)slashes are eliminated. */
+         while (c > bs && (*c == '/' || *c == '\\'))
+           *c-- = '\0';
+        }
+      else
+        c[1] = '\0';
+    }
+  else
+    strcpy (bs, ".");
+  return buf;
+}