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