* Sebastian Hammer, Adam Dickmeiss
*
* $Log: d1_absyn.c,v $
- * Revision 1.5 1996-05-09 07:27:43 quinn
+ * Revision 1.9 1997-02-19 14:46:15 adam
+ * The "all" specifier only affects elements that are indexed (and not
+ * all elements).
+ *
+ * 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
* Multiple local attributes values supported.
*
* Revision 1.4 1996/05/01 12:45:28 quinn
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")))
marcp = &res->marc;
res->elements = 0;
ppl[0] = &res->elements;
+ cur[0] = 0;
esetpp = &res->esetnames;
for (;;)
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);
}
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;
nt->names->name = nt->value.string;
nt->names->next = 0;
nt->kind = DATA1K_string;
+ nt->next = 0;
+ nt->tagset = 0;
}
else
{
tp = &(*tp)->next;
}
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];