X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=retrieval%2Fd1_attset.c;h=fde7272e820b343865a2bb36de2c5e09c707b15d;hb=348e11131385e72241a04997e90c8c77147e6423;hp=7a078b6ceebcd691a3b5c90ec17e4558218b5f7a;hpb=8916c5245235fa1229f8a23ba7ebb1500e98b818;p=yaz-moved-to-github.git diff --git a/retrieval/d1_attset.c b/retrieval/d1_attset.c index 7a078b6..fde7272 100644 --- a/retrieval/d1_attset.c +++ b/retrieval/d1_attset.c @@ -1,10 +1,30 @@ /* - * Copyright (c) 1995, Index Data. + * Copyright (c) 1995-1998, Index Data. * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * $Log: d1_attset.c,v $ - * Revision 1.3 1995-12-13 17:14:26 quinn + * Revision 1.9 1998-05-18 13:07:03 adam + * Changed the way attribute sets are handled by the retriaval module. + * Extended Explain conversion / schema. + * Modified server and client to work with ASN.1 compiled protocol handlers. + * + * Revision 1.8 1998/02/11 11:53:35 adam + * Changed code so that it compiles as C++. + * + * Revision 1.7 1997/09/17 12:10:34 adam + * YAZ version 1.4. + * + * Revision 1.6 1997/09/05 09:50:56 adam + * Removed global data1_tabpath - uses data1_get_tabpath() instead. + * + * Revision 1.5 1996/05/09 07:27:43 quinn + * Multiple local attributes values supported. + * + * Revision 1.4 1996/02/21 15:23:36 quinn + * Reversed fclose and return; + * + * Revision 1.3 1995/12/13 17:14:26 quinn * *** empty log message *** * * Revision 1.2 1995/11/01 16:34:55 quinn @@ -21,49 +41,46 @@ #include #include -#include #include #include #include #include -data1_att *data1_getattbyname(data1_attset *s, char *name) +data1_att *data1_getattbyname(data1_handle dh, data1_attset *s, char *name) { data1_att *r; - - for (; s; s = s->next) + data1_attset_child *c; + + /* scan local set */ + for (r = s->atts; r; r = r->next) + if (!data1_matchstr(r->name, name)) + return r; + for (c = s->children; c; c = c->next) { - /* scan local set */ - for (r = s->atts; r; r = r->next) - if (!data1_matchstr(r->name, name)) - return r; + assert (c->child); /* scan included sets */ - if (s->children && (r = data1_getattbyname(s->children, name))) + if ((r = data1_getattbyname (dh, c->child, name))) return r; } return 0; } -data1_attset *data1_read_attset(char *file) +data1_attset *data1_read_attset(data1_handle dh, const char *file) { char line[512], *r, cmd[512], args[512]; - data1_attset *res = 0, **childp; + data1_attset *res = 0; + data1_attset_child **childp; data1_att **attp; FILE *f; + NMEM mem = data1_nmem_get (dh); - if (!(f = yaz_path_fopen(data1_tabpath, file, "r"))) - { - logf(LOG_WARN|LOG_ERRNO, "%s", file); - return 0; - } - - if (!(res = xmalloc(sizeof(*res)))) - abort(); + if (!(f = yaz_path_fopen(data1_get_tabpath(dh), file, "r"))) + return NULL; + res = (data1_attset *)nmem_malloc(mem, sizeof(*res)); res->name = 0; res->reference = VAL_NONE; - res->ordinal = -1; res->atts = 0; - res->children = res->next = 0; + res->children = 0; childp = &res->children; attp = &res->atts; @@ -78,34 +95,49 @@ data1_attset *data1_read_attset(char *file) } if (!r) { - return res; fclose(f); + return res; } if (sscanf(r, "%s %[^\n]", cmd, args) < 2) *args = '\0'; if (!strcmp(cmd, "att")) { - int num, local, rr; - char name[512]; + int num, rr; + char name[512], localstr[512]; data1_att *t; + data1_local_attribute *locals; - if ((rr = sscanf(args, "%d %s %d", &num, name, &local)) < 2) + if ((rr = sscanf(args, "%511d %s %511s", &num, name, localstr)) < 2) { logf(LOG_WARN, "Not enough arguments to att in '%s' in %s", args, file); fclose(f); return 0; } - if (rr < 3) - local = num; - if (!(t = *attp = xmalloc(sizeof(*t)))) - abort(); + if (rr < 3) /* no local attributes given */ + { + locals = (data1_local_attribute *)nmem_malloc(mem, sizeof(*locals)); + locals->local = num; + locals->next = 0; + } + else /* parse the string "local{,local}" */ + { + char *p = localstr; + data1_local_attribute **ap = &locals; + do + { + *ap = (data1_local_attribute *)nmem_malloc(mem, sizeof(**ap)); + (*ap)->local = atoi(p); + (*ap)->next = 0; + ap = &(*ap)->next; + } + while ((p = strchr(p, ',')) && *(++p)); + } + t = *attp = (data1_att *)nmem_malloc(mem, sizeof(*t)); t->parent = res; - if (!(t->name = xmalloc(strlen(name)+1))) - abort(); - strcpy(t->name, name); + t->name = nmem_strdup(mem, name); t->value = num; - t->local = local; + t->locals = locals; t->next = 0; attp = &t->next; } @@ -119,9 +151,6 @@ data1_attset *data1_read_attset(char *file) fclose(f); return 0; } - if (!(res->name = xmalloc(strlen(args)+1))) - abort(); - strcpy(res->name, name); } else if (!strcmp(cmd, "reference")) { @@ -142,7 +171,8 @@ data1_attset *data1_read_attset(char *file) } else if (!strcmp(cmd, "ordinal")) { - if (!sscanf(args, "%d", &res->ordinal)) + int dummy; + if (!sscanf(args, "%d", &dummy)) { logf(LOG_WARN, "%s malformed ordinal directive in %s", file); fclose(f); @@ -159,12 +189,15 @@ data1_attset *data1_read_attset(char *file) fclose(f); return 0; } - if (!(*childp = data1_read_attset(name))) + *childp = (data1_attset_child *) + nmem_malloc (mem, sizeof(**childp)); + if (!((*childp)->child = data1_get_attset (dh, name))) { logf(LOG_WARN, "Inclusion failed in %s", file); fclose(f); return 0; } + (*childp)->next = 0; childp = &(*childp)->next; } else