X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=retrieval%2Fd1_attset.c;h=20096474620283afb3df160dcc7e29b3486e2f91;hp=c0b7f49cd9dd9ebe94cab559ab9097e5e49be8dc;hb=37b3d8433b89248def810d7cfa9b110893519f65;hpb=044d170f0a963555486df54653cd2fdc5815928b diff --git a/retrieval/d1_attset.c b/retrieval/d1_attset.c index c0b7f49..2009647 100644 --- a/retrieval/d1_attset.c +++ b/retrieval/d1_attset.c @@ -1,10 +1,36 @@ /* - * Copyright (c) 1995-1997, Index Data. + * Copyright (c) 1995-1999, Index Data. * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * $Log: d1_attset.c,v $ - * Revision 1.8 1998-02-11 11:53:35 adam + * Revision 1.14 1999-11-30 13:47:12 adam + * Improved installation. Moved header files to include/yaz. + * + * Revision 1.13 1999/10/21 12:06:29 adam + * Retrieval module no longer uses ctype.h - functions. + * + * Revision 1.12 1999/08/27 09:40:32 adam + * Renamed logf function to yaz_log. Removed VC++ project files. + * + * 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 @@ -31,99 +57,97 @@ * */ -#include #include #include #include -#include -#include -#include -#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) { - char line[512], *r, cmd[512], args[512]; - data1_attset *res = 0, **childp; + 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) +{ + 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 = (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; 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; + yaz_log(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 = (data1_local_attribute *)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 = (data1_local_attribute *)nmem_malloc(mem, sizeof(**ap)); + *ap = (data1_local_attribute *) + nmem_malloc(mem, sizeof(**ap)); (*ap)->local = atoi(p); (*ap)->next = 0; ap = &(*ap)->next; @@ -140,65 +164,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; + yaz_log(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; + yaz_log(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); + yaz_log(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; - } + yaz_log (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; + yaz_log(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; + yaz_log(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; + yaz_log(LOG_WARN, "%s:%d: Unknown directive '%s'", + file, lineno, cmd); } } + fclose(f); + return res; }