X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=retrieval%2Fd1_tagset.c;h=7ba2a81e01d6a442d5e65d7fbce4a81a865338b5;hp=00b09ad123ed1d5f33ce09935d0979e32404c29b;hb=21a7fea425de8b32ac71bbbb981e88e77e6a3428;hpb=6517fa53d35512887780fd07de5667940da18a9e diff --git a/retrieval/d1_tagset.c b/retrieval/d1_tagset.c index 00b09ad..7ba2a81 100644 --- a/retrieval/d1_tagset.c +++ b/retrieval/d1_tagset.c @@ -1,10 +1,31 @@ /* - * Copyright (c) 1995-1997, Index Data. + * Copyright (c) 1995-1998, Index Data. * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * $Log: d1_tagset.c,v $ - * Revision 1.6 1997-09-17 12:10:38 adam + * Revision 1.10 1998-10-15 08:29:17 adam + * Tag set type may be specified in reference to it using "tagset" + * directive in .abs-files and "include" directive in .tag-files. + * + * Revision 1.9 1998/10/13 16:09:53 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.8 1998/05/18 13:07:07 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.7 1998/02/11 11:53:35 adam + * Changed code so that it compiles as C++. + * + * Revision 1.6 1997/09/17 12:10:38 adam * YAZ version 1.4. * * Revision 1.5 1997/09/05 09:50:57 adam @@ -31,8 +52,6 @@ #include #include -#include - #include /* @@ -58,21 +77,21 @@ data1_datatype data1_maptype (data1_handle dh, char *t) {"int", DATA1K_int}, {"octetstring", DATA1K_octetstring}, {"null", DATA1K_null}, - {0, -1} + {NULL, (data1_datatype) -1} }; int i; for (i = 0; types[i].tname; i++) if (!data1_matchstr(types[i].tname, t)) return types[i].type; - return 0; + return DATA1K_unknown; } data1_tag *data1_gettagbynum (data1_handle dh, data1_tagset *s, int type, int value) { data1_tag *r; - + for (; s; s = s->next) { /* scan local set */ @@ -81,21 +100,22 @@ data1_tag *data1_gettagbynum (data1_handle dh, data1_tagset *s, if (r->which == DATA1T_numeric && r->value.numeric == value) return r; /* scan included sets */ - if (s->children && (r = data1_gettagbynum (dh, s->children, - type, value))) + if (s->children && + (r = data1_gettagbynum (dh, s->children, type, value))) return r; } return 0; } -data1_tag *data1_gettagbyname (data1_handle dh, data1_tagset *s, char *name) +data1_tag *data1_gettagbyname (data1_handle dh, data1_tagset *s, + const char *name) { data1_tag *r; for (; s; s = s->next) { /* scan local set */ - for (r = s->tags; r; r = r->next) + for (r = s->children->tags; r; r = r->next) { data1_name *np; @@ -110,60 +130,60 @@ data1_tag *data1_gettagbyname (data1_handle dh, data1_tagset *s, char *name) return 0; } -data1_tagset *data1_read_tagset (data1_handle dh, char *file) +data1_tagset *data1_empty_tagset (data1_handle dh) +{ + data1_tagset *res = + (data1_tagset *) nmem_malloc(data1_nmem_get (dh), sizeof(*res)); + res->name = 0; + res->reference = VAL_NONE; + res->tags = 0; + res->type = 0; + res->children = 0; + res->next = 0; + return res; +} + +data1_tagset *data1_read_tagset (data1_handle dh, const char *file, int type) { NMEM mem = data1_nmem_get (dh); - char line[512], *r, cmd[512], args[512]; - data1_tagset *res = 0, **childp; + data1_tagset *res = 0; + data1_tagset **childp; data1_tag **tagp; FILE *f; + 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; } - - res = nmem_malloc(mem, sizeof(*res)); - res->name = 0; - res->type = 0; - res->tags = 0; - res->children = 0; - res->next = 0; + res = data1_empty_tagset (dh); + res->type = type; childp = &res->children; tagp = &res->tags; - 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; if (!strcmp(cmd, "tag")) { int value; - char names[512], type[512], *nm; + char *names, *type, *nm; data1_tag *rr; data1_name **npp; - if (sscanf(args, "%d %s %s", &value, names, type) < 3) + if (argc != 4) { - logf(LOG_WARN, "Bad number of parms in '%s' in %s", - args, file); - fclose(f); - return 0; + logf(LOG_WARN, "%s:%d: Bad # args to tag", file, lineno); + continue; } - rr = *tagp = nmem_malloc(mem, sizeof(*rr)); + value = atoi(argv[1]); + names = argv[2]; + type = argv[3]; + + rr = *tagp = (data1_tag *)nmem_malloc(mem, sizeof(*rr)); rr->tagset = res; rr->next = 0; rr->which = DATA1T_numeric; @@ -174,7 +194,8 @@ data1_tagset *data1_read_tagset (data1_handle dh, char *file) if (!(rr->kind = data1_maptype(dh, type))) { - logf(LOG_WARN, "Unknown datatype %s in %s", type, file); + logf(LOG_WARN, "%s:%d: Unknown datatype %s", + file, lineno, type); fclose(f); return 0; } @@ -186,7 +207,7 @@ data1_tagset *data1_read_tagset (data1_handle dh, char *file) { char *e; - *npp = nmem_malloc(mem, sizeof(**npp)); + *npp = (data1_name *)nmem_malloc(mem, sizeof(**npp)); if ((e = strchr(nm, '/'))) *(e++) = '\0'; (*npp)->name = nmem_strdup(mem, nm); @@ -199,65 +220,69 @@ data1_tagset *data1_read_tagset (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 # args to name", file, lineno); + continue; } - res->name = nmem_strdup(mem, args); + res->name = nmem_strdup(mem, argv[1]); } else if (!strcmp(cmd, "reference")) { - char name[512]; - - if (!sscanf(args, "%s", name)) + char *name; + + if (argc != 2) { - logf(LOG_WARN, "%s malformed reference directive in %s", file); - fclose(f); - return 0; + logf(LOG_WARN, "%s:%d: Bad # args to reference", file, lineno); + continue; } + name = argv[1]; if ((res->reference = oid_getvalbyname(name)) == VAL_NONE) { - logf(LOG_WARN, "Unknown tagset ref '%s' in %s", name, file); - fclose(f); - return 0; + logf(LOG_WARN, "%s:%d: Unknown tagset ref '%s'", + file, lineno, name); + continue; } } else if (!strcmp(cmd, "type")) { - if (!sscanf(args, "%d", &res->type)) + if (argc != 2) { - logf(LOG_WARN, "%s malformed type directive in %s", file); - fclose(f); - return 0; + logf (LOG_WARN, "%s:%d: Bad # args to type", file, lineno); + continue; } + if (!res->type) + res->type = atoi(argv[1]); } else if (!strcmp(cmd, "include")) { - char name[512]; + char *name; + int type = 0; - 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 # args to include", + file, lineno); + continue; } - if (!(*childp = data1_read_tagset (dh, name))) + name = argv[1]; + if (argc == 3) + type = atoi(argv[2]); + *childp = data1_read_tagset (dh, name, type); + if (!(*childp)) { - logf(LOG_WARN, "Inclusion failed in %s", file); - fclose(f); - return 0; + logf(LOG_WARN, "%s:%d: Inclusion failed for tagset %s", + file, lineno, name); + continue; } 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; }