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