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