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