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