Old versions of GILS tables
[yaz-moved-to-github.git] / retrieval / d1_varset.c
1 /*
2  * Copyright (c) 1995, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: d1_varset.c,v $
7  * Revision 1.4  1997-05-14 06:54:04  adam
8  * C++ support.
9  *
10  * Revision 1.3  1995/11/01 16:34:58  quinn
11  * Making data1 look for tables in data1_tabpath
12  *
13  * Revision 1.2  1995/11/01  13:54:50  quinn
14  * Minor adjustments
15  *
16  * Revision 1.1  1995/11/01  11:56:09  quinn
17  * Added Retrieval (data management) functions en masse.
18  *
19  *
20  */
21
22 #include <string.h>
23 #include <stdlib.h>
24
25 #include <readconf.h>
26 #include <oid.h>
27 #include <log.h>
28
29 #include <tpath.h>
30 #include <data1.h>
31
32 data1_vartype *data1_getvartypebyct(data1_varset *set, char *zclass, char *type)
33 {
34     data1_varclass *c;
35     data1_vartype *t;
36
37     for (c = set->classes; c; c = c->next)
38         if (!data1_matchstr(c->name, zclass))
39         {
40             for (t = c->types; t; t = t->next)
41                 if (!data1_matchstr(t->name, type))
42                     return t;
43             logf(LOG_WARN, "Unknown variant type %s in class %s", type, zclass);
44             return 0;
45         }
46     logf(LOG_WARN, "Unknown variant class %s", zclass);
47     return 0;
48 }
49
50 data1_varset *data1_read_varset(char *file)
51 {
52     data1_varset *res = xmalloc(sizeof(*res));
53     data1_varclass **classp = &res->classes, *zclass = 0;
54     data1_vartype **typep = 0;
55     FILE *f;
56     int argc;
57     char *argv[50],line[512];
58
59     res->name = 0;
60     res->reference = VAL_NONE;
61     res->classes = 0;
62
63     if (!(f = yaz_path_fopen(data1_tabpath, file, "r")))
64     {
65         logf(LOG_WARN|LOG_ERRNO, "%s", file);
66         return 0;
67     }
68     while ((argc = readconf_line(f, line, 512, argv, 50)))
69         if (!strcmp(argv[0], "class"))
70         {
71             data1_varclass *r;
72
73             if (argc != 3)
74             {
75                 logf(LOG_FATAL, "%s: malformed class directive", file);
76                 fclose(f);
77                 return 0;
78             }
79             *classp = r = zclass = xmalloc(sizeof(*r));
80             r->set = res;
81             r->zclass = atoi(argv[1]);
82             r->name = xmalloc(strlen(argv[2])+1);
83             strcpy(r->name, argv[2]);
84             r->types = 0;
85             typep = &r->types;
86             r->next = 0;
87             classp = &r->next;
88         }
89         else if (!strcmp(argv[0], "type"))
90         {
91             data1_vartype *r;
92
93             if (!typep)
94             {
95                 logf(LOG_WARN, "%s: class directive must precede type", file);
96                 fclose(f);
97                 return 0;
98             }
99             if (argc != 4)
100             {
101                 logf(LOG_WARN, "%s: Malformed type directive", file);
102                 fclose(f);
103                 return 0;
104             }
105             *typep = r = xmalloc(sizeof(*r));
106             r->name = xmalloc(strlen(argv[2])+1);
107             strcpy(r->name, argv[2]);
108             r->zclass = zclass;
109             r->type = atoi(argv[1]);
110             if (!(r->datatype = data1_maptype(argv[3])))
111             {
112                 logf(LOG_WARN, "%s: Unknown datatype '%s'", file, argv[3]);
113                 fclose(f);
114                 return 0;
115             }
116             r->next = 0;
117             typep = &r->next;
118         }
119         else if (!strcmp(argv[0], "name"))
120         {
121             if (argc != 2)
122             {
123                 logf(LOG_WARN, "%s name: Expected 1 argument", file);
124                 fclose(f);
125                 return 0;
126             }
127             res->name = xmalloc(strlen(argv[1])+1);
128             strcpy(res->name, argv[1]);
129         }
130         else if (!strcmp(argv[0], "reference"))
131         {
132             if (argc != 2)
133             {
134                 logf(LOG_WARN, "%s: reference: Expected 1 argument", file);
135                 fclose(f);
136                 return 0;
137             }
138             if ((res->reference = oid_getvalbyname(argv[1])) == VAL_NONE)
139             {
140                 logf(LOG_WARN, "Unknown reference '%s' in %s", argv[1], file);
141                 fclose(f);
142                 return 0;
143             }
144         }
145         else 
146             logf(LOG_WARN, "varset: Unknown directive '%s' in %s", argv[0],
147                 file);
148
149     fclose(f);
150     return res;
151 }