New functions yaz_is_abspath, yaz_path_fopen_base
[yaz-moved-to-github.git] / util / tpath.c
index 1f37514..b8f0794 100644 (file)
@@ -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 <config.h>
 #endif
 
+
 #include <stdio.h>
 #include <string.h>
+#include <ctype.h>
 #include <yaz/tpath.h>
+#include <yaz/log.h>
 
 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;
+}