X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=retrieval%2Fd1_absyn.c;h=92d5f1c444ad2840d9fb3a0e6bd85a69aaa8065e;hb=f593a4ffa67fe4fba173d75845923ccd4e11288e;hp=349821d4cf6071b8efe494b5f2f219f3b92c9837;hpb=e42d9ee8961aed7ac5750a4eccbbe681da92df0c;p=yaz-moved-to-github.git diff --git a/retrieval/d1_absyn.c b/retrieval/d1_absyn.c index 349821d..92d5f1c 100644 --- a/retrieval/d1_absyn.c +++ b/retrieval/d1_absyn.c @@ -4,7 +4,13 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: d1_absyn.c,v $ - * Revision 1.4 1996-05-01 12:45:28 quinn + * 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 * Support use of local tag names in abs file. * * Revision 1.3 1995/11/01 16:34:55 quinn @@ -158,10 +164,11 @@ data1_absyn *data1_read_absyn(char *file) { data1_element *new; int i; - char path[512], name[512], att[512], *p; + char path[512], name[512], termlists[512], *p; int type, value; + data1_termlist **tp; - if (sscanf(args, "%s %s %s", path, name, att) < 3) + if (sscanf(args, "%s %s %s", path, name, termlists) < 3) { logf(LOG_WARN, "Bad # of args to elm in %s: '%s'", file, args); @@ -189,7 +196,8 @@ data1_absyn *data1_read_absyn(char *file) abort; new->next = new->children = 0; new->tag = 0; - new->att = 0; + new->termlists = 0; + tp = &new->termlists; ppl[level] = &new->next; ppl[level+1] = &new->children; @@ -220,6 +228,8 @@ data1_absyn *data1_read_absyn(char *file) nt->names->name = nt->value.string; nt->names->next = 0; nt->kind = DATA1K_string; + nt->next = 0; + nt->tagset = 0; } else { @@ -228,10 +238,10 @@ data1_absyn *data1_read_absyn(char *file) return 0; } - if (*att == '!') - strcpy(att, name); - if (*att == '-') - new->att = 0; + /* parse termList definitions */ + p = termlists; + if (*p == '-') + new->termlists = 0; else { if (!res->attset) @@ -240,16 +250,44 @@ data1_absyn *data1_read_absyn(char *file) fclose(f); return 0; } - if (!(new->att = data1_getattbyname(res->attset, att))) + do { - logf(LOG_WARN, "Couldn't find att '%s' in attset", att); - fclose(f); - return 0; + 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; + } + if (*attname == '!') + strcpy(attname, name); + *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)); } - if (!(new->name = xmalloc(strlen(name)+1))) - abort(); - strcpy(new->name, name); + + new->name = xstrdup(name); } else if (!strcmp(cmd, "name")) {