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