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