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