diff options
author | Bruno Haible <bruno@clisp.org> | 2003-02-13 21:14:41 +0000 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2009-06-23 12:09:08 +0200 |
commit | c6750b970b87aaeb6a6a805c9181f6d81222f1f3 (patch) | |
tree | f2b1ff86bd94389371ef7ac6fc55ef0e5b7321a5 /gettext-tools/lib/basename.c | |
parent | 6866c108f7cd9d9efaa08ec4372e3597c5ca0f19 (diff) | |
download | external_gettext-c6750b970b87aaeb6a6a805c9181f6d81222f1f3.zip external_gettext-c6750b970b87aaeb6a6a805c9181f6d81222f1f3.tar.gz external_gettext-c6750b970b87aaeb6a6a805c9181f6d81222f1f3.tar.bz2 |
Move lib/basename.c to gettext-runtime/lib/basename.c and gettext-tools/lib/basename.c.
Diffstat (limited to 'gettext-tools/lib/basename.c')
-rw-r--r-- | gettext-tools/lib/basename.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/gettext-tools/lib/basename.c b/gettext-tools/lib/basename.c new file mode 100644 index 0000000..5c58941 --- /dev/null +++ b/gettext-tools/lib/basename.c @@ -0,0 +1,88 @@ +/* Return the name-within-directory of a file name. + Copyright (C) 1996-1999, 2000-2002 Free Software Foundation, Inc. + + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@gnu.org. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +/* Specification. */ +#include "basename.h" + +#if !(__GLIBC__ >= 2) + +#include <stdio.h> +#include <assert.h> + +#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ + /* Win32, OS/2, DOS */ +# define HAS_DEVICE(P) \ + ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ + && (P)[1] == ':') +# define FILESYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0) +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#endif + +#ifndef FILESYSTEM_PREFIX_LEN +# define FILESYSTEM_PREFIX_LEN(Filename) 0 +#endif + +#ifndef ISSLASH +# define ISSLASH(C) ((C) == '/') +#endif + +#ifndef _LIBC +/* We cannot generally use the name `basename' since XPG defines an unusable + variant of the function but we cannot use it. */ +# undef basename +# define basename gnu_basename +#endif + +/* In general, we can't use the builtin `basename' function if available, + since it has different meanings in different environments. + In some environments the builtin `basename' modifies its argument. + If NAME is all slashes, be sure to return `/'. */ + +char * +basename (char const *name) +{ + char const *base = name += FILESYSTEM_PREFIX_LEN (name); + int all_slashes = 1; + char const *p; + + for (p = name; *p; p++) + { + if (ISSLASH (*p)) + base = p + 1; + else + all_slashes = 0; + } + + /* If NAME is all slashes, arrange to return `/'. */ + if (*base == '\0' && ISSLASH (*name) && all_slashes) + --base; + + /* Make sure the last byte is not a slash. */ + assert (all_slashes || !ISSLASH (*(p - 1))); + + return (char *) base; +} + +#endif |