Minor change to make C++ happy.
[yaz-moved-to-github.git] / asn / prt-grs.c
1 /*
2  * Copyright (c) 1995, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: prt-grs.c,v $
7  * Revision 1.7  1998-02-11 11:53:32  adam
8  * Changed code so that it compiles as C++.
9  *
10  * Revision 1.6  1997/05/14 06:53:23  adam
11  * C++ support.
12  *
13  * Revision 1.5  1995/10/18 16:12:20  quinn
14  * Added a couple of special cases to handle the WAIS server.
15  *
16  * Revision 1.4  1995/09/29  17:11:55  quinn
17  * Smallish
18  *
19  * Revision 1.3  1995/09/27  15:02:43  quinn
20  * Modified function heads & prototypes.
21  *
22  * Revision 1.2  1995/08/28  10:58:58  quinn
23  * Added extra choice-entry to data to catch visiblestring.
24  *
25  * Revision 1.1  1995/08/17  12:47:09  quinn
26  * Added GRS-1.
27  *
28  *
29  */
30
31 #include <proto.h>
32
33 int z_TaggedElement(ODR o, Z_TaggedElement **p, int opt);
34 int z_ElementData(ODR o, Z_ElementData **p, int opt);
35 int z_ElementMetaData(ODR o, Z_ElementMetaData **p, int opt);
36 int z_TagUnit(ODR o, Z_TagUnit **p, int opt);
37 int z_TagPath(ODR o, Z_TagPath **p, int opt);
38 int z_Order(ODR o, Z_Order **p, int opt);
39 int z_Usage(ODR o, Z_Usage **p, int opt);
40 int z_HitVector(ODR o, Z_HitVector **p, int opt);
41 int z_Triple(ODR o, Z_Triple **p, int opt);
42 int z_Variant(ODR o, Z_Variant **p, int opt);
43
44 int z_GenericRecord(ODR o, Z_GenericRecord **p, int opt)
45 {
46     if (o->direction == ODR_DECODE)
47         *p = (Z_GenericRecord *)odr_malloc(o, sizeof(**p));
48     else if (!*p)
49         return opt;
50     if (odr_sequence_of(o, (Odr_fun)z_TaggedElement, &(*p)->elements, &(*p)->num_elements))
51         return 1;
52     *p = 0;
53     return opt && odr_ok(o);
54 }
55
56 int z_TaggedElement(ODR o, Z_TaggedElement **p, int opt)
57 {
58     if (!odr_sequence_begin(o, p, sizeof(**p)))
59         return opt && odr_ok(o);
60     return
61         odr_implicit(o, odr_integer, &(*p)->tagType, ODR_CONTEXT, 1, 1) &&
62         odr_explicit(o, z_StringOrNumeric, &(*p)->tagValue, ODR_CONTEXT, 2, 0) &&
63         odr_implicit(o, odr_integer, &(*p)->tagOccurrence, ODR_CONTEXT, 3, 1) &&
64         odr_explicit(o, z_ElementData, &(*p)->content, ODR_CONTEXT, 4, 0) &&
65         odr_implicit(o, z_ElementMetaData, &(*p)->metaData, ODR_CONTEXT, 5, 1) &&
66         odr_implicit(o, z_Variant, &(*p)->appliedVariant, ODR_CONTEXT, 6, 1) &&
67         odr_sequence_end(o);
68 }
69     
70 int z_ElementData(ODR o, Z_ElementData **p, int opt)
71 {
72     static Odr_arm arm[] =
73     {
74         {ODR_NONE, -1, -1, Z_ElementData_octets, (Odr_fun)odr_octetstring},
75         {ODR_NONE, -1, -1, Z_ElementData_numeric, (Odr_fun)odr_integer},
76         {ODR_NONE, -1, -1, Z_ElementData_date, (Odr_fun)odr_generalizedtime},
77         {ODR_NONE, -1, -1, Z_ElementData_ext, (Odr_fun)z_External},
78         {ODR_NONE, -1, -1, Z_ElementData_string, (Odr_fun)z_InternationalString},
79         /* The entry below provides some backwards compatibility */
80         {ODR_NONE, -1, -1, Z_ElementData_string, (Odr_fun)odr_visiblestring},
81         {ODR_NONE, -1, -1, Z_ElementData_trueOrFalse, (Odr_fun)odr_bool},
82         {ODR_NONE, -1, -1, Z_ElementData_oid, (Odr_fun)odr_oid},
83         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementData_intUnit, (Odr_fun)z_IntUnit},
84         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ElementData_elementNotThere, (Odr_fun)odr_null},
85         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_ElementData_elementEmpty, (Odr_fun)odr_null},
86         {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_ElementData_noDataRequested, (Odr_fun)odr_null},
87         {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_ElementData_diagnostic, (Odr_fun)z_External},
88         {ODR_EXPLICIT, ODR_CONTEXT, 6, Z_ElementData_subtree, (Odr_fun)z_GenericRecord},
89         {-1, -1, -1, -1, 0}
90     };
91     
92     if (o->direction == ODR_DECODE)
93         *p = (Z_ElementData *)odr_malloc(o, sizeof(**p));
94     else if (!*p)
95         return opt;
96     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
97         return 1;
98     *p = 0;
99     return opt && odr_ok(o);
100 }
101
102 int z_ElementMetaData(ODR o, Z_ElementMetaData **p, int opt)
103 {
104     if (!odr_sequence_begin(o, p, sizeof(**p)))
105         return opt && odr_ok(o);
106     return
107         odr_implicit(o, z_Order, &(*p)->seriesOrder, ODR_CONTEXT, 1, 1) &&
108         odr_implicit(o, z_Usage, &(*p)->usageRight, ODR_CONTEXT, 2, 1) &&
109         odr_implicit_settag(o, ODR_CONTEXT, 3) &&
110         (odr_sequence_of(o, (Odr_fun)z_HitVector, &(*p)->hits, &(*p)->num_hits) ||
111             odr_ok(o)) &&
112         odr_implicit(o, z_InternationalString, &(*p)->displayName, ODR_CONTEXT,
113             4, 1) &&
114         odr_implicit_settag(o, ODR_CONTEXT, 5) &&
115         (odr_sequence_of(o, (Odr_fun)z_Variant, &(*p)->supportedVariants,
116             &(*p)->num_supportedVariants) || odr_ok(o)) &&
117         odr_implicit(o, z_InternationalString, &(*p)->message, ODR_CONTEXT,
118             6, 1) &&
119         odr_implicit(o, odr_octetstring, &(*p)->elementDescriptor, ODR_CONTEXT,
120             7, 1) &&
121         odr_implicit(o, z_TagPath, &(*p)->surrogateFor, ODR_CONTEXT, 8, 1) &&
122         odr_implicit(o, z_TagPath, &(*p)->surrogateElement, ODR_CONTEXT, 9, 1) &&
123         odr_implicit(o, z_External, &(*p)->other, ODR_CONTEXT, 99, 1) &&
124         odr_sequence_end(o);
125 }
126
127 int z_TagUnit(ODR o, Z_TagUnit **p, int opt)
128 {
129     if (!odr_sequence_begin(o, p, sizeof(**p)))
130         return opt && odr_ok(o);
131     return
132         odr_implicit(o, odr_integer, &(*p)->tagType, ODR_CONTEXT, 1, 1) &&
133         odr_explicit(o, z_StringOrNumeric, &(*p)->tagValue, ODR_CONTEXT, 2, 0) &&
134         odr_implicit(o, odr_integer, &(*p)->tagOccurrence, ODR_CONTEXT, 3, 1) &&
135         odr_sequence_end(o);
136 }
137
138 int z_TagPath(ODR o, Z_TagPath **p, int opt)
139 {
140     if (o->direction == ODR_DECODE)
141         *p = (Z_TagPath *)odr_malloc(o, sizeof(**p));
142     else if (!*p)
143         return opt;
144     if (odr_sequence_of(o, (Odr_fun)z_TagUnit, &(*p)->tags, &(*p)->num_tags))
145         return 1;
146     *p = 0;
147     return opt && odr_ok(o);
148 }
149
150 int z_Order(ODR o, Z_Order **p, int opt)
151 {
152     if (!odr_sequence_begin(o, p, sizeof(**p)))
153         return opt && odr_ok(o);
154     return
155         odr_implicit(o, odr_bool, &(*p)->ascending, ODR_CONTEXT, 1, 0) &&
156         odr_implicit(o, odr_integer, &(*p)->order, ODR_CONTEXT, 2, 0) &&
157         odr_sequence_end(o);
158 }
159
160 int z_Usage(ODR o, Z_Usage **p, int opt)
161 {
162     if (!odr_sequence_begin(o, p, sizeof(**p)))
163         return opt && odr_ok(o);
164     return
165         odr_implicit(o, odr_integer, &(*p)->type, ODR_CONTEXT, 1, 0) &&
166         odr_implicit(o, z_InternationalString, &(*p)->restriction, ODR_CONTEXT,
167             2, 1) &&
168         odr_sequence_end(o);
169 }
170
171 int z_HitVector(ODR o, Z_HitVector **p, int opt)
172 {
173     if (!odr_sequence_begin(o, p, sizeof(**p)))
174         return opt && odr_ok(o);
175     return
176         z_Term(o, &(*p)->satisfier, 1) &&
177         odr_implicit(o, z_IntUnit, &(*p)->offsetIntoElement, ODR_CONTEXT, 1, 1) &&
178         odr_implicit(o, z_IntUnit, &(*p)->length, ODR_CONTEXT, 2, 1) &&
179         odr_implicit(o, odr_integer, &(*p)->hitRank, ODR_CONTEXT, 3, 1) &&
180         odr_implicit(o, odr_octetstring, &(*p)->targetToken, ODR_CONTEXT,
181             4, 1) &&
182         odr_sequence_end(o);
183 }
184
185 int z_Triple(ODR o, Z_Triple **p, int opt)
186 {
187     static Odr_arm arm[] =
188     {
189         {ODR_NONE, -1, -1, Z_Triple_integer, (Odr_fun)odr_integer},
190         {ODR_NONE, -1, -1, Z_Triple_internationalString, (Odr_fun)z_InternationalString},
191         /* The entry below provides some backwards compatibility */
192         {ODR_NONE, -1, -1, Z_Triple_internationalString, (Odr_fun)odr_visiblestring},
193         {ODR_NONE, -1, -1, Z_Triple_octetString, (Odr_fun)odr_octetstring},
194         {ODR_NONE, -1, -1, Z_Triple_oid, (Odr_fun)odr_oid},
195         {ODR_NONE, -1, -1, Z_Triple_boolean, (Odr_fun)odr_bool},
196         {ODR_NONE, -1, -1, Z_Triple_null, (Odr_fun)odr_null},
197         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Triple_unit, (Odr_fun)z_Unit},
198         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Triple_valueAndUnit, (Odr_fun)z_IntUnit},
199         {-1, -1, -1, -1, 0}
200     };
201
202     if (!odr_sequence_begin(o, p, sizeof(**p)))
203         return opt && odr_ok(o);
204     return
205         odr_implicit(o, odr_oid, &(*p)->variantSetId, ODR_CONTEXT, 0, 1) &&
206         odr_implicit(o, odr_integer, &(*p)->zclass, ODR_CONTEXT, 1, 0) &&
207         odr_implicit(o, odr_integer, &(*p)->type, ODR_CONTEXT, 2, 0) &&
208         odr_constructed_begin(o, &(*p)->value, ODR_CONTEXT, 3) &&
209         odr_choice(o, arm, &(*p)->value, &(*p)->which) &&
210         odr_constructed_end(o) &&
211         odr_sequence_end(o);
212 }
213
214 int z_Variant(ODR o, Z_Variant **p, int opt)
215 {
216     if (!odr_sequence_begin(o, p, sizeof(**p)))
217         return opt && odr_ok(o);
218     return
219         odr_implicit(o, odr_oid, &(*p)->globalVariantSetId, ODR_CONTEXT,
220             1, 1) &&
221         odr_implicit_settag(o, ODR_CONTEXT, 2) &&
222         odr_sequence_of(o, (Odr_fun)z_Triple, &(*p)->triples, &(*p)->num_triples) &&
223         odr_sequence_end(o);
224 }