From 24e8fc6872a3bceb43575edde8f221d8838186bb Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Tue, 22 Feb 2005 19:45:41 +0000 Subject: [PATCH] * 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. --- winsup/cygwin/ChangeLog | 9 +++ winsup/cygwin/cygwin.din | 2 + winsup/cygwin/include/cygwin/version.h | 3 +- winsup/cygwin/include/libgen.h | 23 +++++++ winsup/cygwin/path.cc | 85 ++++++++++++++++++++++++++ 5 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 winsup/cygwin/include/libgen.h diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 1752775cb..9aec7efa0 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,12 @@ +2005-02-22 Corinna Vinschen + + * 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 * select.cc (peek_pipe): Disable new pipe code until there's diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din index fe4730ed8..877a544dc 100644 --- a/winsup/cygwin/cygwin.din +++ b/winsup/cygwin/cygwin.din @@ -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 diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index cb1294f0a..fac4ea2ea 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -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 index 000000000..f5c24a8cc --- /dev/null +++ b/winsup/cygwin/include/libgen.h @@ -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 + +__BEGIN_DECLS + +extern char *basename (char *path); +extern char *dirname (char *path); + +__END_DECLS + +#endif /* _LIBGEN_H */ diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index c7f8721bd..0615077b8 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -53,6 +53,7 @@ details. */ #include #include #include +#include #include #include #include @@ -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; +} -- 2.43.5