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