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