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