1156e03c67f7be202c7d5ed6a0616e04e2cf05ec
[yaz-moved-to-github.git] / ztest / read-grs.c
1 /*
2  * Copyright (c) 1995-2003, Index Data.
3  * See the file LICENSE for details.
4  *
5  * $Id: read-grs.c,v 1.9 2004-11-18 15:18:14 heikki Exp $
6  */
7
8 /*
9  * Little toy-thing to read a GRS-1 records from a file.
10  */
11
12 #include <stdio.h>
13 #include <ctype.h>
14 #include <stdlib.h>
15
16 #include <yaz/proto.h>
17 #include <yaz/ylog.h>
18
19 #define GRS_MAX_FIELDS 50
20
21 static Z_GenericRecord *read_grs1(FILE *f, ODR o)
22 {
23     char line[512], *buf;
24     int type, ivalue;
25     char value[512];
26     Z_GenericRecord *r = 0;
27
28     for (;;)
29     {
30         Z_TaggedElement *t;
31         Z_ElementData *c;
32
33         while (fgets(buf = line, 512, f))
34         {
35             while (*buf && isspace(*buf))
36                 buf++;
37             if (!*buf || *buf == '#')
38                 continue;
39             break;
40         }
41         if (*buf == '}')
42             return r;
43         if (sscanf(buf, "(%d,%[^)])", &type, value) != 2)
44         {
45             yaz_log(YLOG_WARN, "Bad data in '%s'", buf);
46             return 0;
47         }
48         if (!type && *value == '0')
49             return r;
50         if (!(buf = strchr(buf, ')')))
51             return 0;
52         buf++;
53         while (*buf && isspace(*buf))
54             buf++;
55         if (!*buf)
56             return 0;
57         if (!r)
58         {
59             r = (Z_GenericRecord *)odr_malloc(o, sizeof(*r));
60             r->elements = (Z_TaggedElement **)
61                 odr_malloc(o, sizeof(Z_TaggedElement*) * GRS_MAX_FIELDS);
62             r->num_elements = 0;
63         }
64         r->elements[r->num_elements] = t = (Z_TaggedElement *)
65             odr_malloc(o, sizeof(Z_TaggedElement));
66         t->tagType = odr_intdup(o, type);
67         t->tagValue = (Z_StringOrNumeric *)
68             odr_malloc(o, sizeof(Z_StringOrNumeric));
69         if ((ivalue = atoi(value)))
70         {
71             t->tagValue->which = Z_StringOrNumeric_numeric;
72             t->tagValue->u.numeric = odr_intdup(o, ivalue);
73         }
74         else
75         {
76             t->tagValue->which = Z_StringOrNumeric_string;
77             t->tagValue->u.string = (char *)odr_malloc(o, strlen(value)+1);
78             strcpy(t->tagValue->u.string, value);
79         }
80         t->tagOccurrence = 0;
81         t->metaData = 0;
82         t->appliedVariant = 0;
83         t->content = c = (Z_ElementData *)odr_malloc(o, sizeof(Z_ElementData));
84         if (*buf == '{')
85         {
86             c->which = Z_ElementData_subtree;
87             c->u.subtree = read_grs1(f, o);
88         }
89         else
90         {
91             c->which = Z_ElementData_string;
92             buf[strlen(buf)-1] = '\0';
93             c->u.string = odr_strdup(o, buf);
94         }
95         r->num_elements++;
96     }
97 }
98
99 Z_GenericRecord *dummy_grs_record (int num, ODR o)
100 {
101     FILE *f = fopen("dummy-grs", "r");
102     char line[512];
103     Z_GenericRecord *r = 0;
104     int n;
105
106     if (!f)
107         return 0;
108     while (fgets(line, 512, f))
109         if (*line == '#' && sscanf(line, "#%d", &n) == 1 && n == num)
110         {
111             r = read_grs1(f, o);
112             break;
113         }
114     fclose(f);
115     return r;
116 }
117