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