diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-17 21:41:51 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-17 21:41:51 +0000 |
commit | 487ca4806cc046076293cf6cc5fbba0db282bac7 (patch) | |
tree | 847b412ab5158dd7bdd7ed7e5a4cc3fbca94be32 /Build/source/texk/kpathsea/xdirname.c | |
parent | a3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (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.c | 121 |
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: +*/ + |