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