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