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