Added optional, physical ANY
[yaz-moved-to-github.git] / retrieval / d1_absyn.c
index 92d5f1c..e71dac8 100644 (file)
@@ -4,7 +4,13 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: d1_absyn.c,v $
- * Revision 1.6  1996-05-31 13:52:21  quinn
+ * Revision 1.8  1997-01-02 10:47:59  quinn
+ * Added optional, physical ANY
+ *
+ * Revision 1.7  1996/06/10 08:56:01  quinn
+ * Work on Summary.
+ *
+ * Revision 1.6  1996/05/31  13:52:21  quinn
  * Fixed uninitialized variable for local tags in abstract syntax.
  *
  * Revision 1.5  1996/05/09  07:27:43  quinn
@@ -116,10 +122,11 @@ data1_absyn *data1_read_absyn(char *file)
     char line[512], *r, cmd[512], args[512];
     data1_absyn *res = 0;
     FILE *f;
-    data1_element **ppl[D1_MAX_NESTING];
+    data1_element **ppl[D1_MAX_NESTING], *cur[D1_MAX_NESTING];
     data1_esetname **esetpp;
     data1_maptab **maptabp;
     data1_marctab **marcp;
+    data1_termlist *all = 0;
     int level = 0;
 
     if (!(f = yaz_path_fopen(data1_tabpath, file, "r")))
@@ -142,6 +149,7 @@ data1_absyn *data1_read_absyn(char *file)
     marcp = &res->marc;
     res->elements = 0;
     ppl[0] = &res->elements;
+    cur[0] = 0;
     esetpp = &res->esetnames;
 
     for (;;)
@@ -168,7 +176,7 @@ data1_absyn *data1_read_absyn(char *file)
            int type, value;
            data1_termlist **tp;
 
-           if (sscanf(args, "%s %s %s", path, name, termlists) < 3)
+           if (sscanf(args, "%511s %511s %511s", path, name, termlists) < 3)
            {
                logf(LOG_WARN, "Bad # of args to elm in %s: '%s'", 
                    file, args);
@@ -187,16 +195,17 @@ data1_absyn *data1_read_absyn(char *file)
            }
            if (i > level + 1)
            {
-               logf(LOG_WARN, "Bad level inc in %s in '%'", file, args);
+               logf(LOG_WARN, "Bad level inc in %s in '%s'", file, args);
                fclose(f);
                return 0;
            }
            level = i;
-           if (!(new = *ppl[level] = xmalloc(sizeof(*new))))
+           if (!(new = cur[level] = *ppl[level] = xmalloc(sizeof(*new))))
                abort;
            new->next = new->children = 0;
            new->tag = 0;
            new->termlists = 0;
+           new->parent = level ? cur[level - 1] : 0;
            tp = &new->termlists;
            ppl[level] = &new->next;
            ppl[level+1] = &new->children;
@@ -286,9 +295,63 @@ data1_absyn *data1_read_absyn(char *file)
                }
                while ((p = strchr(p, ',')) && *(++p));
            }
+           *tp = all; /* append any ALL entries to the list */
 
            new->name = xstrdup(name);
        }
+       else if (!strcmp(cmd, "all"))
+       {
+           char *p;
+           data1_termlist **tp = &all;
+
+           if (all)
+           {
+               logf(LOG_WARN, "Too many ALL declarations in %s - ignored",
+                   file);
+               continue;
+           }
+
+           p = args;
+           if (!res->attset)
+           {
+               logf(LOG_WARN, "No attset loaded in %s", file);
+               fclose(f);
+               return 0;
+           }
+           do
+           {
+               char attname[512], structure[512];
+               int r;
+
+               if (!(r = sscanf(p, "%511[^:,]:%511[^,]", attname,
+                   structure)))
+               {
+                   logf(LOG_WARN, "Syntax error in termlistspec in %s",
+                       file);
+                   fclose(f);
+                   return 0;
+               }
+               *tp = xmalloc(sizeof(**tp));
+               if (!((*tp)->att = data1_getattbyname(res->attset,
+                   attname)))
+               {
+                   logf(LOG_WARN, "Couldn't find att '%s' in attset",
+                       attname);
+                   fclose(f);
+                   return 0;
+               }
+               if (r < 2) /* is the structure qualified? */
+                   (*tp)->structure = DATA1S_word;
+               else if (!data1_matchstr(structure, "w"))
+                   (*tp)->structure = DATA1S_word;
+               else if (!data1_matchstr(structure, "p"))
+                   (*tp)->structure = DATA1S_phrase;
+
+               (*tp)->next = 0;
+               tp = &(*tp)->next;
+           }
+           while ((p = strchr(p, ',')) && *(++p));
+       }
        else if (!strcmp(cmd, "name"))
        {
            char name[512];