* 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.
This commit is contained in:
Corinna Vinschen 2005-02-22 19:45:41 +00:00
parent 156d93af29
commit 24e8fc6872
5 changed files with 121 additions and 1 deletions

View File

@ -1,3 +1,12 @@
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> 2005-02-22 Corinna Vinschen <corinna@vinschen.de>
* select.cc (peek_pipe): Disable new pipe code until there's * select.cc (peek_pipe): Disable new pipe code until there's

View File

@ -210,6 +210,7 @@ _atoi = atoi NOSIGFE
atol NOSIGFE atol NOSIGFE
_atol = atol NOSIGFE _atol = atol NOSIGFE
atoll NOSIGFE atoll NOSIGFE
basename SIGFE
bcmp NOSIGFE bcmp NOSIGFE
_bcmp = bcmp NOSIGFE _bcmp = bcmp NOSIGFE
bcopy NOSIGFE bcopy NOSIGFE
@ -369,6 +370,7 @@ difftime NOSIGFE
_difftime = difftime NOSIGFE _difftime = difftime NOSIGFE
dirfd SIGFE dirfd SIGFE
_dirfd = dirfd SIGFE _dirfd = dirfd SIGFE
dirname SIGFE
div NOSIGFE div NOSIGFE
_div = div NOSIGFE _div = div NOSIGFE
dlclose SIGFE dlclose SIGFE

View File

@ -247,12 +247,13 @@ details. */
117: Export utmpx functions, Return utmp * from pututent. 117: Export utmpx functions, Return utmp * from pututent.
118: Export getpriority, setpriority. 118: Export getpriority, setpriority.
119: Export fdatasync. 119: Export fdatasync.
120: Export basename, dirname.
*/ */
/* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */
#define CYGWIN_VERSION_API_MAJOR 0 #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 /* There is also a compatibity version number associated with the
shared memory regions. It is incremented when incompatible shared memory regions. It is incremented when incompatible

View File

@ -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 */

View File

@ -53,6 +53,7 @@ details. */
#include <sys/mount.h> #include <sys/mount.h>
#include <mntent.h> #include <mntent.h>
#include <unistd.h> #include <unistd.h>
#include <libgen.h>
#include <ctype.h> #include <ctype.h>
#include <winioctl.h> #include <winioctl.h>
#include <wingdi.h> #include <wingdi.h>
@ -3930,3 +3931,87 @@ etc::file_changed (int n)
paranoid_printf ("fn[%d] %s res %d", n, fn[n], res); paranoid_printf ("fn[%d] %s res %d", n, fn[n], res);
return 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;
}