Multiple registers (alpha early)
[idzebra-moved-to-github.git] / bfile / mfile.c
index 6afd611..794d529 100644 (file)
@@ -4,7 +4,18 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: mfile.c,v $
- * Revision 1.39  2000-05-05 13:48:03  adam
+ * Revision 1.42  2002-04-04 14:14:13  adam
+ * Multiple registers (alpha early)
+ *
+ * Revision 1.41  2000/11/29 14:24:01  adam
+ * Script configure uses yaz pthreads options. Added locking for
+ * zebra_register_{lock,unlock}.
+ *
+ * Revision 1.40  2000/10/17 12:37:09  adam
+ * Fixed notification of live-updates. Fixed minor problem with mf_init
+ * where it didn't handle shadow area file names correctly.
+ *
+ * Revision 1.39  2000/05/05 13:48:03  adam
  * Fixed locking for metafiles.
  *
  * Revision 1.38  2000/03/20 19:08:35  adam
 #include <zebrautl.h>
 #include <mfile.h>
 
-static int scan_areadef(MFile_area ma, const char *name, const char *ad)
+static int scan_areadef(MFile_area ma, const char *ad, const char *base)
 {
     /*
      * If no definition is given, use current directory, unlimited.
@@ -160,7 +171,7 @@ static int scan_areadef(MFile_area ma, const char *name, const char *ad)
     mf_dir **dp = &ma->dirs, *dir = *dp;
 
     if (!ad)
-       ad = ".:-1b";
+        ad = ".:-1b";
     for (;;)
     {
         const char *ad0 = ad;
@@ -171,6 +182,12 @@ static int scan_areadef(MFile_area ma, const char *name, const char *ad)
             ad++;
         if (!*ad)
             break;
+        if (!zebra_is_abspath(ad) && base)
+        {
+            strcpy (dirname, base);
+            i = strlen(dirname);
+            dirname[i++] = '/';
+        }
         while (*ad)
         {
            if (*ad == ':' && strchr ("+-0123456789", ad[1]))
@@ -275,7 +292,7 @@ static int cmp_part_file(const void *p1, const void *p2)
  * Create a new area, cotaining metafiles in directories.
  * Find the part-files in each directory, and inventory the existing metafiles.
  */
-MFile_area mf_init(const char *name, const char *spec)
+MFile_area mf_init(const char *name, const char *spec, const char *base)
 {
     MFile_area ma = (MFile_area) xmalloc(sizeof(*ma));
     mf_dir *dirp;
@@ -290,7 +307,7 @@ MFile_area mf_init(const char *name, const char *spec)
     strcpy(ma->name, name);
     ma->mfiles = 0;
     ma->dirs = 0;
-    if (scan_areadef(ma, name, spec) < 0)
+    if (scan_areadef(ma, spec, base) < 0)
     {
        logf (LOG_WARN, "Failed to access description of '%s'", name);
        return 0;
@@ -307,13 +324,16 @@ MFile_area mf_init(const char *name, const char *spec)
        /* look at each file */
        while ((dent = readdir(dd)))
        {
-           if (*dent->d_name == '.')
-               continue;
-           if (sscanf(dent->d_name, "%[^-]-%d.mf", metaname, &number) != 2)
-           {
-               logf (LOG_DEBUG, "bf: %s is not a part-file.", dent->d_name);
-               continue;
-           }
+           int len = strlen(dent->d_name);
+           const char *cp = strrchr (dent->d_name, '-');
+           if (strchr (".-", *dent->d_name))
+               continue;
+           if (len < 5 || !cp || strcmp (dent->d_name + len - 3, ".mf"))
+               continue;
+           number = atoi(cp+1);
+           memcpy (metaname, dent->d_name, cp - dent->d_name);
+           metaname[ cp - dent->d_name] = '\0';
+
            for (meta_f = ma->mfiles; meta_f; meta_f = meta_f->next)
            {
                /* known metafile */