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