Added Explain
[yaz-moved-to-github.git] / asn / prt-exp.c
1 /*
2  * Copyright (c) 1995, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: prt-exp.c,v $
7  * Revision 1.1  1995-08-10 08:54:02  quinn
8  * Added Explain
9  *
10  *
11  */
12
13 #include <proto.h>
14 #include <prt-exp.h>
15
16 int z_LanguageCode(ODR o, char **p, int opt);
17 int z_CommonInfo(ODR o, Z_CommonInfo **p, int opt);
18 int z_HumanStringUnit(ODR o, Z_HumanStringUnit **p, int opt);
19 int z_HumanString(ODR o, Z_HumanString **p, int opt);
20 int z_IconObjectUnit(ODR o, Z_IconObjectUnit **p, int opt);
21 int z_IconObject(ODR o, Z_IconObject **p, int opt);
22 int z_ContactInfo(ODR o, Z_ContactInfo **p, int opt);
23 int z_NetworkAddressIA(ODR o, Z_NetworkAddressIA **p, int opt);
24 int z_NetworkAddressOPA(ODR o, Z_NetworkAddressOPA **p, int opt);
25 int z_NetworkAddressOther(ODR o, Z_NetworkAddressOther **p, int opt);
26 int z_NetworkAddress(ODR o, Z_NetworkAddress **p, int opt);
27 int z_AccessInfo(ODR o, Z_AccessInfo **p, int opt);
28 int z_QueryTypeDetails(ODR o, Z_QueryTypeDetails **p, int opt);
29 int z_PrivateCapOperator(ODR o, Z_PrivateCapOperator **p, int opt);
30 int z_PrivateCapabilities(ODR o, Z_PrivateCapabilities **p, int opt);
31 int z_RpnCapabilities(ODR o, Z_RpnCapabilities **p, int opt);
32 int z_Iso8777Capabilities(ODR o, Z_Iso8777Capabilities **p, int opt);
33 int z_ProxSupportPrivate(ODR o, Z_ProxSupportPrivate **p, int opt);
34 int z_ProxSupportUnit(ODR o, Z_ProxSupportUnit **p, int opt);
35 int z_ProximitySupport(ODR o, Z_ProximitySupport **p, int opt);
36 int z_SearchKey(ODR o, Z_SearchKey **p, int opt);
37 int z_AccessRestrictionsUnit(ODR o, Z_AccessRestrictionsUnit **p, int opt);
38 int z_AccessRestrictions(ODR o, Z_AccessRestrictions **p, int opt);
39 int z_CostsOtherCharge(ODR o, Z_CostsOtherCharge **p, int opt);
40 int z_Costs(ODR o, Z_Costs **p, int opt);
41 int z_Charge(ODR o, Z_Charge **p, int opt);
42 int z_DatabaseList(ODR o, Z_DatabaseList **p, int opt);
43 int z_AttributeCombinations(ODR o, Z_AttributeCombinations **p, int opt);
44 int z_AttributeCombination(ODR o, Z_AttributeCombination **p, int opt);
45 int z_AttributeValueList(ODR o, Z_AttributeValueList **p, int opt);
46 int z_AttributeOccurrence(ODR o, Z_AttributeOccurrence **p, int opt);
47 int z_AttributeValue(ODR o, Z_AttributeValue **p, int opt);
48 int z_TargetInfo(ODR o, Z_TargetInfo **p, int opt);
49 int z_DatabaseInfo(ODR o, Z_DatabaseInfo **p, int opt);
50 int z_TagTypeMapping(ODR o, Z_TagTypeMapping **p, int opt);
51 int z_SchemaInfo(ODR o, Z_SchemaInfo **p, int opt);
52 int z_ElementInfo(ODR o, Z_ElementInfo **p, int opt);
53 int z_PathUnit(ODR o, Z_PathUnit **p, int opt);
54 int z_Path(ODR o, Z_Path **p, int opt);
55 int z_ElementInfoList(ODR o, Z_Path **p, int opt);
56 int z_ElementDataType(ODR o, Z_ElementDataType **p, int opt);
57 int z_TagSetInfoElements(ODR o, Z_TagSetInfoElements **p, int opt);
58 int z_TagSetInfo(ODR o, Z_TagSetInfo **p, int opt);
59 int z_RecordSyntaxInfo(ODR o, Z_RecordSyntaxInfo **p, int opt);
60 int z_AttributeSetInfo(ODR o, Z_AttributeSetInfo **p, int opt);
61 int z_AttributeType(ODR o, Z_AttributeType **p, int opt);
62 int z_AttributeDescription(ODR o, Z_AttributeDescription **p, int opt);
63 int z_TermListElement(ODR o, Z_TermListElement **p, int opt);
64 int z_TermListInfo(ODR o, Z_TermListInfo **p, int opt);
65 int z_ExtendedServicesInfo(ODR o, Z_ExtendedServicesInfo **p, int opt);
66 int z_AttributeDetails(ODR o, Z_AttributeDetails **p, int opt);
67 int z_AttributeSetDetails(ODR o, Z_AttributeSetDetails **p, int opt);
68 int z_AttributeTypeDetails(ODR o, Z_AttributeTypeDetails **p, int opt);
69 int z_OmittedAttributeInterpretation(ODR o, Z_OmittedAttributeInterpretation **p, int opt);
70 int z_EScanInfo(ODR o, Z_EScanInfo **p, int opt);
71 int z_TermListDetails(ODR o, Z_TermListDetails **p, int opt);
72 int z_ElementSetDetails(ODR o, Z_ElementSetDetails **p, int opt);
73 int z_RetrievalRecordDetails(ODR o, Z_RetrievalRecordDetails **p, int opt);
74 int z_PerElementDetails(ODR o, Z_PerElementDetails **p, int opt);
75 int z_RecordTag(ODR o, Z_RecordTag **p, int opt);
76 int z_SortDetails(ODR o, Z_SortDetails **p, int opt);
77 int z_SortKeyDetailsSortType(ODR o, Z_SortKeyDetailsSortType **p, int opt);
78 int z_SortKeyDetails(ODR o, Z_SortKeyDetails **p, int opt);
79 int z_ProcessingInformation(ODR o, Z_ProcessingInformation **p, int opt);
80 int z_VariantSetInfo(ODR o, Z_VariantSetInfo **p, int opt);
81 int z_VariantClass(ODR o, Z_VariantClass **p, int opt);
82 int z_VariantType(ODR o, Z_VariantType **p, int opt);
83 int z_VariantValue(ODR o, Z_VariantValue **p, int opt);
84 int z_ValueSetEnumerated(ODR o, Z_ValueSetEnumerated **p, int opt);
85 int z_ValueSet(ODR o, Z_ValueSet **p, int opt);
86 int z_ValueRange(ODR o, Z_ValueRange **p, int opt);
87 int z_ValueDescription(ODR o, Z_ValueDescription **p, int opt);
88 int z_UnitInfo(ODR o, Z_UnitInfo **p, int opt);
89 int z_UnitType(ODR o, Z_UnitType **p, int opt);
90 int z_Units(ODR o, Z_Units **p, int opt);
91 int z_CategoryList(ODR o, Z_CategoryList **p, int opt);
92 int z_CategoryInfo(ODR o, Z_CategoryInfo **p, int opt);
93 int z_ExplainRecord(ODR o, Z_ExplainRecord **p, int opt);
94
95 int z_LanguageCode(ODR o, char **p, int opt)
96 {
97     return z_InternationalString(o, p, opt);
98 }
99
100 int z_CommonInfo(ODR o, Z_CommonInfo **p, int opt)
101 {
102     if (!odr_sequence_begin(o, p, sizeof(**p)))
103         return opt && odr_ok(o);
104     return
105         odr_implicit(o, odr_generalizedtime, &(*p)->dateAdded, ODR_CONTEXT, 0, 1) &&
106         odr_implicit(o, odr_generalizedtime, &(*p)->dateChanged, ODR_CONTEXT, 1, 1) &&
107         odr_implicit(o, odr_generalizedtime, &(*p)->expiry, ODR_CONTEXT, 2, 1) &&
108         odr_implicit(o, z_LanguageCode, &(*p)->humanStringLanguage, ODR_CONTEXT, 3, 1) &&
109         z_OtherInformation(o, &(*p)->otherInfo, 1) &&
110         odr_sequence_end(o);
111 }
112
113 int z_HumanStringUnit(ODR o, Z_HumanStringUnit **p, int opt)
114 {
115     if (!odr_sequence_begin(o, p, sizeof(**p)))
116         return opt && odr_ok(o);
117     return
118         odr_implicit(o, z_LanguageCode, &(*p)->language, ODR_CONTEXT, 0, 1) &&
119         odr_implicit(o, z_InternationalString, &(*p)->text, ODR_CONTEXT,
120             1, 0) &&
121         odr_sequence_end(o);
122 }
123
124 int z_HumanString(ODR o, Z_HumanString **p, int opt)
125 {
126     if (o->direction == ODR_DECODE)
127         *p = odr_malloc(o, sizeof(**p));
128     else if (!*p)
129         return opt && odr_ok(o);
130     if (odr_sequence_of(o, z_HumanStringUnit, &(*p)->strings,
131         &(*p)->num_strings))
132         return 1;
133     *p = 0;
134     return opt && odr_ok(o);
135 }
136
137 int z_IconObjectUnit(ODR o, Z_IconObjectUnit **p, int opt)
138 {
139     static Odr_arm arm[] = 
140     {
141         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IconObject_ianaType,
142             z_InternationalString},
143         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IconObject_z3950type,
144             z_InternationalString},
145         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IconObject_otherType,
146             z_InternationalString},
147         {-1, -1, -1, -1, 0}
148     };
149
150     if (!odr_sequence_begin(o, p, sizeof(**p)))
151         return opt && odr_ok(o);
152     return
153         odr_constructed_begin(o, &(*p)->bodyType, ODR_CONTEXT, 1) &&
154         odr_choice(o, arm, &(*p)->bodyType, &(*p)->which) &&
155         odr_constructed_end(o) &&
156         odr_implicit(o, odr_octetstring, &(*p)->content, ODR_CONTEXT, 2, 0) &&
157         odr_sequence_end(o);
158 }
159
160 int z_IconObject(ODR o, Z_IconObject **p, int opt)
161 {
162     if (o->direction == ODR_DECODE)
163         *p = odr_malloc(o, sizeof(**p));
164     else if (!*p)
165         return opt;
166     if (odr_sequence_of(o, z_IconObjectUnit, &(*p)->iconUnits,
167         &(*p)->num_iconUnits))
168         return 1;
169     *p = 0;
170     return opt && odr_ok(o);
171 }
172
173 int z_ContactInfo(ODR o, Z_ContactInfo **p, int opt)
174 {
175     if (!odr_sequence_begin(o, p, sizeof(**p)))
176         return opt && odr_ok(o);
177     return
178         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT, 0, 1) &&
179         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 1, 1) &&
180         odr_implicit(o, z_HumanString, &(*p)->address, ODR_CONTEXT, 2, 1) &&
181         odr_implicit(o, z_InternationalString, &(*p)->email, ODR_CONTEXT, 3, 1) &&
182         odr_implicit(o, z_InternationalString, &(*p)->phone, ODR_CONTEXT, 4, 1) &&
183         odr_sequence_end(o);
184 }
185
186 int z_NetworkAddressIA(ODR o, Z_NetworkAddressIA **p, int opt)
187 {
188     if (!odr_sequence_begin(o, p, sizeof(**p)))
189         return opt;
190     return
191         odr_implicit(o, z_InternationalString, &(*p)->hostAddress, ODR_CONTEXT, 0, 0) &&
192         odr_implicit(o, odr_integer, &(*p)->port, ODR_CONTEXT, 1, 0) &&
193         odr_sequence_end(o);
194 }
195
196 int z_NetworkAddressOPA(ODR o, Z_NetworkAddressOPA **p, int opt)
197 {
198     if (!odr_sequence_begin(o, p, sizeof(**p)))
199         return opt;
200     return
201         odr_implicit(o, z_InternationalString, &(*p)->pSel, ODR_CONTEXT, 0, 0) &&
202         odr_implicit(o, z_InternationalString, &(*p)->sSel, ODR_CONTEXT, 1, 1) &&
203         odr_implicit(o, z_InternationalString, &(*p)->tSel, ODR_CONTEXT, 2, 1) &&
204         odr_implicit(o, z_InternationalString, &(*p)->nSap, ODR_CONTEXT, 3, 0) &&
205         odr_sequence_end(o);
206 }
207
208 int z_NetworkAddressOther(ODR o, Z_NetworkAddressOther **p, int opt)
209 {
210     if (!odr_sequence_begin(o, p, sizeof(**p)))
211         return opt;
212     return
213         odr_implicit(o, z_InternationalString, &(*p)->type, ODR_CONTEXT, 0, 0) &&
214         odr_implicit(o, z_InternationalString, &(*p)->address, ODR_CONTEXT, 1, 0) &&
215         odr_sequence_end(o);
216 }
217
218 int z_NetworkAddress(ODR o, Z_NetworkAddress **p, int opt)
219 {
220     static Odr_arm arm[] =
221     {
222         {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_NetworkAddress_iA,
223             z_NetworkAddressIA},
224         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_NetworkAddress_oPA,
225             z_NetworkAddressOPA},
226         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_NetworkAddress_other,
227             z_NetworkAddressOther},
228         {-1, -1, -1, -1, 0}
229     };
230
231     if (o->direction == ODR_DECODE)
232         *p = odr_malloc(o, sizeof(**p));
233     else if (!*p)
234         return opt;
235     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
236         return 1;
237     *p = 0;
238     return opt && odr_ok(o);
239 }
240
241 int z_AccessInfo(ODR o, Z_AccessInfo **p, int opt)
242 {
243     if (!odr_sequence_begin(o, p, sizeof(**p)))
244         return opt && odr_ok(o);
245     return
246         odr_implicit_settag(o, ODR_CONTEXT, 0) &&
247         (odr_sequence_of(o, z_QueryTypeDetails, &(*p)->queryTypesSupported,
248             &(*p)->num_queryTypesSupported) || odr_ok(o)) &&
249         odr_implicit_settag(o, ODR_CONTEXT, 1) &&
250         (odr_sequence_of(o, odr_oid, &(*p)->diagnosticsSets,
251             &(*p)->num_diagnosticsSets) || odr_ok(o)) &&
252         odr_implicit_settag(o, ODR_CONTEXT, 2) &&
253         (odr_sequence_of(o, odr_oid, &(*p)->attributeSetIds,
254             &(*p)->num_attributeSetIds) || odr_ok(o)) &&
255         odr_implicit_settag(o, ODR_CONTEXT, 3) &&
256         (odr_sequence_of(o, odr_oid, &(*p)->schemas, &(*p)->num_schemas) ||
257             odr_ok(o)) &&
258         odr_implicit_settag(o, ODR_CONTEXT, 4) &&
259         (odr_sequence_of(o, odr_oid, &(*p)->recordSyntaxes,
260             &(*p)->num_recordSyntaxes) || odr_ok(o)) &&
261         odr_implicit_settag(o, ODR_CONTEXT, 5) &&
262         (odr_sequence_of(o, odr_oid, &(*p)->resourceChallenges,
263             &(*p)->num_resourceChallenges) || odr_ok(o)) &&
264         odr_implicit(o, z_AccessRestrictions, &(*p)->restrictedAccess,
265             ODR_CONTEXT, 6, 1) &&
266         odr_implicit(o, z_Costs, &(*p)->costInfo, ODR_CONTEXT, 8, 1) &&
267         odr_implicit_settag(o, ODR_CONTEXT, 9) &&
268         (odr_sequence_of(o, odr_oid, &(*p)->variantSets,
269             &(*p)->num_variantSets) || odr_ok(o)) &&
270         odr_implicit_settag(o, ODR_CONTEXT, 10) &&
271         (odr_sequence_of(o, z_ElementSetName, &(*p)->elementSetNames,
272             &(*p)->num_elementSetNames) || odr_ok(o)) &&
273         odr_implicit_settag(o, ODR_CONTEXT, 11) &&
274         (odr_sequence_of(o, z_InternationalString, &(*p)->unitSystems,
275             &(*p)->num_unitSystems) || odr_ok(o)) &&
276         odr_sequence_end(o);
277 }
278
279 int z_QueryTypeDetails(ODR o, Z_QueryTypeDetails **p, int opt)
280 {
281         static Odr_arm arm[] =
282         {
283             {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_QueryTypeDetails_private,
284                 z_PrivateCapabilities},
285             {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_QueryTypeDetails_rpn,
286                 z_RpnCapabilities},
287             {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_QueryTypeDetails_iso8777,
288                 z_Iso8777Capabilities},
289             {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_QueryTypeDetails_z3958,
290                 z_HumanString},
291             {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_QueryTypeDetails_erpn,
292                 z_RpnCapabilities},
293             {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_QueryTypeDetails_rankedList,
294                 z_HumanString},
295             {-1, -1, -1, -1, 0}
296         };
297
298         if (o->direction == ODR_DECODE)
299             *p = odr_malloc(o, sizeof(**p));
300         else if (!*p)
301             return opt;
302         if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
303             return 1;
304         *p = 0;
305         return opt && odr_ok(o);
306 }
307
308 int z_PrivateCapOperator(ODR o, Z_PrivateCapOperator **p, int opt)
309 {
310     if (!odr_sequence_begin(o, p, sizeof(**p)))
311         return opt && odr_ok(o);
312     return
313         odr_implicit(o, z_InternationalString, &(*p)->operator, ODR_CONTEXT, 0, 0) &&
314         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 1, 1) &&
315         odr_sequence_end(o);
316 }
317
318 int z_PrivateCapabilities(ODR o, Z_PrivateCapabilities **p, int opt)
319 {
320     if (!odr_sequence_begin(o, p, sizeof(**p)))
321         return opt && odr_ok(o);
322     return
323         odr_implicit_settag(o, ODR_CONTEXT, 0) &&
324         (odr_sequence_of(o, z_PrivateCapOperator, &(*p)->operators,
325             &(*p)->num_operators) || odr_ok(o)) &&
326         odr_implicit_settag(o, ODR_CONTEXT, 1) &&
327         (odr_sequence_of(o, z_SearchKey, &(*p)->searchKeys,
328             &(*p)->num_searchKeys) || odr_ok(o)) &&
329         odr_implicit_settag(o, ODR_CONTEXT, 2) &&
330         (odr_sequence_of(o, z_HumanString, &(*p)->description,
331             &(*p)->num_description) || odr_ok(o)) &&
332         odr_sequence_end(o);
333 }
334
335 int z_RpnCapabilities(ODR o, Z_RpnCapabilities **p, int opt)
336 {
337     if (!odr_sequence_begin(o, p, sizeof(**p)))
338         return opt && odr_ok(o);
339     return
340         odr_implicit_settag(o, ODR_CONTEXT, 0) &&
341         (odr_sequence_of(o, odr_integer, &(*p)->operators, &(*p)->num_operators) || odr_ok(o)) &&
342         odr_implicit(o, odr_bool, &(*p)->resultSetAsOperandSupported,
343             ODR_CONTEXT, 1, 0) &&
344         odr_implicit(o, odr_bool, &(*p)->restrictionOperandSupported,
345             ODR_CONTEXT, 2, 0) &&
346         odr_implicit(o, z_ProximitySupport, &(*p)->proximity, ODR_CONTEXT,
347             3, 1) &&
348         odr_sequence_end(o);
349 }
350
351 int z_Iso8777Capabilities(ODR o, Z_Iso8777Capabilities **p, int opt)
352 {
353     if (!odr_sequence_begin(o, p, sizeof(**p)))
354         return opt && odr_ok(o);
355     return
356         odr_implicit_settag(o, ODR_CONTEXT, 0) &&
357         odr_sequence_of(o, z_SearchKey, &(*p)->searchKeys,
358             &(*p)->num_searchKeys) &&
359         odr_implicit(o, z_HumanString, &(*p)->restrictions, ODR_CONTEXT,
360             1, 1) &&
361         odr_sequence_end(o);
362 }
363
364 int z_ProxSupportPrivate(ODR o, Z_ProxSupportPrivate **p, int opt)
365 {
366     if (!odr_sequence_begin(o, p, sizeof(**p)))
367         return opt && odr_ok(o);
368     return
369         odr_implicit(o, odr_integer, &(*p)->unit, ODR_CONTEXT, 0, 0) &&
370         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 1, 1) &&
371         odr_sequence_end(o);
372 }
373
374 int z_ProxSupportUnit(ODR o, Z_ProxSupportUnit **p, int opt)
375 {
376     static Odr_arm arm[] =
377     {
378         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ProxSupportUnit_known,
379             odr_integer},
380         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ProxSupportUnit_private,
381             z_ProxSupportPrivate},
382         {-1, -1, -1, -1, 0}
383     };
384
385     if (o->direction == ODR_DECODE)
386         *p = odr_malloc(o, sizeof(**p));
387     else if (!*p)
388         return opt;
389     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
390         return 1;
391     *p = 0;
392     return opt && odr_ok(o);
393 }
394
395 int z_ProximitySupport(ODR o, Z_ProximitySupport **p, int opt)
396 {
397     if (!odr_sequence_begin(o, p, sizeof(**p)))
398         return opt && odr_ok(o);
399     return
400         odr_implicit(o, odr_bool, &(*p)->anySupport, ODR_CONTEXT, 0, 0) &&
401         odr_implicit_settag(o, ODR_CONTEXT, 1) &&
402         (odr_sequence_of(o, z_ProxSupportUnit, &(*p)->unitsSupported,
403             &(*p)->num_unitsSupported) || odr_ok(o)) &&
404         odr_sequence_end(o);
405 }
406
407 int z_SearchKey(ODR o, Z_SearchKey **p, int opt)
408 {
409     if (!odr_sequence_begin(o, p, sizeof(**p)))
410         return opt && odr_ok(o);
411     return
412         odr_implicit(o, z_InternationalString, &(*p)->searchKey, ODR_CONTEXT, 0, 0) &&
413         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 1, 1) &&
414         odr_sequence_end(o);
415 }
416
417 int z_AccessRestrictionsUnit(ODR o, Z_AccessRestrictionsUnit **p, int opt)
418 {
419     if (!odr_sequence_begin(o, p, sizeof(**p)))
420         return opt && odr_ok(o);
421     return
422         odr_explicit(o, odr_integer, &(*p)->accessType, ODR_CONTEXT, 0, 0) &&
423         odr_implicit(o, z_HumanString, &(*p)->accessText, ODR_CONTEXT, 1, 1) &&
424         odr_implicit_settag(o, ODR_CONTEXT, 2) &&
425         (odr_sequence_of(o, odr_oid, &(*p)->accessChallenges,
426             &(*p)->num_accessChallenges) || odr_ok(o)) &&
427         odr_sequence_end(o);
428 }
429
430 int z_AccessRestrictions(ODR o, Z_AccessRestrictions **p, int opt)
431 {
432     if (o->direction == ODR_DECODE)
433         *p = odr_malloc(o, sizeof(**p));
434     else if (!*p)
435         return opt;
436     if (odr_sequence_of(o, z_AccessRestrictionsUnit, &(*p)->restrictions,
437         &(*p)->num_restrictions))
438         return 1;
439     *p = 0;
440     return opt && odr_ok(o);
441 }
442
443 int z_CostsOtherCharge(ODR o, Z_CostsOtherCharge **p, int opt)
444 {
445     if (!odr_sequence_begin(o, p, sizeof(**p)))
446         return opt && odr_ok(o);
447     return
448         odr_implicit(o, z_HumanString, &(*p)->forWhat, ODR_CONTEXT, 1, 0) &&
449         odr_implicit(o, z_Charge, &(*p)->charge, ODR_CONTEXT, 2, 1) &&
450         odr_sequence_end(o);
451 }
452         
453 int z_Costs(ODR o, Z_Costs **p, int opt)
454 {
455     if (!odr_sequence_begin(o, p, sizeof(**p)))
456         return opt && odr_ok(o);
457     return
458         odr_implicit(o, z_Charge, &(*p)->connectCharge, ODR_CONTEXT, 0, 1) &&
459         odr_implicit(o, z_Charge, &(*p)->connectTime, ODR_CONTEXT, 1, 1) &&
460         odr_implicit(o, z_Charge, &(*p)->displayCharge, ODR_CONTEXT, 2, 1) &&
461         odr_implicit(o, z_Charge, &(*p)->searchCharge, ODR_CONTEXT, 3, 1) &&
462         odr_implicit(o, z_Charge, &(*p)->subscriptCharge, ODR_CONTEXT, 4, 1) &&
463         odr_implicit_settag(o, ODR_CONTEXT, 5) &&
464         (odr_sequence_of(o, z_CostsOtherCharge, &(*p)->otherCharges,
465             &(*p)->num_otherCharges) || odr_ok(o)) &&
466         odr_sequence_end(o);
467 }
468
469 int z_Charge(ODR o, Z_Charge **p, int opt)
470 {
471     if (!odr_sequence_begin(o, p, sizeof(**p)))
472         return opt && odr_ok(o);
473     return
474         odr_implicit(o, z_IntUnit, &(*p)->cost, ODR_CONTEXT, 1, 0) &&
475         odr_implicit(o, z_Unit, &(*p)->perWhat, ODR_CONTEXT, 2, 1) &&
476         odr_implicit(o, z_HumanString, &(*p)->text, ODR_CONTEXT, 3, 1) &&
477         odr_sequence_end(o);
478 }
479
480 int z_DatabaseList(ODR o, Z_DatabaseList **p, int opt)
481 {
482     if (o->direction == ODR_DECODE)
483         *p = odr_malloc(o, sizeof(**p));
484     else if (!*p)
485         return opt;
486     if (odr_sequence_of(o, z_DatabaseName, &(*p)->databases,
487         &(*p)->num_databases))
488         return 1;
489     *p = 0;
490     return opt && odr_ok(o);
491 }
492
493 int z_AttributeCombinations(ODR o, Z_AttributeCombinations **p, int opt)
494 {
495     if (!odr_sequence_begin(o, p, sizeof(**p)))
496         return opt && odr_ok(o);
497     return
498         odr_implicit(o, odr_oid, &(*p)->defaultAttributeSet,
499             ODR_CONTEXT, 0, 0) &&
500         odr_implicit_settag(o, ODR_CONTEXT, 1) &&
501         odr_sequence_of(o, z_AttributeCombination, &(*p)->legalCombinations,
502             &(*p)->num_legalCombinations) &&
503         odr_sequence_end(o);
504 }
505
506 int z_AttributeCombination(ODR o, Z_AttributeCombination **p, int opt)
507 {
508     if (o->direction == ODR_DECODE)
509         *p = odr_malloc(o, sizeof(**p));
510     else if (!*p)
511         return opt;
512     if (odr_sequence_of(o, z_AttributeOccurrence, &(*p)->occurrences,
513         &(*p)->num_occurrences))
514         return 1;
515     *p = 0;
516     return opt && odr_ok(o);
517 }
518
519 int z_AttributeValueList(ODR o, Z_AttributeValueList **p, int opt)
520 {
521     if (o->direction == ODR_DECODE)
522         *p = odr_malloc(o, sizeof(**p));
523     else if (!*p)
524         return opt;
525     if (odr_sequence_of(o, z_StringOrNumeric, &(*p)->attributes,
526         &(*p)->num_attributes))
527         return 1;
528     *p = 0;
529     return opt && odr_ok(o);
530 }
531
532 int z_AttributeOccurrence(ODR o, Z_AttributeOccurrence **p, int opt)
533 {
534     static Odr_arm arm[] =
535     {
536         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_AttributeOcc_anyOrNone, odr_null},
537         {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_AttributeOcc_specific,
538             z_AttributeValueList},
539         {-1, -1, -1, -1, 0}
540     };
541
542     if (!odr_sequence_begin(o, p, sizeof(**p)))
543         return opt && odr_ok(o);
544     return
545         odr_implicit(o, odr_oid, &(*p)->attributeSet, ODR_CONTEXT, 0, 1) &&
546         odr_implicit(o, odr_integer, &(*p)->attributeType, ODR_CONTEXT, 1, 0) &&
547         odr_implicit(o, odr_null, &(*p)->mustBeSupplied, ODR_CONTEXT, 2, 1) &&
548         odr_choice(o, arm, &(*p)->attributeValues, &(*p)->which) &&
549         odr_sequence_end(o);
550 }
551
552 int z_AttributeValue(ODR o, Z_AttributeValue **p, int opt)
553 {
554     if (!odr_sequence_begin(o, p, sizeof(**p)))
555         return opt && odr_ok(o);
556     return
557         odr_explicit(o, z_StringOrNumeric, &(*p)->value, ODR_CONTEXT, 0, 0) &&
558         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 1, 1) &&
559         odr_implicit_settag(o, ODR_CONTEXT, 2) &&
560         (odr_sequence_of(o, z_StringOrNumeric, &(*p)->subAttributes,
561             &(*p)->num_subAttributes) || odr_ok(o)) &&
562         odr_implicit_settag(o, ODR_CONTEXT, 3) &&
563         (odr_sequence_of(o, z_StringOrNumeric, &(*p)->superAttributes,
564             &(*p)->num_superAttributes) || odr_ok(o)) &&
565         odr_implicit(o, odr_null, &(*p)->partialSupport, ODR_CONTEXT, 4, 1) &&
566         odr_sequence_end(o);
567 }
568
569
570
571 int z_TargetInfo(ODR o, Z_TargetInfo **p, int opt)
572 {
573     if (!odr_sequence_begin(o, p, sizeof(**p)))
574         return opt && odr_ok(o);
575     return
576         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
577         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT,
578             1, 0) &&
579         odr_implicit(o, z_HumanString, &(*p)->recentNews, ODR_CONTEXT, 2, 1) &&
580         odr_implicit(o, z_IconObject, &(*p)->icon, ODR_CONTEXT, 3, 1) &&
581         odr_implicit(o, odr_bool, &(*p)->namedResultSets, ODR_CONTEXT, 4, 0) &&
582         odr_implicit(o, odr_bool, &(*p)->multipleDBsearch, ODR_CONTEXT, 5, 0) &&
583         odr_implicit(o, odr_integer, &(*p)->maxResultSets, ODR_CONTEXT, 6, 1) &&
584         odr_implicit(o, odr_integer, &(*p)->maxResultSize, ODR_CONTEXT, 7, 1) &&
585         odr_implicit(o, odr_integer, &(*p)->maxTerms, ODR_CONTEXT, 8, 1) &&
586         odr_implicit(o, z_IntUnit, &(*p)->timeoutInterval, ODR_CONTEXT, 9, 1) &&
587         odr_implicit(o, z_HumanString, &(*p)->welcomeMessage, ODR_CONTEXT,
588             10, 1) &&
589         odr_implicit(o, z_ContactInfo, &(*p)->contactInfo, ODR_CONTEXT,
590             11, 1) &&
591         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT,
592             12, 1) &&
593         odr_implicit_settag(o, ODR_CONTEXT, 13) &&
594         (odr_sequence_of(o, z_InternationalString, &(*p)->nicknames,
595             &(*p)->num_nicknames) || odr_ok(o)) &&
596         odr_implicit(o, z_HumanString, &(*p)->usageRest, ODR_CONTEXT, 14, 1) &&
597         odr_implicit(o, z_HumanString, &(*p)->paymentAddr, ODR_CONTEXT,
598             15, 1) &&
599         odr_implicit(o, z_HumanString, &(*p)->hours, ODR_CONTEXT, 16, 1) &&
600         odr_implicit_settag(o, ODR_CONTEXT, 17) &&
601         (odr_sequence_of(o, z_DatabaseList, &(*p)->dbCombinations,
602             &(*p)->num_dbCombinations) || odr_ok(o)) &&
603         odr_implicit_settag(o, ODR_CONTEXT, 18) &&
604         (odr_sequence_of(o, z_NetworkAddress, &(*p)->addresses,
605             &(*p)->num_addresses) || odr_ok(o)) &&
606         odr_implicit(o, z_AccessInfo, &(*p)->commonAccessInfo, ODR_CONTEXT,
607             19, 1) &&
608         odr_sequence_end(o);
609 }
610
611 int z_DatabaseInfo(ODR o, Z_DatabaseInfo **p, int opt)
612 {
613     static Odr_arm arm[] =
614     {
615         {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_Exp_RecordCount_actualNumber,
616             odr_integer},
617         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Exp_RecordCount_approxNumber,
618             odr_integer},
619         {-1, -1, -1, -1, 0}
620     };
621
622     if (!odr_sequence_begin(o, p, sizeof(**p)))
623         return opt && odr_ok(o);
624     return
625         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
626         odr_implicit(o, z_DatabaseName, &(*p)->name, ODR_CONTEXT, 1, 0) &&
627         odr_implicit(o, odr_null, &(*p)->explainDatabase, ODR_CONTEXT, 2, 1) &&
628         odr_implicit_settag(o, ODR_CONTEXT, 3) &&
629         (odr_sequence_of(o, z_DatabaseName, &(*p)->nicknames,
630             &(*p)->num_nicknames) || odr_ok(o)) &&
631         odr_implicit(o, z_IconObject, &(*p)->icon, ODR_CONTEXT, 4, 1) &&
632         odr_implicit(o, odr_bool, &(*p)->userFee, ODR_CONTEXT, 5, 0) &&
633         odr_implicit(o, odr_bool, &(*p)->available, ODR_CONTEXT, 6, 0) &&
634         odr_implicit(o, z_HumanString, &(*p)->titleString, ODR_CONTEXT, 7, 1) &&
635         odr_implicit_settag(o, ODR_CONTEXT, 8) &&
636         (odr_sequence_of(o, z_HumanString, &(*p)->keywords,
637             &(*p)->num_keywords) || odr_ok(o)) &&
638         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 9, 1) &&
639         odr_implicit(o, z_DatabaseList, &(*p)->associatedDbs, ODR_CONTEXT,
640             10, 1) &&
641         odr_implicit(o, z_DatabaseList, &(*p)->subDbs, ODR_CONTEXT, 11, 1) &&
642         odr_implicit(o, z_HumanString, &(*p)->disclaimers, ODR_CONTEXT,
643             12, 1) &&
644         odr_implicit(o, z_HumanString, &(*p)->news, ODR_CONTEXT, 13, 1) &&
645         ((odr_constructed_begin(o, p, ODR_CONTEXT, 14) &&
646             odr_choice(o, arm, &(*p)->recordCount, &(*p)->recordCount_which) &&
647             odr_constructed_end(o)) || odr_ok(o)) &&
648         odr_implicit(o, z_HumanString, &(*p)->defaultOrder, ODR_CONTEXT,
649             15, 1) &&
650         odr_implicit(o, odr_integer, &(*p)->avRecordSize, ODR_CONTEXT, 16, 1) &&
651         odr_implicit(o, odr_integer, &(*p)->maxRecordSize, ODR_CONTEXT,
652             17, 1) &&
653         odr_implicit(o, z_HumanString, &(*p)->hours, ODR_CONTEXT, 18, 1) &&
654         odr_implicit(o, z_HumanString, &(*p)->bestTime, ODR_CONTEXT, 19, 1) &&
655         odr_implicit(o, odr_generalizedtime, &(*p)->lastUpdate, ODR_CONTEXT,
656             20, 1) &&
657         odr_implicit(o, z_IntUnit, &(*p)->updateInterval, ODR_CONTEXT, 21, 1) &&
658         odr_implicit(o, z_HumanString, &(*p)->coverage, ODR_CONTEXT, 22, 1) &&
659         odr_implicit(o, odr_bool, &(*p)->proprietary, ODR_CONTEXT, 23, 1) &&
660         odr_implicit(o, z_HumanString, &(*p)->copyrightText, ODR_CONTEXT,
661             24, 1) &&
662         odr_implicit(o, z_HumanString, &(*p)->copyrightNotice, ODR_CONTEXT,
663             25, 1) &&
664         odr_implicit(o, z_ContactInfo, &(*p)->producerContactInfo, ODR_CONTEXT,
665             26, 1) &&
666         odr_implicit(o, z_ContactInfo, &(*p)->supplierContactInfo, ODR_CONTEXT,
667             27, 1) &&
668         odr_implicit(o, z_ContactInfo, &(*p)->submissionContactInfo,
669             ODR_CONTEXT, 28, 1) &&
670         odr_implicit(o, z_AccessInfo, &(*p)->accessInfo, ODR_CONTEXT, 29, 1) &&
671         odr_sequence_end(o);
672 }
673
674 int z_TagTypeMapping(ODR o, Z_TagTypeMapping **p, int opt)
675 {
676     if (!odr_sequence_begin(o, p, sizeof(**p)))
677         return opt;
678     return
679         odr_implicit(o, odr_integer, &(*p)->tagType, ODR_CONTEXT, 0, 0) &&
680         odr_implicit(o, odr_oid, &(*p)->tagSet, ODR_CONTEXT, 1, 1) &&
681         odr_implicit(o, odr_null, &(*p)->defaultTagType, ODR_CONTEXT, 2, 1) &&
682         odr_sequence_end(o);
683 }
684
685 int z_SchemaInfo(ODR o, Z_SchemaInfo **p, int opt)
686 {
687     if (!odr_sequence_begin(o, p, sizeof(**p)))
688         return opt && odr_ok(o);
689     return
690         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
691         odr_implicit(o, odr_oid, &(*p)->schema, ODR_CONTEXT, 1, 0) &&
692         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT,
693             2, 0) &&
694         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 3, 1) &&
695         odr_implicit_settag(o, ODR_CONTEXT, 4) &&
696         (odr_sequence_of(o, z_TagTypeMapping, &(*p)->tagTypeMapping,
697             &(*p)->num_tagTypeMapping) || odr_ok(o)) &&
698         odr_implicit_settag(o, ODR_CONTEXT, 5) &&
699         (odr_sequence_of(o, z_ElementInfo, &(*p)->recordStructure,
700             &(*p)->num_recordStructure) || odr_ok(o)) &&
701         odr_sequence_end(o);
702 }
703
704 int z_ElementInfo(ODR o, Z_ElementInfo **p, int opt)
705 {
706     if (!odr_sequence_begin(o, p, sizeof(**p)))
707         return opt && odr_ok(o);
708     return
709         odr_implicit(o, z_InternationalString, &(*p)->elementName, ODR_CONTEXT, 1, 0) &&
710         odr_implicit(o, z_Path, &(*p)->elementTagPath, ODR_CONTEXT, 2, 0) &&
711         odr_explicit(o, z_ElementDataType, &(*p)->dataType, ODR_CONTEXT, 3, 1) &&
712         odr_implicit(o, odr_bool, &(*p)->required, ODR_CONTEXT, 4, 0) &&
713         odr_implicit(o, odr_bool, &(*p)->repeatable, ODR_CONTEXT, 5, 0) &&
714         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 6, 1) &&
715         odr_sequence_end(o);
716 }
717
718 int z_PathUnit(ODR o, Z_PathUnit **p, int opt)
719 {
720     if (!odr_sequence_begin(o, p, sizeof(**p)))
721         return opt;
722     return
723         odr_implicit(o, odr_integer, &(*p)->tagType, ODR_CONTEXT, 1, 0) &&
724         odr_explicit(o, z_StringOrNumeric, &(*p)->tagValue, ODR_CONTEXT,
725             2, 0) &&
726         odr_sequence_end(o);
727 }
728
729 int z_Path(ODR o, Z_Path **p, int opt)
730 {
731     if (o->direction == ODR_DECODE)
732         *p = odr_malloc(o, sizeof(**p));
733     else if (!*p)
734         return opt;
735     odr_implicit_settag(o, ODR_CONTEXT, 201);
736     if (odr_sequence_of(o, z_OtherInformationUnit, &(*p)->list,
737         &(*p)->num))
738         return 1;
739     *p = 0;
740     return opt && odr_ok(o);
741 }
742
743 int z_ElementInfoList(ODR o, Z_Path **p, int opt)
744 {
745     if (o->direction == ODR_DECODE)
746         *p = odr_malloc(o, sizeof(**p));
747     else if (!*p)
748         return opt;
749     odr_implicit_settag(o, ODR_CONTEXT, 201);
750     if (odr_sequence_of(o, z_OtherInformationUnit, &(*p)->list,
751         &(*p)->num))
752         return 1;
753     *p = 0;
754     return opt && odr_ok(o);
755 }
756
757 int z_ElementDataType(ODR o, Z_ElementDataType **p, int opt)
758 {
759     static Odr_arm arm[] =
760     {
761         {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ElementDataType_primitive,
762             odr_integer},
763         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementDataType_structured,
764             z_ElementInfoList},
765         {-1, -1, -1, -1, 0}
766     };
767
768     if (o->direction == ODR_DECODE)
769         *p = odr_malloc(o, sizeof(**p));
770     else if (!*p)
771         return opt;
772
773     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
774         return 1;
775     *p = 0;
776     return opt && odr_ok(o);
777 }
778
779 int z_TagSetInfoElements(ODR o, Z_TagSetInfoElements **p, int opt)
780 {
781     if (!odr_sequence_begin(o, p, sizeof(**p)))
782         return opt;
783     return
784         odr_implicit(o, z_InternationalString, &(*p)->elementName,
785             ODR_CONTEXT, 1, 0) &&
786         odr_implicit_settag(o, ODR_CONTEXT, 2) &&
787         (odr_sequence_of(o, z_InternationalString, &(*p)->nicknames,
788             &(*p)->num_nicknames) || odr_ok(o)) &&
789         odr_explicit(o, z_StringOrNumeric, &(*p)->elementTag, ODR_CONTEXT,
790             3, 0) &&
791         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT,
792             4, 1) &&
793         odr_implicit(o, odr_integer, &(*p)->dataType, ODR_CONTEXT, 5, 1) &&
794         z_OtherInformation(o, &(*p)->otherTagInfo, 1) &&
795         odr_sequence_end(o);
796 }
797
798 int z_TagSetInfo(ODR o, Z_TagSetInfo **p, int opt)
799 {
800     if (!odr_sequence_begin(o, p, sizeof(**p)))
801         return opt && odr_ok(o);
802     return
803         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
804         odr_implicit(o, odr_oid, &(*p)->tagSet, ODR_CONTEXT, 1, 0) &&
805         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT,
806             2, 0) &&
807         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT,
808             3, 1) &&
809         odr_implicit_settag(o, ODR_CONTEXT, 4) &&
810         (odr_sequence_of(o, z_TagSetInfoElements, &(*p)->elements,
811             &(*p)->num_elements) || odr_ok(o)) &&
812         odr_sequence_end(o);
813 }
814
815 int z_RecordSyntaxInfo(ODR o, Z_RecordSyntaxInfo **p, int opt)
816 {
817     if (!odr_sequence_begin(o, p, sizeof(**p)))
818         return opt && odr_ok(o);
819     return
820         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
821         odr_implicit(o, odr_oid, &(*p)->recordSyntax, ODR_CONTEXT, 1, 0) &&
822         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT,
823             2, 0) &&
824         odr_implicit_settag(o, ODR_CONTEXT, 3) &&
825         (odr_sequence_of(o, odr_oid, &(*p)->transferSyntaxes,
826             &(*p)->num_transferSyntaxes) || odr_ok(o)) &&
827         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 4, 1) &&
828         odr_implicit(o, z_InternationalString, &(*p)->asn1Module, ODR_CONTEXT,
829             5, 1) &&
830         odr_implicit_settag(o, ODR_CONTEXT, 6) &&
831         (odr_sequence_of(o, z_ElementInfo, &(*p)->abstractStructure,
832             &(*p)->num_abstractStructure) || odr_ok(o)) &&
833         odr_sequence_end(o);
834 }
835
836 int z_AttributeSetInfo(ODR o, Z_AttributeSetInfo **p, int opt)
837 {
838     if (!odr_sequence_begin(o, p, sizeof(**p)))
839         return opt && odr_ok(o);
840     return
841         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
842         odr_implicit(o, odr_oid, &(*p)->attributeSet, ODR_CONTEXT, 1, 0) &&
843         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT, 2, 0) &&
844         odr_implicit_settag(o, ODR_CONTEXT, 3) &&
845         (odr_sequence_of(o, z_AttributeType, &(*p)->attributes,
846             &(*p)->num_attributes) || odr_ok(o)) &&
847         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 4, 1) &&
848         odr_sequence_end(o);
849 }
850
851 int z_AttributeType(ODR o, Z_AttributeType **p, int opt)
852 {
853     if (!odr_sequence_begin(o, p, sizeof(**p)))
854         return opt && odr_ok(o);
855     return
856         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT, 0, 1) &&
857         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 1, 1) &&
858         odr_implicit(o, odr_integer, &(*p)->attributeType, ODR_CONTEXT, 2, 0) &&
859         odr_implicit_settag(o, ODR_CONTEXT, 3) &&
860         odr_sequence_of(o, z_AttributeDescription, &(*p)->attributeValues,
861             &(*p)->num_attributeValues) &&
862         odr_sequence_end(o);
863 }
864
865 int z_AttributeDescription(ODR o, Z_AttributeDescription **p, int opt)
866 {
867     if (!odr_sequence_begin(o, p, sizeof(**p)))
868         return opt && odr_ok(o);
869     return
870         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT, 0, 1) &&
871         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 1, 1) &&
872         odr_explicit(o, z_StringOrNumeric, &(*p)->attributeValue, ODR_CONTEXT, 2, 0) &&
873         odr_implicit_settag(o, ODR_CONTEXT, 3) &&
874         (odr_sequence_of(o, z_StringOrNumeric, &(*p)->equivalentAttributes,
875             &(*p)->num_equivalentAttributes) || odr_ok(o)) &&
876         odr_sequence_end(o);
877 }
878
879 int z_TermListElement(ODR o, Z_TermListElement **p, int opt)
880 {
881     if (!odr_sequence_begin(o, p, sizeof(**p)))
882         return opt && odr_ok(o);
883     return
884         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT, 1, 0) &&
885         odr_implicit(o, z_HumanString, &(*p)->title, ODR_CONTEXT, 2, 1) &&
886         odr_implicit(o, odr_integer, &(*p)->searchCost, ODR_CONTEXT, 3, 1) &&
887         odr_implicit(o, odr_bool, &(*p)->scanable, ODR_CONTEXT, 4, 0) &&
888         odr_implicit_settag(o, ODR_CONTEXT, 5) &&
889         (odr_sequence_of(o, z_InternationalString, &(*p)->broader,
890             &(*p)->num_broader) || odr_ok(o)) &&
891         odr_implicit_settag(o, ODR_CONTEXT, 6) &&
892         (odr_sequence_of(o, z_InternationalString, &(*p)->narrower,
893             &(*p)->num_narrower) || odr_ok(o)) &&
894         odr_sequence_end(o);
895 }
896
897 int z_TermListInfo(ODR o, Z_TermListInfo **p, int opt)
898 {
899     if (!odr_sequence_begin(o, p, sizeof(**p)))
900         return opt && odr_ok(o);
901     return
902         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
903         odr_implicit(o, z_DatabaseName, &(*p)->databaseName, ODR_CONTEXT,
904             1, 0) &&
905         odr_implicit_settag(o, ODR_CONTEXT, 2) &&
906         (odr_sequence_of(o, z_TermListElement, &(*p)->termLists,
907             &(*p)->num_termLists) || odr_ok(o)) &&
908         odr_sequence_end(o);
909 }
910
911 int z_ExtendedServicesInfo(ODR o, Z_ExtendedServicesInfo **p, int opt)
912 {
913     if (!odr_sequence_begin(o, p, sizeof(**p)))
914         return opt && odr_ok(o);
915     return
916         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
917         odr_implicit(o, odr_oid, &(*p)->type, ODR_CONTEXT, 1, 0) &&
918         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT, 2, 1) &&
919         odr_implicit(o, odr_bool, &(*p)->privateType, ODR_CONTEXT, 3, 0) &&
920         odr_implicit(o, odr_bool, &(*p)->restrictionsApply, ODR_CONTEXT, 5, 0) &&
921         odr_implicit(o, odr_bool, &(*p)->feeApply, ODR_CONTEXT, 6, 0) &&
922         odr_implicit(o, odr_bool, &(*p)->available, ODR_CONTEXT, 7, 0) &&
923         odr_implicit(o, odr_bool, &(*p)->retentionSupported, ODR_CONTEXT, 8, 0) &&
924         odr_implicit(o, odr_integer, &(*p)->waitAction, ODR_CONTEXT, 9, 0) &&
925         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 10, 1) &&
926         odr_implicit(o, odr_external, &(*p)->specificExplain, ODR_CONTEXT, 11, 1) &&
927         odr_implicit(o, z_InternationalString, &(*p)->esASN, ODR_CONTEXT, 12, 1) &&
928         odr_sequence_end(o);
929 }
930
931 int z_AttributeDetails(ODR o, Z_AttributeDetails **p, int opt)
932 {
933     if (!odr_sequence_begin(o, p, sizeof(**p)))
934         return opt && odr_ok(o);
935     return
936         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
937         odr_implicit(o, z_DatabaseName, &(*p)->databaseName, ODR_CONTEXT, 1, 0) &&
938         odr_implicit_settag(o, ODR_CONTEXT, 2) &&
939         (odr_sequence_of(o, z_AttributeSetDetails, &(*p)->attributesBySet,
940             &(*p)->num_attributesBySet) && odr_ok(o)) &&
941         odr_implicit(o, z_AttributeCombinations, &(*p)->attributeCombinations, ODR_CONTEXT, 3, 1) &&
942         odr_sequence_end(o);
943 }
944
945 int z_AttributeSetDetails(ODR o, Z_AttributeSetDetails **p, int opt)
946 {
947     if (!odr_sequence_begin(o, p, sizeof(**p)))
948         return opt && odr_ok(o);
949     return
950         odr_implicit(o, odr_oid, &(*p)->attributeSet, ODR_CONTEXT,
951             0, 0) &&
952         odr_implicit_settag(o, ODR_CONTEXT, 1) &&
953         odr_sequence_of(o, z_AttributeTypeDetails, &(*p)->attributesByType,
954             &(*p)->num_attributesByType) &&
955         odr_sequence_end(o);
956 }
957
958 int z_AttributeTypeDetails(ODR o, Z_AttributeTypeDetails **p, int opt)
959 {
960     if (!odr_sequence_begin(o, p, sizeof(**p)))
961         return opt && odr_ok(o);
962     return
963         odr_implicit(o, odr_integer, &(*p)->attributeType, ODR_CONTEXT, 0, 0) &&
964         odr_implicit(o, z_OmittedAttributeInterpretation, &(*p)->optionalType, ODR_CONTEXT, 1, 1) &&
965         odr_implicit_settag(o, ODR_CONTEXT, 2) &&
966         (odr_sequence_of(o, z_AttributeValue, &(*p)->attributeValues,
967             &(*p)->num_attributeValues) || odr_ok(o)) &&
968         odr_sequence_end(o);
969 }
970
971 int z_OmittedAttributeInterpretation(ODR o, Z_OmittedAttributeInterpretation **p, int opt)
972 {
973     if (!odr_sequence_begin(o, p, sizeof(**p)))
974         return opt && odr_ok(o);
975     return
976         odr_explicit(o, z_StringOrNumeric, &(*p)->defaultValue, ODR_CONTEXT, 0, 1) &&
977         odr_implicit(o, z_HumanString, &(*p)->defaultDescription, ODR_CONTEXT, 1, 1) &&
978         odr_sequence_end(o);
979 }
980
981 int z_EScanInfo(ODR o, Z_EScanInfo **p, int opt)
982 {
983     if (!odr_sequence_begin(o, p, sizeof(**p)))
984         return opt && odr_ok(o);
985     return
986         odr_implicit(o, odr_integer, &(*p)->maxStepSize, ODR_CONTEXT, 0, 1) &&
987         odr_implicit(o, z_HumanString, &(*p)->collatingSequence, ODR_CONTEXT, 1, 1) &&
988         odr_implicit(o, odr_bool, &(*p)->increasing, ODR_CONTEXT, 2, 1) &&
989         odr_sequence_end(o);
990 }
991
992 int z_TermListDetails(ODR o, Z_TermListDetails **p, int opt)
993 {
994     if (!odr_sequence_begin(o, p, sizeof(**p)))
995         return opt && odr_ok(o);
996     return
997         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
998         odr_implicit(o, z_InternationalString, &(*p)->termListName, ODR_CONTEXT, 1, 0) &&
999         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 2, 1) &&
1000         odr_implicit(o, z_AttributeCombinations, &(*p)->attributes, ODR_CONTEXT, 3, 1) &&
1001         odr_implicit(o, z_EScanInfo, &(*p)->scanInfo, ODR_CONTEXT, 4, 1) &&
1002         odr_implicit(o, odr_integer, &(*p)->estNumberTerms, ODR_CONTEXT, 5, 1) &&
1003         odr_implicit_settag(o, ODR_CONTEXT, 6) &&
1004         (odr_sequence_of(o, z_Term, &(*p)->sampleTerms,
1005             &(*p)->num_sampleTerms) || odr_ok(o)) &&
1006         odr_sequence_end(o);
1007 }
1008
1009 int z_ElementSetDetails(ODR o, Z_ElementSetDetails **p, int opt)
1010 {
1011     if (!odr_sequence_begin(o, p, sizeof(**p)))
1012         return opt && odr_ok(o);
1013     return
1014         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
1015         odr_implicit(o, z_DatabaseName, &(*p)->databaseName, ODR_CONTEXT, 1, 0) &&
1016         odr_implicit(o, z_ElementSetName, &(*p)->elementSetName, ODR_CONTEXT, 2, 0) &&
1017         odr_implicit(o, odr_oid, &(*p)->recordSyntax, ODR_CONTEXT, 3, 0) &&
1018         odr_implicit(o, odr_oid, &(*p)->schema, ODR_CONTEXT, 4, 0) &&
1019         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 5, 1) &&
1020         odr_implicit_settag(o, ODR_CONTEXT, 6) &&
1021         (odr_sequence_of(o, z_PerElementDetails, &(*p)->detailsPerElement, &(*p)->num_detailsPerElement) || odr_ok(o)) &&
1022         odr_sequence_end(o);
1023 }
1024
1025 int z_RetrievalRecordDetails(ODR o, Z_RetrievalRecordDetails **p, int opt)
1026 {
1027     if (!odr_sequence_begin(o, p, sizeof(**p)))
1028         return opt && odr_ok(o);
1029     return
1030         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
1031         odr_implicit(o, z_DatabaseName, &(*p)->databaseName, ODR_CONTEXT, 1, 0) &&
1032         odr_implicit(o, odr_oid, &(*p)->schema, ODR_CONTEXT, 2, 0) &&
1033         odr_implicit(o, odr_oid, &(*p)->recordSyntax, ODR_CONTEXT, 3, 0) &&
1034         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 4, 1) &&
1035         odr_implicit_settag(o, ODR_CONTEXT, 5) &&
1036         (odr_sequence_of(o, z_PerElementDetails, &(*p)->detailsPerElement,
1037             &(*p)->num_detailsPerElement) || odr_ok(o)) &&
1038         odr_sequence_end(o);
1039 }
1040
1041 int z_PerElementDetails(ODR o, Z_PerElementDetails **p, int opt)
1042 {
1043     if (!odr_sequence_begin(o, p, sizeof(**p)))
1044         return opt && odr_ok(o);
1045     return
1046         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT, 0, 1) &&
1047         odr_implicit(o, z_RecordTag, &(*p)->recordTag, ODR_CONTEXT, 1, 1) &&
1048         odr_implicit_settag(o, ODR_CONTEXT, 2) &&
1049         (odr_sequence_of(o, z_Path, &(*p)->schemaTags, &(*p)->num_schemaTags) ||
1050         odr_ok(o)) &&
1051         odr_implicit(o, odr_integer, &(*p)->maxSize, ODR_CONTEXT, 3, 1) &&
1052         odr_implicit(o, odr_integer, &(*p)->minSize, ODR_CONTEXT, 4, 1) &&
1053         odr_implicit(o, odr_integer, &(*p)->avgSize, ODR_CONTEXT, 5, 1) &&
1054         odr_implicit(o, odr_integer, &(*p)->fixedSize, ODR_CONTEXT, 6, 1) &&
1055         odr_implicit(o, odr_bool, &(*p)->repeatable, ODR_CONTEXT, 8, 0) &&
1056         odr_implicit(o, odr_bool, &(*p)->required, ODR_CONTEXT, 9, 0) &&
1057         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 12, 1) &&
1058         odr_implicit(o, z_HumanString, &(*p)->contents, ODR_CONTEXT, 13, 1) &&
1059         odr_implicit(o, z_HumanString, &(*p)->billingInfo, ODR_CONTEXT, 14, 1) &&
1060         odr_implicit(o, z_HumanString, &(*p)->restrictions, ODR_CONTEXT, 15, 1) &&
1061         odr_implicit_settag(o, ODR_CONTEXT, 16) &&
1062         (odr_sequence_of(o, z_InternationalString, &(*p)->alternateNames,
1063             &(*p)->num_alternateNames) || odr_ok(o)) &&
1064         odr_implicit_settag(o, ODR_CONTEXT, 17) &&
1065         (odr_sequence_of(o, z_InternationalString, &(*p)->genericNames,
1066             &(*p)->num_genericNames) || odr_ok(o)) &&
1067         odr_implicit(o, z_AttributeCombinations, &(*p)->searchAccess,
1068             ODR_CONTEXT, 18, 1) &&
1069         odr_sequence_end(o);
1070 }
1071
1072 int z_RecordTag(ODR o, Z_RecordTag **p, int opt)
1073 {
1074     if (!odr_sequence_begin(o, p, sizeof(**p)))
1075         return opt && odr_ok(o);
1076     return
1077         odr_explicit(o, z_StringOrNumeric, &(*p)->qualifier, ODR_CONTEXT,
1078             0, 1) &&
1079         odr_explicit(o, z_StringOrNumeric, &(*p)->tagValue, ODR_CONTEXT,
1080             1, 0) &&
1081         odr_sequence_end(o);
1082 }
1083
1084 int z_SortDetails(ODR o, Z_SortDetails **p, int opt)
1085 {
1086     if (!odr_sequence_begin(o, p, sizeof(**p)))
1087         return opt && odr_ok(o);
1088     return
1089         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
1090         odr_implicit(o, z_DatabaseName, &(*p)->databaseName, ODR_CONTEXT,
1091             1, 0) &&
1092         odr_implicit_settag(o, ODR_CONTEXT, 2) &&
1093         (odr_sequence_of(o, z_SortKeyDetails, &(*p)->sortKeys,
1094             &(*p)->num_sortKeys) || odr_ok(o)) &&
1095         odr_sequence_end(o);
1096 }
1097
1098 int z_SortKeyDetailsSortType(ODR o, Z_SortKeyDetailsSortType **p, int opt)
1099 {
1100     static Odr_arm arm[] =
1101     {
1102         {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SortKeyDetailsSortType_character,
1103             odr_null},
1104         {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SortKeyDetailsSortType_numeric,
1105             odr_null},
1106         {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SortKeyDetailsSortType_structured,
1107             z_HumanString},
1108         {-1, -1, -1, -1, 0}
1109     };
1110
1111     if (o->direction == ODR_DECODE)
1112         *p = odr_malloc(o, sizeof(**p));
1113     else if (!*p)
1114         return opt;
1115     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
1116         return 1;
1117     *p = 0;
1118     return opt && odr_ok(o);
1119 }
1120         
1121 int z_SortKeyDetails(ODR o, Z_SortKeyDetails **p, int opt)
1122 {
1123     if (!odr_sequence_begin(o, p, sizeof(**p)))
1124         return opt && odr_ok(o);
1125     return
1126         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 0, 1) &&
1127         odr_implicit_settag(o, ODR_CONTEXT, 1) &&
1128         (odr_sequence_of(o, z_Specification, &(*p)->elementSpecifications,
1129             &(*p)->num_elementSpecifications) || odr_ok(o)) &&
1130         odr_implicit(o, z_AttributeCombinations, &(*p)->attributeSpecifications,
1131             ODR_CONTEXT, 2, 1) &&
1132         odr_explicit(o, z_SortKeyDetailsSortType, &(*p)->sortType, ODR_CONTEXT,
1133             3, 1) &&
1134         odr_implicit(o, odr_integer, &(*p)->caseSensitivity, ODR_CONTEXT,
1135             4, 1) &&
1136         odr_sequence_end(o);
1137 }
1138
1139 int z_ProcessingInformation(ODR o, Z_ProcessingInformation **p, int opt)
1140 {
1141     if (!odr_sequence_begin(o, p, sizeof(**p)))
1142         return opt && odr_ok(o);
1143     return
1144         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
1145         odr_implicit(o, z_DatabaseName, &(*p)->databaseName, ODR_CONTEXT,
1146             1, 0) &&
1147         odr_implicit(o, odr_integer, &(*p)->processingContext, ODR_CONTEXT,
1148             2, 0) &&
1149         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT,
1150             3, 0) &&
1151         odr_implicit(o, odr_oid, &(*p)->oid, ODR_CONTEXT, 4, 0) &&
1152         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 5, 1) &&
1153         odr_implicit(o, odr_external, &(*p)->instructions, ODR_CONTEXT, 6, 1) &&
1154         odr_sequence_end(o);
1155 }
1156
1157 int z_VariantSetInfo(ODR o, Z_VariantSetInfo **p, int opt)
1158 {
1159     if (!odr_sequence_begin(o, p, sizeof(**p)))
1160         return opt && odr_ok(o);
1161     return
1162         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
1163         odr_implicit(o, odr_oid, &(*p)->variantSet, ODR_CONTEXT, 1, 0) &&
1164         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT,
1165             2, 0) &&
1166         odr_implicit_settag(o, ODR_CONTEXT, 3) &&
1167         (odr_sequence_of(o, z_VariantClass, &(*p)->variants,
1168             &(*p)->num_variants) || odr_ok(o)) &&
1169         odr_sequence_end(o);
1170 }
1171
1172 int z_VariantClass(ODR o, Z_VariantClass **p, int opt)
1173 {
1174     if (!odr_sequence_begin(o, p, sizeof(**p)))
1175         return opt && odr_ok(o);
1176     return
1177         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT,
1178             0, 1) &&
1179         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 1, 1) &&
1180         odr_implicit(o, odr_integer, &(*p)->variantClass, ODR_CONTEXT, 2, 0) &&
1181         odr_implicit_settag(o, ODR_CONTEXT, 3) &&
1182         odr_sequence_of(o, z_VariantType, &(*p)->variantTypes,
1183             &(*p)->num_variantTypes) &&
1184         odr_sequence_end(o);
1185 }
1186
1187 int z_VariantType(ODR o, Z_VariantType **p, int opt)
1188 {
1189     if (!odr_sequence_begin(o, p, sizeof(**p)))
1190         return opt && odr_ok(o);
1191     return
1192         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT, 0, 1) &&
1193         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 1, 1) &&
1194         odr_implicit(o, odr_integer, &(*p)->variantType, ODR_CONTEXT, 2, 0) &&
1195         odr_implicit(o, z_VariantValue, &(*p)->variantValue, ODR_CONTEXT, 3, 1) &&
1196         odr_sequence_end(o);
1197 }
1198
1199 int z_VariantValue(ODR o, Z_VariantValue **p, int opt)
1200 {
1201     if (!odr_sequence_begin(o, p, sizeof(**p)))
1202         return opt && odr_ok(o);
1203     return
1204         odr_explicit(o, odr_integer, &(*p)->dataType, ODR_CONTEXT, 0, 0) &&
1205         odr_explicit(o, z_ValueSet, &(*p)->values, ODR_CONTEXT, 1, 1) &&
1206         odr_sequence_end(o);
1207 }
1208
1209 int z_ValueSetEnumerated(ODR o, Z_ValueSetEnumerated **p, int opt)
1210 {
1211     if (o->direction == ODR_DECODE)
1212         *p = odr_malloc(o, sizeof(**p));
1213     else if (!*p)
1214         return opt;
1215     if (odr_sequence_of(o, z_ValueDescription, &(*p)->enumerated,
1216         &(*p)->num_enumerated))
1217         return 1;
1218     *p = 0;
1219     return opt && odr_ok(o);
1220 }
1221     
1222 int z_ValueSet(ODR o, Z_ValueSet **p, int opt)
1223 {
1224     static Odr_arm arm[] =
1225     {
1226         {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ValueSet_range, z_ValueRange},
1227         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ValueSet_enumerated,
1228             z_ValueSetEnumerated},
1229         {-1, -1, -1, -1, 0}
1230     };
1231
1232     if (o->direction == ODR_DECODE)
1233         *p = odr_malloc(o, sizeof(**p));
1234     else if (!*p)
1235         return opt;
1236     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
1237         return 1;
1238     *p = 0;
1239     return opt && odr_ok(o);
1240 }
1241
1242 int z_ValueRange(ODR o, Z_ValueRange **p, int opt)
1243 {
1244     if (!odr_sequence_begin(o, p, sizeof(**p)))
1245         return opt && odr_ok(o);
1246     return
1247         odr_explicit(o, z_ValueDescription, &(*p)->lower, ODR_CONTEXT, 0, 1) &&
1248         odr_explicit(o, z_ValueDescription, &(*p)->upper, ODR_CONTEXT, 1, 1) &&
1249         odr_sequence_end(o);
1250 }
1251
1252 int z_ValueDescription(ODR o, Z_ValueDescription **p, int opt)
1253 {
1254     static Odr_arm arm[] =
1255     {
1256         {ODR_NONE, -1, -1, Z_ValueDescription_integer, odr_integer},
1257         {ODR_NONE, -1, -1, Z_ValueDescription_string, z_InternationalString},
1258         {ODR_NONE, -1, -1, Z_ValueDescription_octets, odr_octetstring},
1259         {ODR_NONE, -1, -1, Z_ValueDescription_oid, odr_oid},
1260         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ValueDescription_unit, z_Unit},
1261         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ValueDescription_valueAndUnit, z_IntUnit},
1262         {-1, -1, -1, -1, 0}
1263     };
1264
1265     if (o->direction == ODR_DECODE)
1266         *p = odr_malloc(o, sizeof(**p));
1267     else if (!*p)
1268         return opt && odr_ok(o);
1269     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
1270         return 1;
1271     *p = 0;
1272     return opt && odr_ok(o);
1273 }
1274
1275 int z_UnitInfo(ODR o, Z_UnitInfo **p, int opt)
1276 {
1277     if (!odr_sequence_begin(o, p, sizeof(**p)))
1278         return opt && odr_ok(o);
1279     return
1280         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
1281         odr_implicit(o, z_InternationalString, &(*p)->unitSystem, ODR_CONTEXT,
1282             1, 0) &&
1283         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 2, 1) &&
1284         odr_implicit_settag(o, ODR_CONTEXT, 3) &&
1285         (odr_sequence_of(o,  z_UnitType, &(*p)->units, &(*p)->num_units) ||
1286         odr_ok(o)) &&
1287         odr_sequence_end(o);
1288 }
1289
1290 int z_UnitType(ODR o, Z_UnitType **p, int opt)
1291 {
1292     if (!odr_sequence_begin(o, p, sizeof(**p)))
1293         return opt && odr_ok(o);
1294     return
1295         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT,
1296             0, 1) &&
1297         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 1, 1) &&
1298         odr_explicit(o, z_StringOrNumeric, &(*p)->unitType, ODR_CONTEXT,
1299             2, 0) &&
1300         odr_implicit_settag(o, ODR_CONTEXT, 3) &&
1301         odr_sequence_of(o, z_Units, &(*p)->units, &(*p)->num_units) &&
1302         odr_sequence_end(o);
1303 }
1304
1305 int z_Units(ODR o, Z_Units **p, int opt)
1306 {
1307     if (!odr_sequence_begin(o, p, sizeof(**p)))
1308         return opt && odr_ok(o);
1309     return
1310         odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT, 0, 1) &&
1311         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 1, 1) &&
1312         odr_explicit(o, z_StringOrNumeric, &(*p)->unit, ODR_CONTEXT, 2, 0) &&
1313         odr_sequence_end(o);
1314 }
1315
1316 int z_CategoryList(ODR o, Z_CategoryList **p, int opt)
1317 {
1318     if (!odr_sequence_begin(o, p, sizeof(**p)))
1319         return opt && odr_ok(o);
1320     return
1321         odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
1322         odr_implicit_settag(o, ODR_CONTEXT, 1) &&
1323         odr_sequence_of(o, z_CategoryInfo, &(*p)->categories,
1324             &(*p)->num_categories) &&
1325         odr_sequence_end(o);
1326 }
1327
1328 int z_CategoryInfo(ODR o, Z_CategoryInfo **p, int opt)
1329 {
1330     if (!odr_sequence_begin(o, p, sizeof(**p)))
1331         return opt && odr_ok(o);
1332     return
1333         odr_implicit(o, z_InternationalString, &(*p)->category, ODR_CONTEXT,
1334             1, 0) &&
1335         odr_implicit(o, z_InternationalString, &(*p)->originalCategory,
1336             ODR_CONTEXT, 2, 1) &&
1337         odr_implicit(o, z_HumanString, &(*p)->description, ODR_CONTEXT, 3, 1) &&
1338         odr_implicit(o, z_InternationalString, &(*p)->asn1Module, ODR_CONTEXT,
1339             4, 1) &&
1340         odr_sequence_end(o);
1341 }
1342
1343 int z_ExplainRecord(ODR o, Z_ExplainRecord **p, int opt)
1344 {
1345     static Odr_arm arm[] =
1346     {
1347         {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_Explain_targetInfo, z_TargetInfo},
1348         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Explain_databaseInfo, z_DatabaseInfo},
1349         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Explain_schemaInfo, z_SchemaInfo},
1350         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Explain_tagSetInfo, z_TagSetInfo},
1351         {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_Explain_recordSyntaxInfo,
1352             z_RecordSyntaxInfo},
1353         {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_Explain_attributeSetInfo,
1354             z_AttributeSetInfo},
1355         {ODR_IMPLICIT, ODR_CONTEXT, 6, Z_Explain_termListInfo,
1356             z_TermListInfo},
1357         {ODR_IMPLICIT, ODR_CONTEXT, 7, Z_Explain_extendedServicesInfo,
1358             z_ExtendedServicesInfo},
1359         {ODR_IMPLICIT, ODR_CONTEXT, 8, Z_Explain_attributeDetails,
1360             z_AttributeDetails},
1361         {ODR_IMPLICIT, ODR_CONTEXT, 9, Z_Explain_termListDetails,
1362             z_TermListDetails},
1363         {ODR_IMPLICIT, ODR_CONTEXT, 10, Z_Explain_elementSetDetails,
1364             z_ElementSetDetails},
1365         {ODR_IMPLICIT, ODR_CONTEXT, 11, Z_Explain_retrievalRecordDetails,
1366             z_RetrievalRecordDetails},
1367         {ODR_IMPLICIT, ODR_CONTEXT, 12, Z_Explain_sortDetails,
1368             z_SortDetails},
1369         {ODR_IMPLICIT, ODR_CONTEXT, 13, Z_Explain_processing,
1370             z_ProcessingInformation},
1371         {ODR_IMPLICIT, ODR_CONTEXT, 14, Z_Explain_variants,
1372             z_VariantSetInfo},
1373         {ODR_IMPLICIT, ODR_CONTEXT, 15, Z_Explain_units, z_UnitInfo},
1374         {ODR_IMPLICIT, ODR_CONTEXT, 100, Z_Explain_categoryList,
1375             z_CategoryList},
1376         {-1, -1, -1, -1, 0}
1377     };
1378
1379     if (o->direction == ODR_DECODE)
1380         *p = odr_malloc(o, sizeof(**p));
1381     else if (!*p)
1382         return opt;
1383     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
1384         return 1;
1385     *p = 0;
1386     return opt && odr_ok(o);
1387 }