X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=retrieval%2Fd1_varset.c;fp=retrieval%2Fd1_varset.c;h=2d20727deb5a37e94c9eae64b4d05d339de43f81;hb=cea212fba995de3fa0d6d6723d828f6fd7ca31df;hp=0000000000000000000000000000000000000000;hpb=b6a465d196c8738156814a9fb3ba9e2450dd1be4;p=yaz-moved-to-github.git diff --git a/retrieval/d1_varset.c b/retrieval/d1_varset.c new file mode 100644 index 0000000..2d20727 --- /dev/null +++ b/retrieval/d1_varset.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 1995, Index Data. + * See the file LICENSE for details. + * Sebastian Hammer, Adam Dickmeiss + * + * $Log: d1_varset.c,v $ + * Revision 1.1 1995-11-01 11:56:09 quinn + * Added Retrieval (data management) functions en masse. + * + * + */ + +#include +#include + +#include +#include +#include +#include + +#include "data1.h" + +data1_vartype *data1_getvartypebyct(data1_varset *set, char *class, char *type) +{ + data1_varclass *c; + data1_vartype *t; + + for (c = set->classes; c; c = c->next) + if (!data1_matchstr(c->name, class)) + { + for (t = c->types; t; t = t->next) + if (!data1_matchstr(t->name, type)) + return t; + logf(LOG_WARN, "Unknown variant type %s in class %s", type, class); + return 0; + } + logf(LOG_WARN, "Unknown variant class %s", class); + return 0; +} + +data1_varset *data1_read_varset(char *file) +{ + data1_varset *res = xmalloc(sizeof(*res)); + data1_varclass **classp = &res->classes, *class = 0; + data1_vartype **typep = 0; + FILE *f; + int argc; + char *argv[50],line[512]; + + res->name = 0; + res->reference = VAL_NONE; + res->classes = 0; + + if (!(f = fopen(file, "r"))) + { + logf(LOG_WARN|LOG_ERRNO, "%s", file); + return 0; + } + while ((argc = readconf_line(f, line, 512, argv, 50))) + if (!strcmp(argv[0], "class")) + { + data1_varclass *r; + + if (argc != 3) + { + logf(LOG_FATAL, "%s: malformed class directive", file); + fclose(f); + return 0; + } + *classp = r = class = xmalloc(sizeof(*r)); + r->set = res; + r->class = atoi(argv[1]); + r->name = xmalloc(strlen(argv[2])+1); + strcpy(r->name, argv[2]); + r->types = 0; + typep = &r->types; + r->next = 0; + classp = &r->next; + } + else if (!strcmp(argv[0], "type")) + { + data1_vartype *r; + + if (!typep) + { + logf(LOG_WARN, "%s: class directive must precede type", file); + fclose(f); + return 0; + } + if (argc != 4) + { + logf(LOG_WARN, "%s: Malformed type directive", file); + fclose(f); + return 0; + } + *typep = r = xmalloc(sizeof(*r)); + r->name = xmalloc(strlen(argv[2])+1); + strcpy(r->name, argv[2]); + r->class = class; + r->type = atoi(argv[1]); + if (!(r->datatype = data1_maptype(argv[3]))) + { + logf(LOG_WARN, "%s: Unknown datatype '%s'", file, argv[3]); + fclose(f); + return 0; + } + r->next = 0; + typep = &r->next; + } + else if (!strcmp(argv[0], "name")) + { + if (argc != 2) + { + logf(LOG_WARN, "%s name: Expected 1 argument", file); + fclose(f); + return 0; + } + res->name = xmalloc(strlen(argv[1])+1); + strcpy(res->name, argv[1]); + } + else if (!strcmp(argv[0], "reference")) + { + if (argc != 2) + { + logf(LOG_WARN, "%s: reference: Expected 1 argument", file); + fclose(f); + return 0; + } + if ((res->reference = oid_getvalbyname(argv[1])) == VAL_NONE) + { + logf(LOG_WARN, "Unknown reference '%s' in %s", argv[1], file); + fclose(f); + return 0; + } + } + else + logf(LOG_WARN, "varset: Unknown directive '%s' in %s", argv[0], + file); + + fclose(f); + return res; +}