summaryrefslogtreecommitdiffstats
path: root/gettext-tools/lib/basename.c
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2003-02-13 21:14:41 +0000
committerBruno Haible <bruno@clisp.org>2009-06-23 12:09:08 +0200
commitc6750b970b87aaeb6a6a805c9181f6d81222f1f3 (patch)
treef2b1ff86bd94389371ef7ac6fc55ef0e5b7321a5 /gettext-tools/lib/basename.c
parent6866c108f7cd9d9efaa08ec4372e3597c5ca0f19 (diff)
downloadexternal_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.c88
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