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.
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
#include <sys/mount.h>
#include <mntent.h>
#include <unistd.h>
+#include <libgen.h>
#include <ctype.h>
#include <winioctl.h>
#include <wingdi.h>
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;
+}