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