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