X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=retrieval%2Fd1_attset.c;h=8ee20adebebef0c8ba15e9d2e8780be9455bcd8b;hp=b747942e0d4568e5a3150bfe6e3927ff3b966885;hb=45bfcdc6cfcb7af8b930fe49c43aeadfe5624f20;hpb=6517fa53d35512887780fd07de5667940da18a9e diff --git a/retrieval/d1_attset.c b/retrieval/d1_attset.c index b747942..8ee20ad 100644 --- a/retrieval/d1_attset.c +++ b/retrieval/d1_attset.c @@ -1,10 +1,30 @@ /* - * Copyright (c) 1995-1997, 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.7 1997-09-17 12:10:34 adam + * Revision 1.11 1998-10-14 13:31:56 adam + * Bug fix. Bug introduced by previous commit. + * + * Revision 1.10 1998/10/13 16:09:48 adam + * Added support for arbitrary OID's for tagsets, schemas and attribute sets. + * Added support for multiple attribute set references and tagset references + * from an abstract syntax file. + * Fixed many bad logs-calls in routines that read the various + * specifications regarding data1 (*.abs,*.att,...) and made the messages + * consistent whenever possible. + * Added extra 'lineno' argument to function readconf_line. + * + * 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 @@ -36,98 +56,97 @@ #include #include #include -#include 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 (dh, s->children, name))) + if ((r = data1_getattbyname (dh, c->child, name))) return r; } return 0; } -data1_attset *data1_read_attset(data1_handle dh, char *file) +data1_attset *data1_empty_attset(data1_handle dh) +{ + NMEM mem = data1_nmem_get (dh); + data1_attset *res = (data1_attset*) nmem_malloc(mem,sizeof(*res)); + + res->name = 0; + res->reference = VAL_NONE; + res->atts = 0; + res->children = 0; + res->next = 0; + return res; +} + +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); + int lineno = 0; + int argc; + char *argv[50], line[512]; if (!(f = yaz_path_fopen(data1_get_tabpath(dh), file, "r"))) - { - logf(LOG_WARN|LOG_ERRNO, "%s", file); - return 0; - } + return NULL; + res = data1_empty_attset (dh); - res = nmem_malloc(mem, sizeof(*res)); - res->name = 0; - res->reference = VAL_NONE; - res->ordinal = -1; - res->atts = 0; - res->children = res->next = 0; childp = &res->children; attp = &res->atts; - for (;;) + while ((argc = readconf_line(f, &lineno, line, 512, argv, 50))) { - while ((r = fgets(line, 512, f))) - { - while (*r && isspace(*r)) - r++; - if (*r && *r != '#') - break; - } - if (!r) - { - fclose(f); - return res; - } - if (sscanf(r, "%s %[^\n]", cmd, args) < 2) - *args = '\0'; + char *cmd = argv[0]; if (!strcmp(cmd, "att")) { - int num, rr; - char name[512], localstr[512]; + int num; + char *name; data1_att *t; data1_local_attribute *locals; - - if ((rr = sscanf(args, "%511d %s %511s", &num, name, localstr)) < 2) + + if (argc < 3) { - logf(LOG_WARN, "Not enough arguments to att in '%s' in %s", - args, file); - fclose(f); - return 0; + logf(LOG_WARN, "%s:%d: Bad # of args to att", file, lineno); + continue; } - if (rr < 3) /* no local attributes given */ + num = atoi (argv[1]); + name = argv[2]; + + if (argc == 3) /* no local attributes given */ { - locals = nmem_malloc(mem, sizeof(*locals)); + locals = (data1_local_attribute *) + nmem_malloc(mem, sizeof(*locals)); locals->local = num; locals->next = 0; } else /* parse the string "local{,local}" */ { - char *p = localstr; + char *p = argv[3]; data1_local_attribute **ap = &locals; do { - *ap = nmem_malloc(mem, sizeof(**ap)); + *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 = nmem_malloc(mem, sizeof(*t)); + t = *attp = (data1_att *)nmem_malloc(mem, sizeof(*t)); t->parent = res; t->name = nmem_strdup(mem, name); t->value = num; @@ -137,65 +156,68 @@ data1_attset *data1_read_attset(data1_handle dh, char *file) } else if (!strcmp(cmd, "name")) { - char name[512]; - - if (!sscanf(args, "%s", name)) + if (argc != 2) { - logf(LOG_WARN, "%s malformed name directive in %s", file); - fclose(f); - return 0; + logf(LOG_WARN, "%s:%d: Bad # of args to name", file, lineno); + continue; } - res->name = nmem_strdup(mem, args); } else if (!strcmp(cmd, "reference")) { - char name[512]; + char *name; - if (!sscanf(args, "%s", name)) + if (argc != 2) { - logf(LOG_WARN, "%s malformed reference directive in %s", file); - fclose(f); - return 0; + logf(LOG_WARN, "%s:%d: Bad # of args to reference", + file, lineno); + continue; } + name = argv[1]; if ((res->reference = oid_getvalbyname(name)) == VAL_NONE) { - logf(LOG_WARN, "Unknown attset name '%s' in %s", name, file); + logf(LOG_WARN, "%s:%d: Unknown reference oid '%s'", + file, lineno, name); fclose(f); return 0; } } else if (!strcmp(cmd, "ordinal")) { - if (!sscanf(args, "%d", &res->ordinal)) - { - logf(LOG_WARN, "%s malformed ordinal directive in %s", file); - fclose(f); - return 0; - } + logf (LOG_WARN, "%s:%d: Directive ordinal ignored", + file, lineno); } else if (!strcmp(cmd, "include")) { - char name[512]; + char *name; + data1_attset *attset; - if (!sscanf(args, "%s", name)) + if (argc != 2) { - logf(LOG_WARN, "%s malformed reference directive in %s", file); - fclose(f); - return 0; + logf(LOG_WARN, "%s:%d: Bad # of args to include", + file, lineno); + continue; } - if (!(*childp = data1_read_attset (dh, name))) + name = argv[1]; + + if (!(attset = data1_get_attset (dh, name))) { - logf(LOG_WARN, "Inclusion failed in %s", file); - fclose(f); - return 0; + logf(LOG_WARN, "%s:%d: Include of attset %s failed", + file, lineno, name); + continue; + } + *childp = (data1_attset_child *) + nmem_malloc (mem, sizeof(**childp)); + (*childp)->child = attset; + (*childp)->next = 0; childp = &(*childp)->next; } else { - logf(LOG_WARN, "Unknown directive '%s' in %s", cmd, file); - fclose(f); - return 0; + logf(LOG_WARN, "%s:%d: Unknown directive '%s'", + file, lineno, cmd); } } + fclose(f); + return res; }