2 * Copyright (c) 1995-2001, Index Data.
3 * See the file LICENSE for details.
6 * Revision 1.6 2001-03-25 21:55:13 adam
7 * Added odr_intdup. Ztest server returns TaskPackage for ItemUpdate.
9 * Revision 1.5 1999/11/30 13:47:12 adam
10 * Improved installation. Moved header files to include/yaz.
12 * Revision 1.4 1999/08/27 09:40:32 adam
13 * Renamed logf function to yaz_log. Removed VC++ project files.
15 * Revision 1.3 1999/03/31 11:18:25 adam
16 * Implemented odr_strdup. Added Reference ID to backend server API.
18 * Revision 1.2 1998/02/11 11:53:36 adam
19 * Changed code so that it compiles as C++.
21 * Revision 1.1 1997/09/01 08:55:53 adam
22 * New windows NT/95 port using MSV5.0. Test server ztest now in
23 * separate directory. When using NT, this test server may operate
24 * as an NT service. Note that the service.[ch] should be part of
25 * generic, but it isn't yet.
27 * Revision 1.1 1995/08/17 12:45:23 quinn
28 * Fixed minor problems with GRS-1. Added support in c&s.
34 * Little toy-thing to read a GRS-1 record from a file.
41 #include <yaz/proto.h>
44 #define GRS_MAX_FIELDS 50
46 Z_GenericRecord *read_grs1(FILE *f, ODR o)
51 Z_GenericRecord *r = 0;
58 while (fgets(buf = line, 512, f))
60 while (*buf && isspace(*buf))
62 if (!*buf || *buf == '#')
68 if (sscanf(buf, "(%d,%[^)])", &type, value) != 2)
70 yaz_log(LOG_WARN, "Bad data in '%s'", buf);
73 if (!type && *value == '0')
75 if (!(buf = strchr(buf, ')')))
78 while (*buf && isspace(*buf))
84 r = (Z_GenericRecord *)odr_malloc(o, sizeof(*r));
85 r->elements = (Z_TaggedElement **)
86 odr_malloc(o, sizeof(Z_TaggedElement*) * GRS_MAX_FIELDS);
89 r->elements[r->num_elements] = t = (Z_TaggedElement *)
90 odr_malloc(o, sizeof(Z_TaggedElement));
91 t->tagType = odr_intdup(o, type);
92 t->tagValue = (Z_StringOrNumeric *)
93 odr_malloc(o, sizeof(Z_StringOrNumeric));
94 if ((ivalue = atoi(value)))
96 t->tagValue->which = Z_StringOrNumeric_numeric;
97 t->tagValue->u.numeric = odr_intdup(o, ivalue);
101 t->tagValue->which = Z_StringOrNumeric_string;
102 t->tagValue->u.string = (char *)odr_malloc(o, strlen(value)+1);
103 strcpy(t->tagValue->u.string, value);
105 t->tagOccurrence = 0;
107 t->appliedVariant = 0;
108 t->content = c = (Z_ElementData *)odr_malloc(o, sizeof(Z_ElementData));
111 c->which = Z_ElementData_subtree;
112 c->u.subtree = read_grs1(f, o);
116 c->which = Z_ElementData_string;
117 buf[strlen(buf)-1] = '\0';
118 c->u.string = odr_strdup(o, buf);