Directive s=pw sets structure to phrase if term includes blank(s).
[yaz-moved-to-github.git] / util / tpath.c
index 58774b0..1f37514 100644 (file)
@@ -1,10 +1,19 @@
 /*
- * Copyright (c) 1995, Index Data.
+ * Copyright (c) 1995-2000, Index Data.
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: tpath.c,v $
- * Revision 1.2  1996-10-29 13:36:26  adam
+ * 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
  *
  *
  */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
 
 #include <stdio.h>
 #include <string.h>
-#include <tpath.h>
+#include <yaz/tpath.h>
 
 FILE *yaz_path_fopen(const char *path, const char *name, const char *mode)
 {
-    char spath[512] = "";
+    char spath[512];
 
-    if (!path)
-       return fopen(name, mode);
-
-    do
+    for(;;)
     {
        FILE *f;
 
-       if (sscanf(path, "%511[^:]", spath) < 1)
-           return 0;
-       sprintf(spath + strlen(spath), "/%s", name);
+        const char *path_sep = 0;
+        size_t len = 0;
+        
+        if (path)
+        {
+            /* somewhat dirty since we have to consider Windows
+             * drive letters..
+             */
+            if (strchr ("/\\.", *path))
+            {
+                path_sep = strchr (path+1, ':');
+            }
+            else if (path[0] && path[1])
+                path_sep = strchr (path+2, ':');
+            if (path_sep)
+                len = path_sep - path;
+            else
+                len = strlen(path);
+            if (len > 255)
+                len = 255;
+            memcpy (spath, path, len);
+            if (!strchr("/\\", spath[len-1]))
+            {
+                strcpy (spath+len, "/");
+                len++;
+            }
+        }
+        sprintf (spath+len, "%.255s", name);
        if ((f = fopen(spath, mode)))
            return f;
-       if ((path = strchr(path, ':')))
-           path++;
+
+        if (!path_sep)
+            break;
+        path = path_sep+1;
     }
-    while (path);
     return 0;
 }