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