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