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