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