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