Using odr_nullval() instead of ODR_NULLVAL when appropriate.
[ir-tcl-moved-to-github.git] / explain.c
1 /*
2  * IR toolkit for tcl/tk
3  * (c) Index Data 1996-1997
4  * See the file LICENSE for details.
5  * Sebastian Hammer, Adam Dickmeiss
6  *
7  * $Log: explain.c,v $
8  * Revision 1.9  1997-11-24 11:34:38  adam
9  * Using odr_nullval() instead of ODR_NULLVAL when appropriate.
10  *
11  * Revision 1.8  1997/09/09 10:19:51  adam
12  * New MSV5.0 port with fewer warnings.
13  *
14  * Revision 1.7  1997/08/28 20:17:36  adam
15  * Fixed small bug.
16  *
17  * Revision 1.6  1997/05/14 06:57:14  adam
18  * Adopted to use YAZ with C++ support.
19  *
20  * Revision 1.5  1996/08/23 11:59:47  adam
21  * Bug fix: infinite look in ir_oid.
22  *
23  * Revision 1.4  1996/08/22  13:39:31  adam
24  * More work on explain.
25  *
26  * Revision 1.3  1996/08/21  13:32:50  adam
27  * Implemented saveFile method and extended loadFile method to work with it.
28  *
29  * Revision 1.2  1996/08/20  09:27:48  adam
30  * More work on explain.
31  * Renamed tkinit.c to tkmain.c. The tcl shell uses the Tcl 7.5 interface
32  * for socket i/o instead of the handcrafted one (for Tcl 7.3 and Tcl7.4).
33  *
34  * Revision 1.1  1996/08/16  15:07:43  adam
35  * First work on Explain.
36  *
37  */
38
39 #include <stdlib.h>
40 #include <stdio.h>
41 #include <ctype.h>
42 #include <assert.h>
43
44 #include "ir-tclp.h"
45
46 typedef struct {
47     int argc;
48     char **argv;
49     Tcl_Interp *interp;
50 } IrExpArg;
51
52 typedef struct {
53     char *name;
54     int id;
55     int (*handle)();
56 } IrExpChoice;
57
58 typedef char *Z_ElementSetName;
59 typedef Odr_oid *Z_AttributeSetId;
60 typedef char *Z_InternationalString;
61 typedef char *Z_LanguageCode;
62
63
64 static int ir_UnitType (IrExpArg *iea,
65             Z_UnitType *p, const char *name, int argi);
66 static int ir_Unit (IrExpArg *iea,
67             Z_Unit *p, const char *name, int argi);
68 static int ir_VariantType (IrExpArg *iea,
69             Z_VariantType *p, const char *name, int argi);
70 static int ir_OmittedAttributeInterpretation (IrExpArg *iea,
71             Z_OmittedAttributeInterpretation *p, const char *name, int argi);
72 static int ir_AttributeTypeDetails (IrExpArg *iea,
73             Z_AttributeTypeDetails *p, const char *name, int argi);
74 static int ir_Specification (IrExpArg *iea,
75             Z_Specification *p, const char *name, int argi);
76 static int ir_RetrievalRecordDetails (IrExpArg *iea,
77             Z_RetrievalRecordDetails *p, const char *name, int argi);
78 static int ir_ElementInfo (IrExpArg *iea,
79             Z_ElementInfo *p, const char *name, int argi);
80 static int ir_InternationalString (IrExpArg *iea,
81             char *p, const char *name, int argi);
82 static int ir_TagSetInfo (IrExpArg *iea,
83             Z_TagSetInfo *p, const char *name, int argi);
84 static int ir_DatabaseName (IrExpArg *iea,
85             char *p, const char *name, int argi);
86 static int ir_AccessInfo (IrExpArg *iea,
87             Z_AccessInfo *p, const char *name, int argi);
88 static int ir_bool (IrExpArg *iea,
89             bool_t *p, const char *name, int argi);
90 static int ir_LanguageCode (IrExpArg *iea,
91             char *p, const char *name, int argi);
92 static int ir_Units (IrExpArg *iea,
93             Z_Units *p, const char *name, int argi);
94 static int ir_SortDetails (IrExpArg *iea,
95             Z_SortDetails *p, const char *name, int argi);
96 static int ir_ElementSetDetails (IrExpArg *iea,
97             Z_ElementSetDetails *p, const char *name, int argi);
98 static int ir_TermListDetails (IrExpArg *iea,
99             Z_TermListDetails *p, const char *name, int argi);
100 static int ir_AttributeValue (IrExpArg *iea,
101             Z_AttributeValue *p, const char *name, int argi);
102 static int ir_ElementDataType (IrExpArg *iea,
103             Z_ElementDataType *p, const char *name, int argi);
104 static int ir_ProximitySupport (IrExpArg *iea,
105             Z_ProximitySupport *p, const char *name, int argi);
106 static int ir_ProcessingInformation (IrExpArg *iea,
107             Z_ProcessingInformation *p, const char *name, int argi);
108 static int ir_AttributeCombinations (IrExpArg *iea,
109             Z_AttributeCombinations *p, const char *name, int argi);
110 static int ir_AttributeSetDetails (IrExpArg *iea,
111             Z_AttributeSetDetails *p, const char *name, int argi);
112 static int ir_DatabaseInfo (IrExpArg *iea,
113             Z_DatabaseInfo *p, const char *name, int argi);
114 static int ir_IconObject (IrExpArg *iea,
115             Z_IconObject *p, const char *name, int argi);
116 static int ir_RpnCapabilities (IrExpArg *iea,
117             Z_RpnCapabilities *p, const char *name, int argi);
118 static int ir_QueryTypeDetails (IrExpArg *iea,
119             Z_QueryTypeDetails *p, const char *name, int argi);
120 static int ir_ValueDescription (IrExpArg *iea,
121             Z_ValueDescription *p, const char *name, int argi);
122 static int ir_AttributeSetInfo (IrExpArg *iea,
123             Z_AttributeSetInfo *p, const char *name, int argi);
124 static int ir_SchemaInfo (IrExpArg *iea,
125             Z_SchemaInfo *p, const char *name, int argi);
126 static int ir_AttributeOccurrence (IrExpArg *iea,
127             Z_AttributeOccurrence *p, const char *name, int argi);
128 static int ir_AttributeCombination (IrExpArg *iea,
129             Z_AttributeCombination *p, const char *name, int argi);
130 static int ir_UnitInfo (IrExpArg *iea,
131             Z_UnitInfo *p, const char *name, int argi);
132 static int ir_VariantClass (IrExpArg *iea,
133             Z_VariantClass *p, const char *name, int argi);
134 static int ir_VariantSetInfo (IrExpArg *iea,
135             Z_VariantSetInfo *p, const char *name, int argi);
136 static int ir_RecordTag (IrExpArg *iea,
137             Z_RecordTag *p, const char *name, int argi);
138 static int ir_TermListInfo (IrExpArg *iea,
139             Z_TermListInfo *p, const char *name, int argi);
140 static int ir_StringOrNumeric (IrExpArg *iea,
141             Z_StringOrNumeric *p, const char *name, int argi);
142 static int ir_CategoryInfo (IrExpArg *iea,
143             Z_CategoryInfo *p, const char *name, int argi);
144 static int ir_ValueRange (IrExpArg *iea,
145             Z_ValueRange *p, const char *name, int argi);
146 static int ir_Term (IrExpArg *iea,
147             Z_Term *p, const char *name, int argi);
148 static int ir_DatabaseList (IrExpArg *iea,
149             Z_DatabaseList *p, const char *name, int argi);
150 static int ir_HumanString (IrExpArg *iea,
151             Z_HumanString *p, const char *name, int argi);
152 static int ir_CommonInfo (IrExpArg *iea,
153             Z_CommonInfo *p, const char *name, int argi);
154 static int ir_NetworkAddress (IrExpArg *iea,
155             Z_NetworkAddress *p, const char *name, int argi);
156 static int ir_Costs (IrExpArg *iea,
157             Z_Costs *p, const char *name, int argi);
158 static int ir_RecordSyntaxInfo (IrExpArg *iea,
159             Z_RecordSyntaxInfo *p, const char *name, int argi);
160 static int ir_OtherInformation (IrExpArg *iea,
161             Z_OtherInformation *p, const char *name, int argi);
162 static int ir_CategoryList (IrExpArg *iea,
163             Z_CategoryList *p, const char *name, int argi);
164 static int ir_VariantValue (IrExpArg *iea,
165             Z_VariantValue *p, const char *name, int argi);
166 static int ir_PerElementDetails (IrExpArg *iea,
167             Z_PerElementDetails *p, const char *name, int argi);
168 static int ir_AttributeDetails (IrExpArg *iea,
169             Z_AttributeDetails *p, const char *name, int argi);
170 static int ir_ExtendedServicesInfo (IrExpArg *iea,
171             Z_ExtendedServicesInfo *p, const char *name, int argi);
172 static int ir_AttributeType (IrExpArg *iea,
173             Z_AttributeType *p, const char *name, int argi);
174 static int ir_IntUnit (IrExpArg *iea,
175             Z_IntUnit *p, const char *name, int argi);
176 static int ir_Charge (IrExpArg *iea,
177             Z_Charge *p, const char *name, int argi);
178 static int ir_PrivateCapabilities (IrExpArg *iea,
179             Z_PrivateCapabilities *p, const char *name, int argi);
180 static int ir_ValueSet (IrExpArg *iea,
181             Z_ValueSet *p, const char *name, int argi);
182 static int ir_AttributeDescription (IrExpArg *iea,
183             Z_AttributeDescription *p, const char *name, int argi);
184 static int ir_Path (IrExpArg *iea,
185             Z_Path *p, const char *name, int argi);
186 static int ir_ContactInfo (IrExpArg *iea,
187             Z_ContactInfo *p, const char *name, int argi);
188 static int ir_SearchKey (IrExpArg *iea,
189             Z_SearchKey *p, const char *name, int argi);
190 static int ir_Iso8777Capabilities (IrExpArg *iea,
191             Z_Iso8777Capabilities *p, const char *name, int argi);
192 static int ir_AccessRestrictions (IrExpArg *iea,
193             Z_AccessRestrictions *p, const char *name, int argi);
194 static int ir_SortKeyDetails (IrExpArg *iea,
195             Z_SortKeyDetails *p, const char *name, int argi);
196
197
198 static int 
199 ir_match_start (const char *name, void *p, IrExpArg *iea, int argi)
200 {
201     if (!p)
202     {
203         if (argi >= iea->argc)
204             Tcl_AppendResult (iea->interp, name, " ", NULL);
205         return 0;
206     }
207     if (argi < iea->argc)
208     {
209         if (strcmp (name, iea->argv[argi]))
210             return 0;
211     }
212     else
213         Tcl_AppendResult (iea->interp, "{", name, " ", NULL);
214     return 1;
215 }
216
217 static int 
218 ir_match_end (const char *name, IrExpArg *iea, int argi)
219 {
220     if (argi >= iea->argc)
221         Tcl_AppendResult (iea->interp, "} ", NULL);
222     return TCL_OK;
223 }
224
225 static int
226 ir_choice (IrExpArg *iea, IrExpChoice *clist, int *what, void *p,
227            int argi)
228 {
229     if (p)
230     {
231         while (clist->name)
232         {
233             if (clist->id == *what)
234                 return (*clist->handle)(iea, p, clist->name, argi);
235             clist++;
236         }
237     }
238     if (argi >= iea->argc)
239         Tcl_AppendResult (iea->interp, "{} ", NULL);
240     return TCL_OK;
241 }
242
243 static int ir_null (IrExpArg *iea,
244             Odr_null *p, const char *name, int argi)
245 {
246     if (!ir_match_start (name, p, iea, ++argi))
247         return TCL_OK;
248     Tcl_AppendResult (iea->interp, "1 ", NULL);
249     return ir_match_end (name, iea, argi);
250 }
251
252 static int ir_CString (IrExpArg *iea,
253             char *p, const char *name, int argi)
254 {
255     if (!ir_match_start (name, p, iea, ++argi))
256         return TCL_OK;
257     Tcl_AppendElement (iea->interp, p);
258     return ir_match_end (name, iea, argi);
259 }
260
261 static int ir_ElementSetName (IrExpArg *iea,
262             char *p, const char *name, int argi)
263 {
264     return ir_CString (iea, p, name, argi);
265 }
266
267 static int ir_DatabaseName (IrExpArg *iea,
268             char *p, const char *name, int argi)
269 {
270     return ir_CString (iea, p, name, argi);
271 }
272
273 static int ir_InternationalString (IrExpArg *iea,
274             char *p, const char *name, int argi)
275 {
276     return ir_CString (iea, p, name, argi);
277 }
278
279 static int ir_GeneralizedTime (IrExpArg *iea,
280             char *p, const char *name, int argi)
281 {
282     return ir_CString (iea, p, name, argi);
283 }
284
285 static int ir_oid (IrExpArg *iea,
286             Odr_oid *p, const char *name, int argi)
287 {
288     int first = ' ';
289     if (!ir_match_start (name, p, iea, ++argi))
290         return TCL_OK;
291     while (*p != -1)
292     {
293         char buf[32];
294         
295         sprintf (buf, "%c%d", first, *p);
296         Tcl_AppendResult (iea->interp, buf, NULL);
297         first = '.';
298         p++;
299     }
300     return ir_match_end (name, iea, argi);
301 }
302
303 static int ir_TagTypeMapping (IrExpArg *iea,
304             Z_TagTypeMapping **p, const char *name, int argi)
305 {
306     if (!ir_match_start (name, p, iea, ++argi))
307         return TCL_OK;
308     /* missing */
309     return ir_match_end (name, iea, argi);
310 }
311
312 static int ir_PrimitiveDataType (IrExpArg *iea,
313             int *p, const char *name, int argi)
314 {
315     if (!ir_match_start (name, p, iea, ++argi))
316         return TCL_OK;
317     /* missing */
318     return ir_match_end (name, iea, argi);
319 }
320
321 static int ir_octet (IrExpArg *iea,
322             Odr_oct *p, const char *name, int argi)
323 {
324     if (!ir_match_start (name, p, iea, ++argi))
325         return TCL_OK;
326     /* missing */
327     return ir_match_end (name, iea, argi);
328 }
329
330 static int ir_choice_nop (IrExpArg *iea,
331             void *p, const char *name, int argi)
332 {
333     if (argi >= iea->argc)
334         Tcl_AppendResult (iea->interp, name, " ", NULL);
335     return TCL_OK;
336 }
337
338 static int ir_bool (IrExpArg *iea,
339             bool_t *p, const char *name, int argi)
340 {
341     if (!ir_match_start (name, p, iea, ++argi))
342         return TCL_OK;
343     Tcl_AppendResult (iea->interp, *p ? "1" : "0", NULL);
344     return ir_match_end (name, iea, argi);
345 }
346
347 static int ir_integer (IrExpArg *iea,
348             int *p, const char *name, int argi)
349 {
350     char buf[64];
351     if (!ir_match_start (name, p, iea, ++argi))
352         return TCL_OK;
353     sprintf (buf, "%d", *p);
354     Tcl_AppendResult (iea->interp, buf, NULL);
355     return ir_match_end (name, iea, argi);
356 }
357
358 static int ir_LanguageCode (IrExpArg *iea,
359             char *p, const char *name, int argi)
360 {
361     return ir_CString (iea, p, name, argi);
362 }
363
364 static int ir_External (IrExpArg *iea,
365             Z_External *p, const char *name, int argi)
366 {
367     if (!ir_match_start (name, p, iea, ++argi))
368         return TCL_OK;
369     /* missing */
370     return ir_match_end (name, iea, argi);
371 }
372
373 static int ir_sequence (int (*fh)(), IrExpArg *iea, void *p, int *num,
374                  const char *name, int argi)
375 {
376     void **pp = (void **) p;
377     int i;
378
379     if (!ir_match_start (name, p, iea, ++argi))
380         return TCL_OK;
381     for (i = 0; i < *num; i++)
382         (*fh)(iea, pp[i], "", argi);
383     return ir_match_end (name, iea, argi);
384 }
385
386 static int ir_Term (IrExpArg *iea,
387             Z_Term *p, const char *name, int argi)
388 {
389     static IrExpChoice arm [] = {
390         { "general",            Z_Term_general,
391                                ir_octet },
392         { "numeric",            Z_Term_numeric,
393                                ir_integer },
394         { "characterString",    Z_Term_characterString,
395                                ir_InternationalString },
396         { "oid",                Z_Term_oid,
397                                ir_oid },
398         { "dateTime",           Z_Term_dateTime,
399                                ir_GeneralizedTime },
400         { "external",           Z_Term_external,
401                                ir_External },
402         { "null",               Z_Term_null,
403                                 ir_null },
404         { NULL, 0, NULL }};
405
406     if (!ir_match_start (name, p, iea, ++argi))
407         return TCL_OK;
408
409     ir_choice (iea, arm, &p->which, p->u.general, argi);
410     return ir_match_end (name, iea, argi);
411 }
412
413 static int ir_TargetInfo (IrExpArg *iea,
414             Z_TargetInfo *p, const char *name, int argi)
415 {
416     if (!ir_match_start (name, p, iea, ++argi))
417         return TCL_OK;
418     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
419     ir_InternationalString (iea, p->name, "name", argi);
420     ir_HumanString (iea, p->recentNews, "recentNews", argi);
421     ir_IconObject (iea, p->icon, "icon", argi);
422     ir_bool (iea, p->namedResultSets, "namedResultSets", argi);
423     ir_bool (iea, p->multipleDBsearch, "multipleDBsearch", argi);
424     ir_integer (iea, p->maxResultSets, "maxResultSets", argi);
425     ir_integer (iea, p->maxResultSize, "maxResultSize", argi);
426     ir_integer (iea, p->maxTerms, "maxTerms", argi);
427     ir_IntUnit (iea, p->timeoutInterval, "timeoutInterval", argi);
428     ir_HumanString (iea, p->welcomeMessage, "welcomeMessage", argi);
429     ir_ContactInfo (iea, p->contactInfo, "contactInfo", argi);
430     ir_HumanString (iea, p->description, "description", argi);
431     ir_sequence (ir_InternationalString, iea, p->nicknames,
432                  &p->num_nicknames, "nicknames", argi);
433     ir_HumanString (iea, p->usageRest, "usageRest", argi);
434     ir_HumanString (iea, p->paymentAddr, "paymentAddr", argi);
435     ir_HumanString (iea, p->hours, "hours", argi);
436     ir_sequence (ir_DatabaseList, iea, p->dbCombinations,
437                  &p->num_dbCombinations, "dbCombinations", argi);
438     ir_sequence (ir_NetworkAddress, iea, p->addresses,
439                  &p->num_addresses, "addresses", argi);
440     ir_AccessInfo (iea, p->commonAccessInfo, "commonAccessInfo", argi);
441     return ir_match_end (name, iea, argi);
442 }
443
444 static int ir_DatabaseInfo (IrExpArg *iea,
445             Z_DatabaseInfo *p, const char *name, int argi)
446 {
447     static IrExpChoice arm_recordCount [] = {
448         { "actualNumber",       Z_Exp_RecordCount_actualNumber,
449                                ir_integer },
450         { "approxNumber",       Z_Exp_RecordCount_approxNumber,
451                                ir_integer },
452         { NULL, 0, NULL }};
453
454     if (!ir_match_start (name, p, iea, ++argi))
455         return TCL_OK;
456
457     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
458     ir_DatabaseName (iea, p->name, "name", argi);
459     ir_null (iea, p->explainDatabase, "explainDatabase", argi);
460     ir_sequence (ir_DatabaseName, iea, p->nicknames,
461                  &p->num_nicknames, "nicknames", argi);
462     ir_IconObject (iea, p->icon, "icon", argi);
463     ir_bool (iea, p->userFee, "userFee", argi);
464     ir_bool (iea, p->available, "available", argi);
465     ir_HumanString (iea, p->titleString, "titleString", argi);
466     ir_sequence (ir_HumanString, iea, p->keywords,
467                  &p->num_keywords, "keywords", argi);
468     ir_HumanString (iea, p->description, "description", argi);
469     ir_DatabaseList (iea, p->associatedDbs, "associatedDbs", argi);
470     ir_DatabaseList (iea, p->subDbs, "subDbs", argi);
471     ir_HumanString (iea, p->disclaimers, "disclaimers", argi);
472     ir_HumanString (iea, p->news, "news", argi);
473
474     ir_choice (iea, arm_recordCount, &p->recordCount_which,
475                                      p->recordCount, argi);
476
477     ir_HumanString (iea, p->defaultOrder, "defaultOrder", argi);
478     ir_integer (iea, p->avRecordSize, "avRecordSize", argi);
479     ir_integer (iea, p->maxRecordSize, "maxRecordSize", argi);
480     ir_HumanString (iea, p->hours, "hours", argi);
481     ir_HumanString (iea, p->bestTime, "bestTime", argi);
482     ir_GeneralizedTime (iea, p->lastUpdate, "lastUpdate", argi);
483     ir_IntUnit (iea, p->updateInterval, "updateInterval", argi);
484     ir_HumanString (iea, p->coverage, "coverage", argi);
485     ir_bool (iea, p->proprietary, "proprietary", argi);
486     ir_HumanString (iea, p->copyrightText, "copyrightText", argi);
487     ir_HumanString (iea, p->copyrightNotice, "copyrightNotice", argi);
488     ir_ContactInfo (iea, p->producerContactInfo, "producerContactInfo", argi);
489     ir_ContactInfo (iea, p->supplierContactInfo, "supplierContactInfo", argi);
490     ir_ContactInfo (iea, p->submissionContactInfo, "submissionContactInfo", argi);
491     ir_AccessInfo (iea, p->accessInfo, "accessInfo", argi);
492     return ir_match_end (name, iea, argi);
493 }
494
495 static int ir_SchemaInfo (IrExpArg *iea,
496             Z_SchemaInfo *p, const char *name, int argi)
497 {
498     if (!ir_match_start (name, p, iea, ++argi))
499         return TCL_OK;
500     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
501     ir_oid (iea, p->schema, "schema", argi);
502     ir_InternationalString (iea, p->name, "name", argi);
503     ir_HumanString (iea, p->description, "description", argi);
504  
505     ir_sequence (ir_TagTypeMapping, iea, p->tagTypeMapping,
506                  &p->num_tagTypeMapping, "tagTypeMapping", argi);
507     ir_sequence (ir_ElementInfo, iea, p->recordStructure,
508                  &p->num_recordStructure, "recordStructure", argi);
509     return ir_match_end (name, iea, argi);
510 }
511
512 static int ir_ElementDataTypePrimitive (IrExpArg *iea,
513             int *p, const char *name, int argi)
514 {
515     static IrExpChoice arm[] = {
516         {"octetString",  Z_PrimitiveElement_octetString, ir_choice_nop },
517         {"numeric",      Z_PrimitiveElement_numeric,     ir_choice_nop },
518         {NULL, 0, NULL}};
519
520     if (!ir_match_start (name, p, iea, ++argi))
521         return TCL_OK;
522     ir_choice (iea, arm, p, odr_nullval(), argi);
523     return ir_match_end (name, iea, argi);
524 }
525
526 static int ir_ElementInfo (IrExpArg *iea,
527             Z_ElementInfo *p, const char *name, int argi)
528 {
529     if (!ir_match_start (name, p, iea, ++argi))
530         return TCL_OK;
531     ir_InternationalString (iea, p->elementName, "elementName", argi);
532     ir_Path (iea, p->elementTagPath, "elementTagPath", argi);
533     ir_ElementDataType (iea, p->dataType, "dataType", argi);
534     ir_bool (iea, p->required, "required", argi);
535     ir_bool (iea, p->repeatable, "repeatable", argi);
536     ir_HumanString (iea, p->description, "description", argi);
537     return ir_match_end (name, iea, argi);
538 }
539
540 static int ir_ElementInfoList (IrExpArg *iea,
541             Z_ElementInfoList *p, const char *name, int argi)
542 {
543     if (!ir_match_start (name, p, iea, ++argi))
544         return TCL_OK;
545     ir_sequence (ir_ElementInfo, iea, p->list,
546                  &p->num, "list", argi);
547     return ir_match_end (name, iea, argi);
548 }
549
550 static int ir_ElementDataType (IrExpArg *iea,
551             Z_ElementDataType *p, const char *name, int argi)
552 {
553     static IrExpChoice arm[] = {
554         { "primitive",  Z_ElementDataType_primitive,
555                         ir_ElementDataTypePrimitive },
556         { "structured", Z_ElementDataType_structured,
557                         ir_ElementInfoList },
558         { NULL, 0, NULL }};
559     if (!ir_match_start (name, p, iea, ++argi))
560         return TCL_OK;
561     ir_choice (iea, arm, &p->which, p->u.primitive, argi);
562     return ir_match_end (name, iea, argi);
563 }
564
565 static int ir_PathUnit (IrExpArg *iea,
566             Z_PathUnit *p, const char *name, int argi)
567 {
568     if (!ir_match_start (name, p, iea, ++argi))
569         return TCL_OK;
570     ir_integer (iea, p->tagType, "tagType", argi);
571     ir_StringOrNumeric (iea, p->tagValue, "tagValue", argi);
572     return ir_match_end (name, iea, argi);
573 }
574
575 static int ir_Path (IrExpArg *iea,
576             Z_Path *p, const char *name, int argi)
577 {
578     if (!ir_match_start (name, p, iea, ++argi))
579         return TCL_OK;
580     ir_sequence (ir_PathUnit, iea, p->list, 
581                  &p->num, "list", argi);
582     return ir_match_end (name, iea, argi);
583 }
584
585 static int ir_TagSetInfoElements (IrExpArg *iea,
586             Z_TagSetInfoElements *p, const char *name, int argi)
587 {
588     if (!ir_match_start (name, p, iea, ++argi))
589         return TCL_OK;
590     ir_InternationalString (iea, p->elementName, "elementname", argi);
591     ir_sequence (ir_InternationalString, iea, p->nicknames,
592                  &p->num_nicknames, "nicknames", argi);
593     ir_StringOrNumeric (iea, p->elementTag, "elementTag", argi);
594     ir_HumanString (iea, p->description, "description", argi);
595     ir_PrimitiveDataType (iea, p->dataType, "dataType", argi);
596     ir_OtherInformation (iea, p->otherTagInfo, "otherTagInfo", argi);
597     return ir_match_end (name, iea, argi);
598 }
599
600 static int ir_TagSetInfo (IrExpArg *iea,
601             Z_TagSetInfo *p, const char *name, int argi)
602 {
603     if (!ir_match_start (name, p, iea, ++argi))
604         return TCL_OK;
605     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
606     ir_oid (iea, p->tagSet, "tagSet", argi);
607     ir_InternationalString (iea, p->name, "name", argi);
608     ir_HumanString (iea, p->description, "description", argi);
609     ir_sequence (ir_TagSetInfoElements, iea, p->elements,
610                  &p->num_elements, "elements", argi);
611     return ir_match_end (name, iea, argi);
612 }
613
614 static int ir_RecordSyntaxInfo (IrExpArg *iea,
615             Z_RecordSyntaxInfo *p, const char *name, int argi)
616 {
617     if (!ir_match_start (name, p, iea, ++argi))
618         return TCL_OK;
619     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
620     ir_oid (iea, p->recordSyntax, "recordSyntax", argi);
621     ir_InternationalString (iea, p->name, "name", argi);
622     ir_sequence (ir_oid, iea, p->transferSyntaxes,
623                  &p->num_transferSyntaxes, "transferSyntaxes", argi);
624     ir_HumanString (iea, p->description, "description", argi);
625     ir_InternationalString (iea, p->asn1Module, "asn1Module", argi);
626     ir_sequence (ir_ElementInfo, iea, p->abstractStructure,
627                  &p->num_abstractStructure, "abstractStructure", argi);
628     return ir_match_end (name, iea, argi);
629 }
630
631 static int ir_AttributeType (IrExpArg *iea,
632             Z_AttributeType *p, const char *name, int argi)
633 {
634     if (!ir_match_start (name, p, iea, ++argi))
635         return TCL_OK;
636     ir_InternationalString (iea, p->name, "name", argi);
637     ir_HumanString (iea, p->description, "description", argi);
638     ir_integer (iea, p->attributeType, "attributeType", argi);
639     ir_sequence (ir_AttributeDescription, iea, p->attributeValues,
640                  &p->num_attributeValues, "attributeValues", argi);
641     return ir_match_end (name, iea, argi);
642 }
643
644 static int ir_AttributeSetInfo (IrExpArg *iea,
645             Z_AttributeSetInfo *p, const char *name, int argi)
646 {
647     if (!ir_match_start (name, p, iea, ++argi))
648         return TCL_OK;
649     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
650     ir_oid (iea, p->attributeSet, "attributeSet", argi);
651     ir_InternationalString (iea, p->name, "name", argi);
652     ir_sequence (ir_AttributeType, iea, p->attributes,
653                  &p->num_attributes, "attributes", argi);
654     ir_HumanString (iea, p->description, "description", argi);
655     return ir_match_end (name, iea, argi);
656 }
657
658 static int ir_AttributeDescription (IrExpArg *iea,
659             Z_AttributeDescription *p, const char *name, int argi)
660 {
661     if (!ir_match_start (name, p, iea, ++argi))
662         return TCL_OK;
663     ir_InternationalString (iea, p->name, "name", argi);
664     ir_HumanString (iea, p->description, "description", argi);
665     ir_StringOrNumeric (iea, p->attributeValue, "attributeValue", argi);
666     ir_sequence (ir_StringOrNumeric,iea, p->equivalentAttributes,
667                  &p->num_equivalentAttributes, "equivalentAttributes", argi);
668     return ir_match_end (name, iea, argi);
669 }
670
671 static int ir_TermListElement (IrExpArg *iea,
672             Z_TermListElement *p, const char *name, int argi)
673 {
674     static IrExpChoice searchCostArm [] = {
675         { "optimized",  Z_TermListInfo_optimized, ir_choice_nop },
676         { "normal",     Z_TermListInfo_normal,    ir_choice_nop },
677         { "expensive",  Z_TermListInfo_expensive, ir_choice_nop },
678         { "filter",     Z_TermListInfo_filter,    ir_choice_nop },
679         { NULL, 0, NULL }};
680     ir_InternationalString (iea, p->name, "name", argi);
681     ir_HumanString (iea, p->title, "title", argi);
682     if (p->searchCost)
683         ir_choice (iea, searchCostArm, p->searchCost, odr_nullval(), argi);
684
685     ir_bool (iea, p->scanable, "scanable", argi);
686     ir_sequence (ir_InternationalString, iea, p->broader,
687                  &p->num_broader, "broader", argi);
688     ir_sequence (ir_InternationalString, iea, p->narrower,
689                  &p->num_narrower, "narrower", argi);
690     return ir_match_end (name, iea, argi);
691 }
692
693 static int ir_TermListInfo (IrExpArg *iea,
694             Z_TermListInfo *p, const char *name, int argi)
695 {
696     if (!ir_match_start (name, p, iea, ++argi))
697         return TCL_OK;
698     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
699     ir_DatabaseName (iea, p->databaseName, "databaseName", argi);
700     ir_sequence (ir_TermListElement, iea, p->termLists,
701                  &p->num_termLists, "termLists", argi);    
702     return ir_match_end (name, iea, argi);
703 }
704
705 static int ir_ExtendedServicesInfo (IrExpArg *iea,
706             Z_ExtendedServicesInfo *p, const char *name, int argi)
707 {
708     static IrExpChoice waitActionArm [] = {
709         { "waitSupported",     Z_ExtendedServicesInfo_waitSupported,
710                               ir_choice_nop },
711         { "waitAlways",        Z_ExtendedServicesInfo_waitAlways,
712                               ir_choice_nop },
713         { "waitNotSupported",  Z_ExtendedServicesInfo_waitNotSupported,
714                               ir_choice_nop },
715         { "depends",           Z_ExtendedServicesInfo_depends,
716                               ir_choice_nop },
717         { "notSaying",         Z_ExtendedServicesInfo_notSaying,
718                               ir_choice_nop },
719         { NULL, 0, NULL }};
720
721     ir_InternationalString (iea, p->name, "name", argi);
722     if (!ir_match_start (name, p, iea, ++argi))
723         return TCL_OK;
724     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
725     ir_oid (iea, p->type, "type", argi);
726     ir_InternationalString (iea, p->name, "name", argi);
727     ir_bool (iea, p->privateType, "privateType", argi);
728     ir_bool (iea, p->restrictionsApply, "restrictionsApply", argi);
729     ir_bool (iea, p->feeApply, "feeApply", argi);
730     ir_bool (iea, p->available, "available", argi);
731     ir_bool (iea, p->retentionSupported, "retentionSupported", argi);
732
733     ir_choice (iea, waitActionArm, p->waitAction, odr_nullval(), argi);
734
735     ir_HumanString (iea, p->description, "description", argi);
736     ir_External (iea, p->specificExplain, "specificExplain", argi);
737     ir_InternationalString (iea, p->esASN, "esASN", argi);
738     return ir_match_end (name, iea, argi);
739 }
740
741 static int ir_AttributeDetails (IrExpArg *iea,
742             Z_AttributeDetails *p, const char *name, int argi)
743 {
744     if (!ir_match_start (name, p, iea, ++argi))
745         return TCL_OK;
746     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
747     ir_DatabaseName (iea, p->databaseName, "databaseName", argi);
748     ir_sequence (ir_AttributeSetDetails, iea, p->attributesBySet,
749                  &p->num_attributesBySet, "attributesBySet", argi);
750     ir_AttributeCombinations (iea, p->attributeCombinations,
751                                      "attributeCombinations", argi);
752     return ir_match_end (name, iea, argi);
753 }
754
755 static int ir_AttributeSetDetails (IrExpArg *iea,
756             Z_AttributeSetDetails *p, const char *name, int argi)
757 {
758     if (!ir_match_start (name, p, iea, ++argi))
759         return TCL_OK;
760     ir_oid (iea, p->attributeSet, "attributeSet", argi);
761     ir_sequence (ir_AttributeTypeDetails, iea, p->attributesByType, 
762                  &p->num_attributesByType, "attributesByType", argi);
763     return ir_match_end (name, iea, argi);
764 }
765
766 static int ir_AttributeTypeDetails (IrExpArg *iea,
767             Z_AttributeTypeDetails *p, const char *name, int argi)
768 {
769     if (!ir_match_start (name, p, iea, ++argi))
770         return TCL_OK;
771     ir_integer (iea, p->attributeType, "attributeType", argi);
772     ir_OmittedAttributeInterpretation (iea, p->optionalType,
773                                        "optionalType", argi);
774     ir_sequence (ir_AttributeValue, iea, p->attributeValues,
775                  &p->num_attributeValues, "attributeValues", argi);
776     return ir_match_end (name, iea, argi);
777 }
778
779 static int ir_OmittedAttributeInterpretation (IrExpArg *iea,
780             Z_OmittedAttributeInterpretation *p, const char *name, int argi)
781 {
782     if (!ir_match_start (name, p, iea, ++argi))
783         return TCL_OK;
784     ir_StringOrNumeric (iea, p->defaultValue, "defaultValue", argi);
785     ir_HumanString (iea, p->defaultDescription, "defaultDescription", argi);
786     return ir_match_end (name, iea, argi);
787 }
788
789 static int ir_EScanInfo (IrExpArg *iea,
790             Z_EScanInfo *p, const char *name, int argi)
791
792     if (!ir_match_start (name, p, iea, ++argi))
793         return TCL_OK;
794     ir_integer (iea, p->maxStepSize, "maxStepSize", argi);
795     ir_HumanString (iea, p->collatingSequence, "collatingSequence", argi);
796     ir_bool (iea, p->increasing, "increasing", argi);
797     return ir_match_end (name, iea, argi);
798 }
799
800 static int ir_TermListDetails (IrExpArg *iea,
801             Z_TermListDetails *p, const char *name, int argi)
802 {
803     if (!ir_match_start (name, p, iea, ++argi))
804         return TCL_OK;
805     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
806     ir_InternationalString (iea, p->termListName, "termListName", argi);
807     ir_HumanString (iea, p->description, "description", argi);
808     ir_AttributeCombinations (iea, p->attributes, "attributes", argi);
809
810     ir_EScanInfo (iea, p->scanInfo, "scanInfo", argi);
811
812     ir_integer (iea, p->estNumberTerms, "estNumberTerms", argi);
813     ir_sequence (ir_Term, iea, p->sampleTerms,
814                 &p->num_sampleTerms, "sampleTerms", argi);
815     return ir_match_end (name, iea, argi);
816 }
817
818 static int ir_ElementSetDetails (IrExpArg *iea,
819             Z_ElementSetDetails *p, const char *name, int argi)
820 {
821     if (!ir_match_start (name, p, iea, ++argi))
822         return TCL_OK;
823     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
824     ir_DatabaseName (iea, p->databaseName, "databaseName", argi);
825     ir_ElementSetName (iea, p->elementSetName, "elementSetName", argi);
826     ir_oid (iea, p->recordSyntax, "recordSyntax", argi);
827     ir_oid (iea, p->schema, "schema", argi);
828     ir_HumanString (iea, p->description, "description", argi);
829     ir_sequence (ir_PerElementDetails, iea, p->detailsPerElement,
830                  &p->num_detailsPerElement, "detailsPerElement", argi);
831     return ir_match_end (name, iea, argi);
832 }
833
834 static int ir_RetrievalRecordDetails (IrExpArg *iea,
835             Z_RetrievalRecordDetails *p, const char *name, int argi)
836 {
837     if (!ir_match_start (name, p, iea, ++argi))
838         return TCL_OK;
839     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
840     ir_DatabaseName (iea, p->databaseName, "databaseName", argi);
841     ir_oid (iea, p->schema, "schema", argi);
842     ir_oid (iea, p->recordSyntax, "recordSyntax", argi);
843     ir_HumanString (iea, p->description, "description", argi);
844     ir_sequence (ir_PerElementDetails, iea, p->detailsPerElement,
845                  &p->num_detailsPerElement, "detailsPerElement", argi);
846     return ir_match_end (name, iea, argi);
847 }
848
849 static int ir_PerElementDetails (IrExpArg *iea,
850             Z_PerElementDetails *p, const char *name, int argi)
851 {
852     if (!ir_match_start (name, p, iea, ++argi))
853         return TCL_OK;
854     ir_InternationalString (iea, p->name, "name", argi);
855     ir_RecordTag (iea, p->recordTag, "recordTag", argi);
856     ir_sequence (ir_Path, iea, p->schemaTags,
857                  &p->num_schemaTags, "schemaTags", argi);
858     ir_integer (iea, p->maxSize, "maxSize", argi);
859     ir_integer (iea, p->minSize, "minSize", argi);
860     ir_integer (iea, p->avgSize, "avgSize", argi);
861     ir_integer (iea, p->fixedSize, "fixedSize", argi);
862     ir_bool (iea, p->repeatable, "repeatable", argi);
863     ir_bool (iea, p->required, "required", argi);
864     ir_HumanString (iea, p->description, "description", argi);
865     ir_HumanString (iea, p->contents, "contents", argi);
866     ir_HumanString (iea, p->billingInfo, "billingInfo", argi);
867     ir_HumanString (iea, p->restrictions, "restrictions", argi);
868     ir_sequence (ir_InternationalString, iea, p->alternateNames,
869                  &p->num_alternateNames, "alternateNames", argi);
870     ir_sequence (ir_InternationalString, iea, p->genericNames,
871                  &p->num_genericNames, "genericNames", argi);
872     ir_AttributeCombinations (iea, p->searchAccess, "searchAccess", argi);
873     return ir_match_end (name, iea, argi);
874 }
875
876 static int ir_RecordTag (IrExpArg *iea,
877             Z_RecordTag *p, const char *name, int argi)
878 {
879     if (!ir_match_start (name, p, iea, ++argi))
880         return TCL_OK;
881     ir_StringOrNumeric (iea, p->qualifier, "qualifier", argi);
882     ir_StringOrNumeric (iea, p->tagValue, "tagValue", argi);
883     return ir_match_end (name, iea, argi);
884 }
885
886 static int ir_SortDetails (IrExpArg *iea,
887             Z_SortDetails *p, const char *name, int argi)
888 {
889     if (!ir_match_start (name, p, iea, ++argi))
890         return TCL_OK;
891     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
892     ir_DatabaseName (iea, p->databaseName, "databaseName", argi);
893     ir_sequence (ir_SortKeyDetails, iea, p->sortKeys,
894                  &p->num_sortKeys, "sortKeys", argi);
895     return ir_match_end (name, iea, argi);
896 }
897
898 static int ir_SortKeyDetailsSortType (IrExpArg *iea,
899             Z_SortKeyDetailsSortType *p, const char *name, int argi)
900 {
901     static IrExpChoice sortArm [] = {
902         { "character",   Z_SortKeyDetailsSortType_character, 
903                          ir_null },
904         { "numeric",     Z_SortKeyDetailsSortType_numeric, 
905                          ir_null },
906         { "structured",  Z_SortKeyDetailsSortType_structured, 
907                          ir_HumanString },
908         { NULL, 0, NULL }};
909     return ir_choice (iea, sortArm, &p->which, p->u.character, argi); 
910 }
911
912 static int ir_SortKeyDetails (IrExpArg *iea,
913             Z_SortKeyDetails *p, const char *name, int argi)
914 {
915     static IrExpChoice sortArm [] = {
916         { "always",      Z_SortKeyDetails_always, 
917                          ir_choice_nop },
918         { "never",       Z_SortKeyDetails_never, 
919                          ir_choice_nop },
920         { "defaultYes",  Z_SortKeyDetails_defaultYes, 
921                          ir_choice_nop },
922         { "defaultNo",   Z_SortKeyDetails_defaultNo, 
923                          ir_choice_nop },
924         { NULL, 0, NULL }};
925
926     if (!ir_match_start (name, p, iea, ++argi))
927         return TCL_OK;
928     ir_HumanString (iea, p->description, "description", argi);
929     ir_sequence (ir_Specification, iea, p->elementSpecifications,
930                  &p->num_elementSpecifications, "elementSpecifications", argi);
931     ir_AttributeCombinations (iea, p->attributeSpecifications,
932                                      "attributeSpecifications", argi);
933     ir_SortKeyDetailsSortType (iea, p->sortType, "sortType", argi);
934    
935     if (p->caseSensitivity) 
936         ir_choice (iea, sortArm, p->caseSensitivity, odr_nullval(), argi); 
937
938     return ir_match_end (name, iea, argi);
939 }
940
941 static int ir_ProcessingInformation (IrExpArg *iea,
942             Z_ProcessingInformation *p, const char *name, int argi)
943 {
944     IrExpChoice arm[] = {
945         { "access",             Z_ProcessingInformation_access,
946                                 ir_choice_nop },
947         { "search",             Z_ProcessingInformation_search,
948                                 ir_choice_nop },
949         { "retrieval",          Z_ProcessingInformation_retrieval,
950                                 ir_choice_nop },
951         { "recordPresentation", Z_ProcessingInformation_recordPresentation,
952                                 ir_choice_nop },
953         { "recordHandling",     Z_ProcessingInformation_recordHandling,
954                                 ir_choice_nop },
955         { NULL, 0, NULL }};
956     if (!ir_match_start (name, p, iea, ++argi))
957         return TCL_OK;
958     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
959     ir_DatabaseName (iea, p->databaseName, "databaseName", argi);
960
961     ir_choice (iea, arm, p->processingContext, odr_nullval(), argi);
962     ir_InternationalString (iea, p->name, "name", argi);
963     ir_oid (iea, p->oid, "oid", argi);
964     ir_HumanString (iea, p->description, "description", argi);
965     ir_External (iea, p->instructions, "instructions", argi);
966     return ir_match_end (name, iea, argi);
967 }
968
969 static int ir_VariantSetInfo (IrExpArg *iea,
970             Z_VariantSetInfo *p, const char *name, int argi)
971 {
972     if (!ir_match_start (name, p, iea, ++argi))
973         return TCL_OK;
974     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
975     ir_oid (iea, p->variantSet, "variantSet", argi);
976     ir_InternationalString (iea, p->name, "name", argi);
977     ir_sequence (ir_VariantClass, iea, p->variants,
978                  &p->num_variants, "variants", argi);
979     return ir_match_end (name, iea, argi);
980 }
981
982 static int ir_VariantClass (IrExpArg *iea,
983             Z_VariantClass *p, const char *name, int argi)
984 {
985     if (!ir_match_start (name, p, iea, ++argi))
986         return TCL_OK;
987     ir_InternationalString (iea, p->name, "name", argi);
988     ir_HumanString (iea, p->description, "description", argi);
989     ir_integer (iea, p->variantClass, "variantClass", argi);
990     ir_sequence (ir_VariantType, iea, p->variantTypes,
991                  &p->num_variantTypes, "variantTypes", argi);
992     return ir_match_end (name, iea, argi);
993 }
994
995 static int ir_VariantType (IrExpArg *iea,
996             Z_VariantType *p, const char *name, int argi)
997 {
998     if (!ir_match_start (name, p, iea, ++argi))
999         return TCL_OK;
1000     ir_InternationalString (iea, p->name, "name", argi);
1001     ir_HumanString (iea, p->description, "description", argi);
1002     ir_integer (iea, p->variantType, "variantType", argi);
1003     ir_VariantValue (iea, p->variantValue, "variantValue", argi);
1004     return ir_match_end (name, iea, argi);
1005 }
1006
1007 static int ir_ValueSetEnumerated (IrExpArg *iea,
1008             Z_ValueSetEnumerated *p, const char *name, int argi)
1009 {
1010     if (!ir_match_start (name, p, iea, ++argi))
1011         return TCL_OK;
1012     ir_sequence (ir_ValueDescription, iea, p->enumerated,
1013                  &p->num_enumerated, "enumerated", argi);
1014     return ir_match_end (name, iea, argi);
1015 }
1016
1017 static int ir_ValueSet (IrExpArg *iea,
1018             Z_ValueSet *p, const char *name, int argi)
1019 {
1020     IrExpChoice arm [] = {
1021         { "range",      Z_ValueSet_range,      ir_ValueRange },
1022         { "enumerated", Z_ValueSet_enumerated, ir_ValueSetEnumerated },
1023         { NULL, 0, NULL }};
1024     if (!ir_match_start (name, p, iea, ++argi))
1025         return TCL_OK;
1026     ir_choice (iea, arm, &p->which, p->u.range, argi);
1027     return ir_match_end (name, iea, argi);
1028 }
1029
1030 static int ir_VariantValue (IrExpArg *iea,
1031             Z_VariantValue *p, const char *name, int argi)
1032 {
1033     if (!ir_match_start (name, p, iea, ++argi))
1034         return TCL_OK;
1035     ir_PrimitiveDataType (iea, p->dataType, "dataType", argi);
1036     if (p->values)
1037         ir_ValueSet (iea, p->values, "values", argi);
1038     return ir_match_end (name, iea, argi);
1039 }
1040
1041 static int ir_ValueRange (IrExpArg *iea,
1042             Z_ValueRange *p, const char *name, int argi)
1043 {
1044     if (!ir_match_start (name, p, iea, ++argi))
1045         return TCL_OK;
1046     ir_ValueDescription (iea, p->lower, "lower", argi);
1047     ir_ValueDescription (iea, p->upper, "upper", argi);
1048     return ir_match_end (name, iea, argi);
1049 }
1050
1051 static int ir_ValueDescription (IrExpArg *iea,
1052             Z_ValueDescription *p, const char *name, int argi)
1053 {
1054     static IrExpChoice arm [] = {
1055         { "integer",      Z_ValueDescription_integer, ir_integer },
1056         { "string",       Z_ValueDescription_string,  ir_InternationalString},
1057         { "octets",       Z_ValueDescription_octets,  ir_octet},
1058         { "oid",          Z_ValueDescription_oid,     ir_oid},
1059         { "unit",         Z_ValueDescription_unit,    ir_Unit},
1060         { "valueAndUnit", Z_ValueDescription_valueAndUnit, ir_IntUnit},
1061         { NULL, 0, NULL }};
1062
1063     if (!ir_match_start (name, p, iea, ++argi))
1064         return TCL_OK;
1065     ir_choice (iea, arm, &p->which, p->u.integer, argi);
1066     return ir_match_end (name, iea, argi);
1067 }
1068
1069 static int ir_UnitInfo (IrExpArg *iea,
1070             Z_UnitInfo *p, const char *name, int argi)
1071 {
1072     if (!ir_match_start (name, p, iea, ++argi))
1073         return TCL_OK;
1074     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
1075     ir_InternationalString (iea, p->unitSystem, "unitSystem", argi);
1076     ir_HumanString (iea, p->description, "description", argi);
1077     ir_sequence (ir_UnitType, iea, p->units,
1078                  &p->num_units, "units", argi);
1079     return ir_match_end (name, iea, argi);
1080 }
1081
1082 static int ir_UnitType (IrExpArg *iea,
1083             Z_UnitType *p, const char *name, int argi)
1084 {
1085     if (!ir_match_start (name, p, iea, ++argi))
1086         return TCL_OK;
1087     ir_InternationalString (iea, p->name, "name", argi);
1088     ir_HumanString (iea, p->description, "description", argi);
1089     ir_StringOrNumeric (iea, p->unitType, "unitType", argi);
1090     ir_sequence (ir_Units, iea, p->units, &p->num_units, "units", argi);
1091     return ir_match_end (name, iea, argi);
1092 }
1093
1094 static int ir_Units (IrExpArg *iea,
1095             Z_Units *p, const char *name, int argi)
1096 {
1097     if (!ir_match_start (name, p, iea, ++argi))
1098         return TCL_OK;
1099     ir_InternationalString (iea, p->name, "name", argi);
1100     ir_HumanString (iea, p->description, "description", argi);
1101     ir_StringOrNumeric (iea, p->unit, "unit", argi);
1102     return ir_match_end (name, iea, argi);
1103 }
1104
1105 static int ir_CategoryList (IrExpArg *iea,
1106             Z_CategoryList *p, const char *name, int argi)
1107 {
1108     if (!ir_match_start (name, p, iea, ++argi))
1109         return TCL_OK;
1110     ir_CommonInfo (iea, p->commonInfo, "commonInfo", argi);
1111     ir_sequence (ir_CategoryInfo, iea, p->categories,
1112                  &p->num_categories, "categories", argi);
1113     return ir_match_end (name, iea, argi);
1114 }
1115
1116 static int ir_CategoryInfo (IrExpArg *iea,
1117             Z_CategoryInfo *p, const char *name, int argi)
1118 {
1119     if (!ir_match_start (name, p, iea, ++argi))
1120         return TCL_OK;
1121     ir_InternationalString (iea, p->category, "category", argi);
1122     ir_InternationalString (iea, p->originalCategory, "originalCategory", argi);
1123     ir_HumanString (iea, p->description, "description", argi);
1124     ir_InternationalString (iea, p->asn1Module, "asn1Module", argi);
1125     return ir_match_end (name, iea, argi);
1126 }
1127
1128 static int ir_CommonInfo (IrExpArg *iea,
1129             Z_CommonInfo *p, const char *name, int argi)
1130 {
1131     if (!ir_match_start (name, p, iea, ++argi))
1132         return TCL_OK;
1133     ir_GeneralizedTime (iea, p->dateAdded, "dateAdded", argi);
1134     ir_GeneralizedTime (iea, p->dateChanged, "dateChanged", argi);
1135     ir_GeneralizedTime (iea, p->expiry, "expiry", argi);
1136     ir_LanguageCode (iea, p->humanStringLanguage, "humanString-Language",
1137                      argi);
1138     ir_OtherInformation (iea, p->otherInfo, "otherInfo", argi);
1139     return ir_match_end (name, iea, argi);
1140 }
1141
1142 static int ir_HumanStringUnit (IrExpArg *iea,
1143             Z_HumanStringUnit *p, const char *name, int argi)
1144 {
1145     if (!ir_match_start (name, p, iea, ++argi))
1146         return TCL_OK;
1147     ir_LanguageCode (iea, p->language, "language", argi);
1148     ir_InternationalString (iea, p->text, "text", argi);
1149     return ir_match_end (name, iea, argi);
1150 }
1151
1152 static int ir_HumanString (IrExpArg *iea,
1153             Z_HumanString *p, const char *name, int argi)
1154 {
1155     if (!ir_match_start (name, p, iea, ++argi))
1156         return TCL_OK;
1157     ir_sequence (ir_HumanStringUnit, iea, p->strings,
1158                  &p->num_strings, "strings", argi);
1159     return ir_match_end (name, iea, argi);
1160 }
1161
1162 static int ir_IconObjectUnit (IrExpArg *iea,
1163             Z_IconObjectUnit *p, const char *name, int argi)
1164 {
1165     static IrExpChoice arm [] = {
1166         { "ianaType",     Z_IconObject_ianaType,  ir_choice_nop },
1167         { "z3950type",    Z_IconObject_z3950type, ir_choice_nop },
1168         { "otherType",    Z_IconObject_otherType, ir_choice_nop },
1169         { NULL, 0, NULL }};
1170     if (!ir_match_start (name, p, iea, ++argi))
1171         return TCL_OK;
1172     ir_choice (iea, arm, &p->which, odr_nullval(), argi);
1173     ir_InternationalString (iea, p->bodyType, "bodyType", argi);
1174     ir_octet (iea, p->content, "content", argi);
1175     return ir_match_end (name, iea, argi);
1176 }
1177
1178 static int ir_IconObject (IrExpArg *iea,
1179             Z_IconObject *p, const char *name, int argi)
1180 {
1181     if (!ir_match_start (name, p, iea, ++argi))
1182         return TCL_OK;
1183     ir_sequence (ir_IconObjectUnit, iea, p->iconUnits,
1184                  &p->num_iconUnits, "iconUnits", argi);
1185     return ir_match_end (name, iea, argi);
1186 }
1187
1188 static int ir_ContactInfo (IrExpArg *iea,
1189             Z_ContactInfo *p, const char *name, int argi)
1190 {
1191     if (!ir_match_start (name, p, iea, ++argi))
1192         return TCL_OK;
1193     ir_InternationalString (iea, p->name, "name", argi);
1194     ir_HumanString (iea, p->description, "description", argi);
1195     ir_HumanString (iea, p->address, "address", argi);
1196     ir_InternationalString (iea, p->email, "email", argi);
1197     ir_InternationalString (iea, p->phone, "phone", argi);
1198     return ir_match_end (name, iea, argi);
1199 }
1200
1201 static int ir_NetworkAddressIA (IrExpArg *iea,
1202             Z_NetworkAddressIA *p, const char *name, int argi)
1203 {
1204     if (!ir_match_start (name, p, iea, ++argi))
1205         return TCL_OK;
1206     ir_InternationalString (iea, p->hostAddress, "hostAddress", argi);
1207     ir_integer (iea, p->port, "port", argi);
1208     return ir_match_end (name, iea, argi);
1209 }
1210
1211 static int ir_NetworkAddressOPA (IrExpArg *iea,
1212             Z_NetworkAddressOPA *p, const char *name, int argi)
1213 {
1214     if (!ir_match_start (name, p, iea, ++argi))
1215         return TCL_OK;
1216     ir_InternationalString (iea, p->pSel, "pSel", argi);
1217     ir_InternationalString (iea, p->sSel, "sSel", argi);
1218     ir_InternationalString (iea, p->tSel, "tSel", argi);
1219     ir_InternationalString (iea, p->nSap, "nSap", argi);
1220     return ir_match_end (name, iea, argi);
1221 }
1222
1223 static int ir_NetworkAddressOther (IrExpArg *iea,
1224             Z_NetworkAddressOther *p, const char *name, int argi)
1225 {
1226     if (!ir_match_start (name, p, iea, ++argi))
1227         return TCL_OK;
1228     ir_InternationalString (iea, p->type, "type", argi);
1229     ir_InternationalString (iea, p->address, "address", argi);
1230     return ir_match_end (name, iea, argi);
1231 }
1232
1233 static int ir_NetworkAddress (IrExpArg *iea,
1234             Z_NetworkAddress *p, const char *name, int argi)
1235 {
1236     IrExpChoice arm [] = {
1237         { "iA",    Z_NetworkAddress_iA,    ir_NetworkAddressIA },
1238         { "oPA",   Z_NetworkAddress_oPA,   ir_NetworkAddressOPA },
1239         { "other", Z_NetworkAddress_other, ir_NetworkAddressOther },
1240         { NULL, 0, NULL }};
1241     if (!ir_match_start (name, p, iea, ++argi))
1242         return TCL_OK;
1243     ir_choice (iea, arm, &p->which, p->u.internetAddress, argi);
1244     return ir_match_end (name, iea, argi);
1245 }
1246
1247 static int ir_AccessInfo (IrExpArg *iea,
1248             Z_AccessInfo *p, const char *name, int argi)
1249 {
1250     if (!ir_match_start (name, p, iea, ++argi))
1251         return TCL_OK;
1252     ir_sequence (ir_QueryTypeDetails, iea, p->queryTypesSupported,
1253                  &p->num_queryTypesSupported, "queryTypesSupported", argi);
1254     ir_sequence (ir_oid, iea, p->diagnosticsSets,
1255                  &p->num_diagnosticsSets, "diagnosticsSets", argi);
1256     ir_sequence (ir_oid, iea, p->attributeSetIds,
1257                  &p->num_attributeSetIds, "attributeSetIds", argi);
1258     ir_sequence (ir_oid, iea, p->schemas,
1259                  &p->num_schemas, "schemas", argi);
1260     ir_sequence (ir_oid, iea, p->recordSyntaxes,
1261                  &p->num_recordSyntaxes, "recordSyntaxes", argi);
1262     ir_sequence (ir_oid, iea, p->resourceChallenges,
1263                  &p->num_resourceChallenges, "resourceChallenges", argi);
1264     ir_AccessRestrictions (iea, p->restrictedAccess, "restrictedAccess", argi);
1265     ir_Costs (iea, p->costInfo, "costInfo", argi);
1266     ir_sequence (ir_oid, iea, p->variantSets,
1267                  &p->num_variantSets, "variantSets", argi);
1268     ir_sequence (ir_ElementSetName, iea, p->elementSetNames,
1269                  &p->num_elementSetNames, "elementSetNames", argi);
1270     ir_sequence (ir_InternationalString, iea, p->unitSystems,
1271                  &p->num_unitSystems, "unitSystems", argi);
1272     return ir_match_end (name, iea, argi);
1273 }
1274
1275
1276 static int ir_QueryTypeDetails (IrExpArg *iea,
1277             Z_QueryTypeDetails *p, const char *name, int argi)
1278 {
1279     static IrExpChoice arm[] = {
1280         { "private",    Z_QueryTypeDetails_private,
1281                         ir_PrivateCapabilities },
1282         { "rpn",        Z_QueryTypeDetails_rpn,
1283                         ir_RpnCapabilities },
1284         { "iso8777",    Z_QueryTypeDetails_iso8777,
1285                         ir_Iso8777Capabilities },
1286         { "z3958",      Z_QueryTypeDetails_z3958,
1287                         ir_HumanString },
1288         { "erpn",       Z_QueryTypeDetails_erpn,
1289                         ir_RpnCapabilities },
1290         { "rankedList", Z_QueryTypeDetails_rankedList,
1291                         ir_HumanString },
1292         { NULL, 0, NULL }};
1293
1294     if (!ir_match_start (name, p, iea, ++argi))
1295         return TCL_OK;
1296     ir_choice (iea, arm, &p->which, p->u.zprivate, argi);
1297     return ir_match_end (name, iea, argi);
1298 }
1299
1300 static int ir_PrivateCapOperator (IrExpArg *iea,
1301             Z_PrivateCapOperator *p, const char *name, int argi)
1302 {
1303     if (!ir_match_start (name, p, iea, ++argi))
1304         return TCL_OK;
1305     ir_InternationalString (iea, p->roperator, "operator", argi);
1306     ir_HumanString (iea, p->description, "description", argi);
1307     return ir_match_end (name, iea, argi);
1308 }
1309
1310 static int ir_PrivateCapabilities (IrExpArg *iea,
1311             Z_PrivateCapabilities *p, const char *name, int argi)
1312 {
1313     if (!ir_match_start (name, p, iea, ++argi))
1314         return TCL_OK;
1315
1316     ir_sequence (ir_PrivateCapOperator, iea, p->operators,
1317                  &p->num_operators, "operators", argi);
1318     ir_sequence (ir_SearchKey, iea, p->searchKeys,
1319                  &p->num_searchKeys, "searchKeys", argi);
1320     ir_sequence (ir_HumanString, iea, p->description,
1321                  &p->num_description, "description", argi);
1322     return ir_match_end (name, iea, argi);
1323 }
1324
1325 static int ir_RpnCapabilities (IrExpArg *iea,
1326             Z_RpnCapabilities *p, const char *name, int argi)
1327 {
1328     if (!ir_match_start (name, p, iea, ++argi))
1329         return TCL_OK;
1330     ir_sequence (ir_integer, iea, p->operators, 
1331                  &p->num_operators, "operators", argi);
1332     ir_bool (iea, p->resultSetAsOperandSupported,
1333              "resultSetAsOperandSupported", argi);
1334     ir_bool (iea, p->restrictionOperandSupported,
1335              "restrictionOperandSupported", argi);
1336     ir_ProximitySupport (iea, p->proximity, "proximity", argi);
1337     return ir_match_end (name, iea, argi);
1338 }
1339
1340 static int ir_Iso8777Capabilities (IrExpArg *iea,
1341             Z_Iso8777Capabilities *p, const char *name, int argi)
1342 {
1343     if (!ir_match_start (name, p, iea, ++argi))
1344         return TCL_OK;
1345     ir_sequence (ir_SearchKey, iea, p->searchKeys,
1346                  &p->num_searchKeys, "searchKeys", argi);
1347     ir_HumanString (iea, p->restrictions, "restrictions", argi);
1348     return ir_match_end (name, iea, argi);
1349 }
1350
1351 static int ir_ProxSupportPrivate (IrExpArg *iea,
1352             Z_ProxSupportPrivate *p, const char *name, int argi)
1353 {
1354     if (!ir_match_start (name, p, iea, ++argi))
1355         return TCL_OK;
1356     ir_integer (iea, p->unit, "unit", argi);
1357     ir_HumanString (iea, p->description, "description", argi);
1358     return ir_match_end (name, iea, argi);
1359 }
1360
1361 static int ir_ProxSupportUnit (IrExpArg *iea,
1362             Z_ProxSupportUnit *p, const char *name, int argi)
1363 {
1364     static IrExpChoice arm [] = {
1365         { "known",   Z_ProxSupportUnit_known,   ir_integer },
1366         { "private", Z_ProxSupportUnit_private, ir_ProxSupportPrivate },
1367         { NULL, 0, NULL }};
1368     if (!ir_match_start (name, p, iea, ++argi))
1369         return TCL_OK;
1370     ir_choice (iea, arm, &p->which, p->u.zprivate, argi);
1371     return ir_match_end (name, iea, argi);
1372 }
1373
1374 static int ir_ProximitySupport (IrExpArg *iea,
1375             Z_ProximitySupport *p, const char *name, int argi)
1376 {
1377     if (!ir_match_start (name, p, iea, ++argi))
1378         return TCL_OK;
1379     ir_bool (iea, p->anySupport, "anySupport", argi);
1380     ir_sequence (ir_ProxSupportUnit, iea, p->unitsSupported,
1381                  &p->num_unitsSupported, "unitsSupported", argi);
1382     return ir_match_end (name, iea, argi);
1383 }
1384
1385 static int ir_SearchKey (IrExpArg *iea,
1386             Z_SearchKey *p, const char *name, int argi)
1387 {
1388     if (!ir_match_start (name, p, iea, ++argi))
1389         return TCL_OK;
1390     ir_InternationalString (iea, p->searchKey, "searchKey", argi);
1391     ir_HumanString (iea, p->description, "description", argi);
1392     return ir_match_end (name, iea, argi);
1393 }
1394
1395 static int ir_AccessRestrictionsUnit (IrExpArg *iea,
1396             Z_AccessRestrictionsUnit *p, const char *name, int argi)
1397 {
1398     static IrExpChoice arm[] = {
1399         { "any",               Z_AccessRestrictions_any,
1400                                ir_choice_nop },
1401         { "search",            Z_AccessRestrictions_search,
1402                                ir_choice_nop },
1403         { "present",           Z_AccessRestrictions_present,
1404                                ir_choice_nop },
1405         { "specificElements",  Z_AccessRestrictions_specific_elements,
1406                                ir_choice_nop },
1407         { "extendedServices",  Z_AccessRestrictions_extended_services,
1408                                ir_choice_nop },
1409         { "byDatabase",        Z_AccessRestrictions_by_database,
1410                                ir_choice_nop },
1411         { NULL, 0, NULL }};
1412
1413     if (!ir_match_start (name, p, iea, ++argi))
1414         return TCL_OK;
1415     ir_choice (iea, arm, p->accessType, odr_nullval(), argi);
1416     ir_HumanString (iea, p->accessText, "accessText", argi);
1417     ir_sequence (ir_oid, iea, p->accessChallenges,
1418                  &p->num_accessChallenges, "accessChallenges", argi);
1419     return ir_match_end (name, iea, argi);
1420 }
1421
1422 static int ir_AccessRestrictions (IrExpArg *iea,
1423             Z_AccessRestrictions *p, const char *name, int argi)
1424 {
1425     if (!ir_match_start (name, p, iea, ++argi))
1426         return TCL_OK;
1427     ir_sequence (ir_AccessRestrictionsUnit, iea, p->restrictions,
1428                  &p->num_restrictions, "restrictions", argi);
1429     return ir_match_end (name, iea, argi);
1430 }
1431
1432 static int ir_CostsOtherCharge (IrExpArg *iea,
1433             Z_CostsOtherCharge *p, const char *name, int argi)
1434 {
1435     if (!ir_match_start (name, p, iea, ++argi))
1436         return TCL_OK;
1437     ir_HumanString (iea, p->forWhat, "forWhat", argi);
1438     ir_Charge (iea, p->charge, "charge", argi);
1439     return ir_match_end (name, iea, argi);
1440 }
1441
1442 static int ir_Costs (IrExpArg *iea,
1443             Z_Costs *p, const char *name, int argi)
1444 {
1445     if (!ir_match_start (name, p, iea, ++argi))
1446         return TCL_OK;
1447     ir_Charge (iea, p->connectCharge, "connectCharge", argi);
1448     ir_Charge (iea, p->connectTime, "connectTime", argi);
1449     ir_Charge (iea, p->displayCharge, "displayCharge", argi);
1450     ir_Charge (iea, p->searchCharge, "searchCharge", argi);
1451     ir_Charge (iea, p->subscriptCharge, "subscriptCharge", argi);
1452
1453     ir_sequence (ir_CostsOtherCharge, iea, p->otherCharges,
1454                  &p->num_otherCharges, "otherCharges", argi);
1455     return ir_match_end (name, iea, argi);
1456 }
1457
1458 static int ir_Charge (IrExpArg *iea,
1459             Z_Charge *p, const char *name, int argi)
1460 {
1461     if (!ir_match_start (name, p, iea, ++argi))
1462         return TCL_OK;
1463     ir_IntUnit (iea, p->cost, "cost", argi);
1464     ir_Unit (iea, p->perWhat, "perWhat", argi);
1465     ir_HumanString (iea, p->text, "text", argi);
1466     return ir_match_end (name, iea, argi);
1467 }
1468
1469 static int ir_DatabaseList (IrExpArg *iea,
1470             Z_DatabaseList *p, const char *name, int argi)
1471 {
1472     if (!ir_match_start (name, p, iea, ++argi))
1473         return TCL_OK;
1474     ir_sequence (ir_DatabaseName, iea, p->databases,
1475                  &p->num_databases, "databases", argi);
1476     return ir_match_end (name, iea, argi);
1477 }
1478
1479 static int ir_AttributeCombinations (IrExpArg *iea,
1480             Z_AttributeCombinations *p, const char *name, int argi)
1481 {
1482     if (!ir_match_start (name, p, iea, ++argi))
1483         return TCL_OK;
1484     ir_oid (iea, p->defaultAttributeSet, "defaultAttributeSet", argi);
1485     ir_sequence (ir_AttributeCombination, iea, p->legalCombinations,
1486                  &p->num_legalCombinations, "legalCombinations", argi);
1487     return ir_match_end (name, iea, argi);
1488 }
1489
1490 static int ir_AttributeCombination (IrExpArg *iea,
1491             Z_AttributeCombination *p, const char *name, int argi)
1492 {
1493     if (!ir_match_start (name, p, iea, ++argi))
1494         return TCL_OK;
1495     ir_sequence (ir_AttributeOccurrence, iea, p->occurrences,
1496                  &p->num_occurrences, "occurrences", argi);
1497     return ir_match_end (name, iea, argi);
1498 }
1499
1500 static int ir_AttributeValueList (IrExpArg *iea,
1501             Z_AttributeValueList *p, const char *name, int argi)
1502 {
1503     if (!ir_match_start (name, p, iea, ++argi))
1504         return TCL_OK;
1505     ir_sequence (ir_StringOrNumeric, iea, p->attributes,
1506                  &p->num_attributes, "attributes", argi);
1507     return ir_match_end (name, iea, argi);
1508 }
1509
1510 static int ir_AttributeOccurrence (IrExpArg *iea,
1511             Z_AttributeOccurrence *p, const char *name, int argi)
1512 {
1513     static IrExpChoice arm [] = {
1514         { "anyOrNone",   Z_AttributeOcc_anyOrNone, ir_null },
1515         { "specific",    Z_AttributeOcc_specific,  ir_AttributeValueList },
1516         { NULL, 0, NULL } };
1517     if (!ir_match_start (name, p, iea, ++argi))
1518         return TCL_OK;
1519     ir_oid (iea, p->attributeSet, "attributeSet", argi);
1520     ir_integer (iea, p->attributeType, "attributeType", argi);
1521     ir_null (iea, p->mustBeSupplied, "mustBeSupplied", argi);
1522     ir_choice (iea, arm, &p->which, p->attributeValues.anyOrNone, argi);
1523     return ir_match_end (name, iea, argi);
1524 }
1525
1526 static int ir_AttributeValue (IrExpArg *iea,
1527             Z_AttributeValue *p, const char *name, int argi)
1528 {
1529     if (!ir_match_start (name, p, iea, ++argi))
1530         return TCL_OK;
1531     ir_StringOrNumeric (iea, p->value, "value", argi);
1532     ir_HumanString (iea, p->description, "description", argi);
1533     ir_sequence (ir_StringOrNumeric, iea, p->subAttributes,
1534                  &p->num_subAttributes, "subAttributes", argi);
1535     ir_sequence (ir_StringOrNumeric, iea, p->superAttributes,
1536                  &p->num_superAttributes, "superAttributes", argi);
1537     ir_null (iea, p->partialSupport, "partialSupport", argi);
1538     return ir_match_end (name, iea, argi);
1539 }
1540
1541 static int ir_StringOrNumeric (IrExpArg *iea,
1542             Z_StringOrNumeric *p, const char *name, int argi)
1543 {
1544     IrExpChoice arm[] = {
1545         { "string",  Z_StringOrNumeric_string,  ir_InternationalString },
1546         { "numeric", Z_StringOrNumeric_numeric, ir_integer },
1547         { NULL, 0, NULL }};
1548     if (!ir_match_start (name, p, iea, ++argi))
1549         return TCL_OK;
1550     ir_choice (iea, arm, &p->which, p->u.string, argi);
1551     return ir_match_end (name, iea, argi);
1552 }
1553
1554 static int ir_ElementSpec (IrExpArg *iea,
1555             Z_ElementSpec *p, const char *name, int argi)
1556 {
1557     static IrExpChoice arm[] = {
1558         { "elementSetName", Z_ElementSpec_elementSetName,
1559                             ir_InternationalString },
1560         { "externalSpec",   Z_ElementSpec_externalSpec,
1561                             ir_External },
1562         { NULL, 0, NULL }};
1563
1564     if (!ir_match_start (name, p, iea, ++argi))
1565         return TCL_OK;
1566     ir_choice (iea, arm, &p->which, p->u.elementSetName, argi);
1567     return ir_match_end (name, iea, argi);
1568 }
1569
1570 static int ir_Specification (IrExpArg *iea,
1571             Z_Specification *p, const char *name, int argi)
1572 {
1573     if (!ir_match_start (name, p, iea, ++argi))
1574         return TCL_OK;
1575     ir_oid (iea, p->schema, "schema", argi);
1576     ir_ElementSpec (iea, p->elementSpec, "elementSpec", argi);
1577     return ir_match_end (name, iea, argi);
1578 }
1579
1580 static int ir_InfoCategory (IrExpArg *iea,
1581             Z_InfoCategory *p, const char *name, int argi)
1582 {
1583     if (!ir_match_start (name, p, iea, ++argi))
1584         return TCL_OK;
1585     ir_oid (iea, p->categoryTypeId, "categoryTypeId", argi);
1586     ir_integer (iea, p->categoryValue, "categoryValue", argi);
1587     return ir_match_end (name, iea, argi);
1588 }
1589
1590 static int ir_OtherInformationUnit (IrExpArg *iea,
1591             Z_OtherInformationUnit *p, const char *name, int argi)
1592 {
1593     static IrExpChoice arm[] = {
1594         { "characterInfo",           Z_OtherInfo_characterInfo,
1595                                     ir_InternationalString },
1596         { "binaryInfo",              Z_OtherInfo_binaryInfo,
1597                                     ir_octet},
1598         { "externallyDefinedInfo",   Z_OtherInfo_externallyDefinedInfo,
1599                                     ir_External},
1600         { "oid",                     Z_OtherInfo_oid,
1601                                     ir_oid},
1602         { NULL, 0, NULL }};
1603
1604     if (!ir_match_start (name, p, iea, ++argi))
1605         return TCL_OK;
1606     ir_InfoCategory (iea, p->category, "category", argi);
1607     ir_choice (iea, arm, &p->which, p->information.characterInfo, argi);
1608     return ir_match_end (name, iea, argi);
1609 }
1610
1611 static int ir_OtherInformation (IrExpArg *iea,
1612             Z_OtherInformation *p, const char *name, int argi)
1613 {
1614     if (!ir_match_start (name, p, iea, ++argi))
1615         return TCL_OK;
1616     ir_sequence (ir_OtherInformationUnit, iea, p->list, 
1617                  &p->num_elements, "list", argi);
1618     return ir_match_end (name, iea, argi);
1619 }
1620
1621 static int ir_IntUnit (IrExpArg *iea,
1622             Z_IntUnit *p, const char *name, int argi)
1623 {
1624     if (!ir_match_start (name, p, iea, ++argi))
1625         return TCL_OK;
1626     ir_integer (iea, p->value, "value", argi);
1627     ir_Unit (iea, p->unitUsed, "unitUsed", argi);
1628     return ir_match_end (name, iea, argi);
1629 }
1630
1631 static int ir_Unit (IrExpArg *iea,
1632             Z_Unit *p, const char *name, int argi)
1633 {
1634     if (!ir_match_start (name, p, iea, ++argi))
1635         return TCL_OK;
1636     ir_InternationalString (iea, p->unitSystem, "unitSystem", argi);
1637     ir_StringOrNumeric (iea, p->unitType, "unitType", argi);
1638     ir_StringOrNumeric (iea, p->unit, "unit", argi);
1639     ir_integer (iea, p->scaleFactor, "scaleFactor", argi);
1640     return ir_match_end (name, iea, argi);
1641 }
1642
1643 int ir_ExplainRecord (IrExpArg *iea, Z_ExplainRecord *p, int argi)
1644 {
1645     static IrExpChoice arm[] = {
1646         {"targetInfo",              Z_Explain_targetInfo,
1647                                            ir_TargetInfo},
1648         {"databaseInfo",            Z_Explain_databaseInfo,
1649                                            ir_DatabaseInfo},
1650         {"schemaInfo",              Z_Explain_schemaInfo,
1651                                            ir_SchemaInfo},
1652         {"tagSetInfo",              Z_Explain_tagSetInfo,
1653                                            ir_TagSetInfo},
1654         {"recordSyntaxInfo",        Z_Explain_recordSyntaxInfo,
1655                                            ir_RecordSyntaxInfo},
1656         {"attributeSetInfo",        Z_Explain_attributeSetInfo,
1657                                            ir_AttributeSetInfo},
1658         {"termListInfo",            Z_Explain_termListInfo,
1659                                            ir_TermListInfo},
1660         {"extendedServicesInfo",    Z_Explain_extendedServicesInfo,
1661                                            ir_ExtendedServicesInfo},
1662         {"attributeDetails",        Z_Explain_attributeDetails,
1663                                            ir_AttributeDetails},
1664         {"termListDetails",         Z_Explain_termListDetails,
1665                                            ir_TermListDetails},
1666         {"elementSetDetails",       Z_Explain_elementSetDetails,
1667                                            ir_ElementSetDetails},
1668         {"retrievalRecordDetails",  Z_Explain_retrievalRecordDetails,
1669                                            ir_RetrievalRecordDetails},
1670         {"sortDetails",             Z_Explain_sortDetails,
1671                                            ir_SortDetails},
1672         {"processing",              Z_Explain_processing,
1673                                            ir_ProcessingInformation},
1674         {"variants",                Z_Explain_variants,
1675                                            ir_VariantSetInfo},
1676         {"units",                   Z_Explain_units,
1677                                            ir_UnitInfo},
1678         {"categoryList",            Z_Explain_categoryList,
1679                                            ir_CategoryList},
1680         {NULL,                         0,   NULL }};
1681         
1682
1683     return ir_choice (iea, arm, &p->which, p->u.targetInfo, argi);
1684 }
1685
1686 int ir_tcl_get_explain (Tcl_Interp *interp, Z_ExplainRecord *rec,
1687                         int argc, char **argv)
1688 {
1689     IrExpArg iea;
1690
1691     iea.argv = argv;
1692     iea.argc = argc;
1693     iea.interp = interp;
1694
1695     return ir_ExplainRecord (&iea, rec, 2);
1696 }