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