X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=util%2Ftpath.c;fp=util%2Ftpath.c;h=b8f07946a3244d52c339e6b84ddcbbc79d7dc13f;hp=1f3751476c03842b4413d99044131b9d94e420df;hb=98f0cc2d7eeed27912edb88bf16512bb622b19ee;hpb=a45657fa0bf44a3064c4a42aad9d584b54891ecb diff --git a/util/tpath.c b/util/tpath.c index 1f37514..b8f0794 100644 --- a/util/tpath.c +++ b/util/tpath.c @@ -1,37 +1,30 @@ /* - * Copyright (c) 1995-2000, Index Data. + * Copyright (c) 1995-2002, Index Data. * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * - * $Log: tpath.c,v $ - * Revision 1.5 2000-12-05 19:03:19 adam - * WIN32 fixes for drive specifications. - * - * Revision 1.4 2000/02/29 13:44:55 adam - * Check for config.h (currently not generated). - * - * Revision 1.3 1999/11/30 13:47:12 adam - * Improved installation. Moved header files to include/yaz. - * - * Revision 1.2 1996/10/29 13:36:26 adam - * Added header. - * - * Revision 1.1 1995/11/01 16:35:00 quinn - * Making data1 look for tables in data1_tabpath - * - * + * $Id: tpath.c,v 1.6 2002-04-04 20:49:46 adam Exp $ */ #if HAVE_CONFIG_H #include #endif + #include #include +#include #include +#include FILE *yaz_path_fopen(const char *path, const char *name, const char *mode) { - char spath[512]; + return yaz_path_fopen_base (path, name, mode, 0); +} + +FILE *yaz_path_fopen_base(const char *path, const char *name, const char *mode, + const char *base) +{ + char spath[1024]; for(;;) { @@ -39,7 +32,9 @@ FILE *yaz_path_fopen(const char *path, const char *name, const char *mode) const char *path_sep = 0; size_t len = 0; + size_t slen = 0; + *spath = '\0'; if (path) { /* somewhat dirty since we have to consider Windows @@ -55,22 +50,37 @@ FILE *yaz_path_fopen(const char *path, const char *name, const char *mode) len = path_sep - path; else len = strlen(path); - if (len > 255) - len = 255; - memcpy (spath, path, len); - if (!strchr("/\\", spath[len-1])) + if (!strchr ("/\\", *path) && base) { - strcpy (spath+len, "/"); - len++; + strcpy (spath, base); + slen = strlen(spath); + spath[slen++] = '/'; } + memcpy (spath+slen, path, len); + slen += len; + if (!strchr("/\\", spath[slen-1])) + spath[slen++] = '/'; } - sprintf (spath+len, "%.255s", name); + strcpy (spath+slen, name); if ((f = fopen(spath, mode))) return f; - + if (!path_sep) break; path = path_sep+1; } return 0; } + +int yaz_is_abspath (const char *p) +{ + if (*p == '/') + return 1; +#ifdef WIN32 + if (*p == '\\') + return 1; + if (*p && p[1] == ':' && isalpha(*p)) + return 1; +#endif + return 0; +}