* Sebastian Hammer, Adam Dickmeiss
*
* $Log: d1_absyn.c,v $
- * Revision 1.7 1996-06-10 08:56:01 quinn
+ * Revision 1.10 1997-05-14 06:54:01 adam
+ * C++ support.
+ *
+ * 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
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")))
*args = '\0';
if (!strcmp(cmd, "elm"))
{
- data1_element *new;
+ data1_element *new_element;
int i;
char path[512], name[512], termlists[512], *p;
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);
return 0;
}
level = i;
- if (!(new = cur[level] = *ppl[level] = xmalloc(sizeof(*new))))
+ if (!(new_element = cur[level] = *ppl[level] = xmalloc(sizeof(*new_element))))
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;
+ new_element->next = new_element->children = 0;
+ new_element->tag = 0;
+ new_element->termlists = 0;
+ new_element->parent = level ? cur[level - 1] : 0;
+ tp = &new_element->termlists;
+ ppl[level] = &new_element->next;
+ ppl[level+1] = &new_element->children;
/* well-defined tag */
if (sscanf(p, "(%d,%d)", &type, &value) == 2)
fclose(f);
return 0;
}
- if (!(new->tag = data1_gettagbynum(res->tagset, type, value)))
+ if (!(new_element->tag = data1_gettagbynum(res->tagset, type, value)))
{
logf(LOG_WARN, "Couldn't find tag %s in tagset in %s",
p, file);
/* private tag */
else if (*p)
{
- data1_tag *nt = new->tag = xmalloc(sizeof(*new->tag));
+ data1_tag *nt = new_element->tag = xmalloc(sizeof(*new_element->tag));
nt->which = DATA1T_string;
nt->value.string = xstrdup(p);
- nt->names = xmalloc(sizeof(*new->tag->names));
+ nt->names = xmalloc(sizeof(*new_element->tag->names));
nt->names->name = nt->value.string;
nt->names->next = 0;
nt->kind = DATA1K_string;
/* parse termList definitions */
p = termlists;
if (*p == '-')
- new->termlists = 0;
+ new_element->termlists = 0;
else
{
if (!res->attset)
tp = &(*tp)->next;
}
while ((p = strchr(p, ',')) && *(++p));
+ *tp = all; /* append any ALL entries to the list */
+ }
+
+ new_element->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;
- new->name = xstrdup(name);
+ 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"))
{