summaryrefslogtreecommitdiff
path: root/Build/source/texk/kpathsea/xdirname.c
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-17 21:41:51 +0000
committerKarl Berry <karl@freefriends.org>2006-01-17 21:41:51 +0000
commit487ca4806cc046076293cf6cc5fbba0db282bac7 (patch)
tree847b412ab5158dd7bdd7ed7e5a4cc3fbca94be32 /Build/source/texk/kpathsea/xdirname.c
parenta3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (diff)
texk 1
git-svn-id: svn://tug.org/texlive/trunk@1485 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/kpathsea/xdirname.c')
-rw-r--r--Build/source/texk/kpathsea/xdirname.c121
1 files changed, 121 insertions, 0 deletions
diff --git a/Build/source/texk/kpathsea/xdirname.c b/Build/source/texk/kpathsea/xdirname.c
new file mode 100644
index 00000000000..4a9e0a9808d
--- /dev/null
+++ b/Build/source/texk/kpathsea/xdirname.c
@@ -0,0 +1,121 @@
+/* xdirname.c: return the directory part of a path.
+
+ Copyright 2005 Olaf Weber.
+ Copyright 1999 Karl Berry.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+/* Return directory for NAME. This is "." if NAME contains no directory
+ separators (should never happen for selfdir), else whatever precedes
+ the final directory separator, but with multiple separators stripped.
+ For example, `xdirname ("/foo//bar.baz")' returns "/foo". Always
+ return a new string. */
+
+#include <kpathsea/config.h>
+#include <kpathsea/c-pathch.h>
+
+string
+xdirname P1C(const_string, name)
+{
+ string ret;
+ unsigned limit = 0, loc;
+
+ /* Ignore a NULL name. */
+ if (!name)
+ return NULL;
+
+ if (NAME_BEGINS_WITH_DEVICE(name)) {
+ limit = 2;
+#if defined(WIN32) || defined(__CYGWIN__)
+ } else if (IS_UNC_NAME(name)) {
+ for (limit = 2; name[limit] && !IS_DIR_SEP(name[limit]); limit++)
+ ;
+ if (name[limit]) {
+ for (limit++ ; name[limit] && !IS_DIR_SEP(name[limit]); limit++)
+ ;
+ limit--;
+ } else {
+ /* malformed UNC name, backup */
+ limit = 2;
+ }
+#endif
+ }
+
+ for (loc = strlen (name); loc > limit && !IS_DIR_SEP (name[loc-1]); loc--)
+ ;
+
+ if (loc == limit && limit > 0) {
+ if (limit == 2) {
+ ret = (string)xmalloc(limit + 2);
+ ret[0] = name[0];
+ ret[1] = name[1];
+ ret[2] = '.';
+ ret[3] = '\0';
+ } else {
+ ret = (string)xmalloc(limit + 2);
+ strcpy(ret, name);
+ }
+ } else {
+ /* If have ///a, must return /, so don't strip off everything. */
+ while (loc > limit+1 && IS_DIR_SEP (name[loc-1])) {
+ loc--;
+ }
+ ret = (string)xmalloc(loc+1);
+ strncpy(ret, name, loc);
+ ret[loc] = '\0';
+ }
+
+ return ret;
+}
+
+#ifdef TEST
+
+char *tab[] = {
+ "\\\\neuromancer\\fptex\\bin\\win32\\kpsewhich.exe",
+ "\\\\neuromancer\\fptex\\win32\\kpsewhich.exe",
+ "\\\\neuromancer\\fptex\\kpsewhich.exe",
+ "\\\\neuromancer\\kpsewhich.exe",
+ "p:\\bin\\win32\\kpsewhich.exe",
+ "p:\\win32\\kpsewhich.exe",
+ "p:\\kpsewhich.exe",
+ "p:bin\\win32\\kpsewhich.exe",
+ "p:win32\\kpsewhich.exe",
+ "p:kpsewhich.exe",
+ "p:///kpsewhich.exe",
+ "/usr/bin/win32/kpsewhich.exe",
+ "/usr/bin/kpsewhich.exe",
+ "/usr/kpsewhich.exe",
+ "///usr/kpsewhich.exe",
+ "///kpsewhich.exe",
+ NULL
+};
+
+int main()
+{
+ char **p;
+ for (p = tab; *p; p++)
+ printf("name %s, dirname %s\n", *p, xdirname(*p));
+ return 0;
+}
+#endif /* TEST */
+
+
+/*
+Local variables:
+standalone-compile-command: "gcc -g -I. -I.. -DTEST variable.c kpathsea.a"
+End:
+*/
+