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