Added body-of-text to BIB-1 ANY and the WAIS profile
[yaz-moved-to-github.git] / asn / prt-dia.c
1 /*
2  * Copyright (c) 1995, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: prt-dia.c,v $
7  * Revision 1.4  1996-01-22 09:46:34  quinn
8  * Added Sort PDU. Moved StringList to main protocol file.
9  *
10  * Revision 1.3  1995/09/29  17:11:54  quinn
11  * Smallish
12  *
13  * Revision 1.2  1995/09/27  15:02:41  quinn
14  * Modified function heads & prototypes.
15  *
16  * Revision 1.1  1995/08/29  11:19:31  quinn
17  * Added Diagnostic Format
18  *
19  *
20  */
21
22 #include <proto.h>
23
24 int z_TooMany(ODR o, Z_TooMany **p, int opt)
25 {
26     if (!odr_sequence_begin(o, p, sizeof(**p)))
27         return opt && odr_ok(o);
28     return
29         odr_implicit(o, odr_integer, &(*p)->tooManyWhat, ODR_CONTEXT, 1, 0) &&
30         odr_implicit(o, odr_integer, &(*p)->max, ODR_CONTEXT, 2, 1) &&
31         odr_sequence_end(o);
32 }
33
34 int z_BadSpec(ODR o, Z_BadSpec **p, int opt)
35 {
36     if (!odr_sequence_begin(o, p, sizeof(**p)))
37         return opt && odr_ok(o);
38     return
39         odr_implicit(o, z_Specification, &(*p)->spec, ODR_CONTEXT, 1, 0) &&
40         odr_implicit(o, z_DatabaseName, &(*p)->db, ODR_CONTEXT, 2, 1) &&
41         odr_implicit_settag(o, ODR_CONTEXT, 3) &&
42         (odr_sequence_of(o, z_Specification, &(*p)->goodOnes,
43             &(*p)->num_goodOnes) || odr_ok(o)) &&
44         odr_sequence_end(o);
45 }
46
47 int z_DbUnavailWhy(ODR o, Z_DbUnavailWhy **p, int opt)
48 {
49     if (!odr_sequence_begin(o, p, sizeof(**p)))
50         return opt && odr_ok(o);
51     return
52         odr_implicit(o, odr_integer, &(*p)->reasonCode, ODR_CONTEXT, 1, 1) &&
53         odr_implicit(o, z_InternationalString, &(*p)->message, ODR_CONTEXT,
54             2, 1) &&
55         odr_sequence_end(o);
56 }
57
58 int z_DbUnavail(ODR o, Z_DbUnavail **p, int opt)
59 {
60     if (!odr_sequence_begin(o, p, sizeof(**p)))
61         return opt && odr_ok(o);
62     return
63         odr_implicit(o, z_DatabaseName, &(*p)->db, ODR_CONTEXT, 1, 0) &&
64         odr_implicit(o, z_DbUnavailWhy, &(*p)->why, ODR_CONTEXT, 2, 0) &&
65         odr_sequence_end(o);
66 }
67
68 int z_Attribute(ODR o, Z_Attribute **p, int opt)
69 {
70     if (!odr_sequence_begin(o, p, sizeof(**p)))
71         return opt && odr_ok(o);
72     return
73         odr_implicit(o, odr_oid, &(*p)->id, ODR_CONTEXT, 1, 0) &&
74         odr_implicit(o, odr_integer, &(*p)->type, ODR_CONTEXT, 2, 1) &&
75         odr_implicit(o, odr_integer, &(*p)->value, ODR_CONTEXT, 3, 1) &&
76         odr_explicit(o, z_Term, &(*p)->term, ODR_CONTEXT, 4, 1) &&
77         odr_sequence_end(o);
78 }
79
80 int z_AttCombo(ODR o, Z_AttCombo **p, int opt)
81 {
82     if (!odr_sequence_begin(o, p, sizeof(**p)))
83         return opt && odr_ok(o);
84     return
85         odr_implicit(o, z_AttributeList, &(*p)->unsupportedCombination,
86             ODR_CONTEXT, 1, 0) &&
87         odr_implicit_settag(o, ODR_CONTEXT, 2) &&
88         (odr_sequence_of(o, z_AttributeList, &(*p)->alternatives,
89             &(*p)->num_alternatives) || odr_ok(o)) &&
90         odr_sequence_end(o);
91 }
92
93 int z_DiagTerm(ODR o, Z_DiagTerm **p, int opt)
94 {
95     if (!odr_sequence_begin(o, p, sizeof(**p)))
96         return opt && odr_ok(o);
97     return
98         odr_implicit(o, odr_integer, &(*p)->problem, ODR_CONTEXT, 1, 1) &&
99         odr_explicit(o, z_Term, &(*p)->term, ODR_CONTEXT, 2, 0) &&
100         odr_sequence_end(o);
101 }
102
103 int z_Proximity(ODR o, Z_Proximity **p, int opt)
104 {
105     static Odr_arm arm[] =
106     {
107         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Proximity_resultSets, odr_null},
108         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Proximity_badSet,
109             z_InternationalString},
110         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Proximity_relation, odr_integer},
111         {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_Proximity_unit, odr_integer},
112         {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_Proximity_distance, odr_integer},
113         {ODR_EXPLICIT, ODR_CONTEXT, 6, Z_Proximity_attributes, z_AttributeList},
114         {ODR_IMPLICIT, ODR_CONTEXT, 7, Z_Proximity_ordered, odr_null},
115         {ODR_IMPLICIT, ODR_CONTEXT, 8, Z_Proximity_exclusion, odr_null},
116         {-1, -1, -1, -1, 0}
117     };
118
119     if (o->direction == ODR_DECODE)
120         *p = odr_malloc(o, sizeof(**p));
121     else if (!*p)
122         return opt;
123     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
124         return 1;
125     *p = 0;
126     return opt && odr_ok(o);
127 }
128
129 int z_AttrListList(ODR o, Z_AttrListList **p, int opt)
130 {
131     if (o->direction == ODR_DECODE)
132         *p = odr_malloc(o, sizeof(**p));
133     else if (!*p)
134         return opt;
135     if (odr_sequence_of(o, z_AttributeList, &(*p)->lists, &(*p)->num_lists))
136         return 1;
137     *p = 0;
138     return opt && odr_ok(o);
139 }
140
141 int z_Scan(ODR o, Z_Scan **p, int opt)
142 {
143     static Odr_arm arm[] =
144     {
145         {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ScanD_nonZeroStepSize, odr_null},
146         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ScanD_specifiedStepSize, odr_null},
147         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_ScanD_termList1, odr_null},
148         {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_ScanD_termList2, z_AttrListList},
149         {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_ScanD_posInResponse, odr_integer},
150         {ODR_IMPLICIT, ODR_CONTEXT, 6, Z_ScanD_resources, odr_null},
151         {ODR_IMPLICIT, ODR_CONTEXT, 7, Z_ScanD_endOfList, odr_null},
152         {-1, -1, -1, -1, 0}
153     };
154
155     if (o->direction == ODR_DECODE)
156         *p = odr_malloc(o, sizeof(**p));
157     else if (!*p)
158         return opt;
159     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
160         return 1;
161     *p = 0;
162     return opt && odr_ok(o);
163 }
164
165 int z_Sort(ODR o, Z_Sort **p, int opt)
166 {
167     static Odr_arm arm[] =
168     {
169         {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SortD_sequence, odr_null},
170         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_SortD_noRsName, odr_null},
171         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortD_tooMany, odr_integer},
172         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_SortD_incompatible, odr_null},
173         {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_SortD_generic, odr_null},
174         {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_SortD_dbSpecific, odr_null},
175 #if 0
176         {ODR_EXPLICIT, ODR_CONTEXT, 6, Z_SortD_sortElement, z_SortElement},
177 #endif
178         {ODR_IMPLICIT, ODR_CONTEXT, 7, Z_SortD_key, odr_integer},
179         {ODR_IMPLICIT, ODR_CONTEXT, 8, Z_SortD_action, odr_null},
180         {ODR_IMPLICIT, ODR_CONTEXT, 9, Z_SortD_illegal, odr_integer},
181         {ODR_IMPLICIT, ODR_CONTEXT, 10, Z_SortD_inputTooLarge, z_StringList},
182         {ODR_IMPLICIT, ODR_CONTEXT, 11, Z_SortD_aggregateTooLarge, odr_null},
183         {-1, -1, -1, -1, 0}
184     };
185
186     if (o->direction == ODR_DECODE)
187         *p = odr_malloc(o, sizeof(**p));
188     else if (!*p)
189         return opt;
190     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
191         return 1;
192     *p = 0;
193     return opt && odr_ok(o);
194 }
195
196 int z_Segmentation(ODR o, Z_Segmentation **p, int opt)
197 {
198     static Odr_arm arm[] =
199     {
200         {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SegmentationD_segments, odr_null},
201         {-1, -1, -1, -1, 0}
202     };
203
204     if (o->direction == ODR_DECODE)
205         *p = odr_malloc(o, sizeof(**p));
206     else if (!*p)
207         return opt;
208     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
209         return 1;
210     *p = 0;
211     return opt && odr_ok(o);
212 }
213
214 int z_ExtServices(ODR o, Z_ExtServices **p, int opt)
215 {
216     static Odr_arm arm[] =
217     {
218         {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ExtServicesD_req, odr_integer},
219         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ExtServicesD_permission, odr_integer},
220         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ExtServicesD_immediate, odr_integer},
221         {-1, -1, -1, -1, 0}
222     };
223
224     if (o->direction == ODR_DECODE)
225         *p = odr_malloc(o, sizeof(**p));
226     else if (!*p)
227         return opt;
228     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
229         return 1;
230     *p = 0;
231     return opt && odr_ok(o);
232 }
233
234 int z_OidList(ODR o, Z_OidList **p, int opt)
235 {
236     if (o->direction == ODR_DECODE)
237         *p = odr_malloc(o, sizeof(**p));
238     else if (!*p)
239         return opt;
240     if (odr_sequence_of(o, odr_oid, &(*p)->oids, &(*p)->num_oids))
241         return 1;
242     *p = 0;
243     return opt && odr_ok(o);
244 }
245
246 int z_AccessCtrl(ODR o, Z_AccessCtrl **p, int opt)
247 {
248     static Odr_arm arm[] =
249     {
250         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_AccessCtrlD_noUser, odr_null},
251         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_AccessCtrlD_refused, odr_null},
252         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_AccessCtrlD_simple, odr_null},
253         {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_AccessCtrlD_oid, z_OidList},
254         {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_AccessCtrlD_alternative, z_OidList},
255         {ODR_IMPLICIT, ODR_CONTEXT, 6, Z_AccessCtrlD_pwdInv, odr_null},
256         {ODR_IMPLICIT, ODR_CONTEXT, 7, Z_AccessCtrlD_pwdExp, odr_null},
257         {-1, -1, -1, -1, 0}
258     };
259
260     if (o->direction == ODR_DECODE)
261         *p = odr_malloc(o, sizeof(**p));
262     else if (!*p)
263         return opt;
264     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
265         return 1;
266     *p = 0;
267     return opt && odr_ok(o);
268 }
269
270 int z_RecordSyntax(ODR o, Z_RecordSyntax **p, int opt)
271 {
272     if (!odr_sequence_begin(o, p, sizeof(**p)))
273         return opt && odr_ok(o);
274     return
275         odr_implicit(o, odr_oid, &(*p)->unsupportedSyntax, ODR_CONTEXT, 1, 0) &&
276         odr_implicit_settag(o, ODR_CONTEXT, 2) &&
277         (odr_sequence_of(o, odr_oid, &(*p)->suggestedAlternatives,
278             &(*p)->num_suggestedAlternatives) || odr_ok(o)) &&
279         odr_sequence_end(o);
280 }
281
282 int z_DiagFormat(ODR o, Z_DiagFormat **p, int opt)
283 {
284     static Odr_arm arm[] =
285     {
286         {ODR_IMPLICIT, ODR_CONTEXT, 1000, Z_DiagFormat_tooMany, z_TooMany},
287         {ODR_IMPLICIT, ODR_CONTEXT, 1001, Z_DiagFormat_badSpec, z_BadSpec},
288         {ODR_IMPLICIT, ODR_CONTEXT, 1002, Z_DiagFormat_dbUnavail, z_DbUnavail},
289         {ODR_IMPLICIT, ODR_CONTEXT, 1003, Z_DiagFormat_unSupOp, odr_integer},
290         {ODR_IMPLICIT, ODR_CONTEXT, 1004, Z_DiagFormat_attribute, z_Attribute},
291         {ODR_IMPLICIT, ODR_CONTEXT, 1005, Z_DiagFormat_attCombo, z_AttCombo},
292         {ODR_IMPLICIT, ODR_CONTEXT, 1006, Z_DiagFormat_term, z_DiagTerm},
293         {ODR_EXPLICIT, ODR_CONTEXT, 1007, Z_DiagFormat_proximity, z_Proximity},
294         {ODR_EXPLICIT, ODR_CONTEXT, 1008, Z_DiagFormat_scan, z_Scan},
295         {ODR_EXPLICIT, ODR_CONTEXT, 1009, Z_DiagFormat_sort, z_Sort},
296         {ODR_EXPLICIT, ODR_CONTEXT, 1010, Z_DiagFormat_segmentation,
297             z_Segmentation},
298         {ODR_EXPLICIT, ODR_CONTEXT, 1011, Z_DiagFormat_extServices,
299             z_ExtServices},
300         {ODR_EXPLICIT, ODR_CONTEXT, 1012, Z_DiagFormat_accessCtrl,
301             z_AccessCtrl},
302         {ODR_IMPLICIT, ODR_CONTEXT, 1013, Z_DiagFormat_recordSyntax,
303             z_RecordSyntax},
304         {-1, -1, -1, -1, 0}
305     };
306
307     if (o->direction == ODR_DECODE)
308         *p = odr_malloc(o, sizeof(**p));
309     else if (!*p)
310         return opt;
311     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
312         return 1;
313     *p = 0;
314     return opt && odr_ok(o);
315 }
316
317 int z_Diagnostic(ODR o, Z_Diagnostic **p, int opt)
318 {
319     static Odr_arm arm[] =
320     {
321         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Diagnostic_defaultDiagRec,
322             z_DefaultDiagFormat},
323         {ODR_EXPLICIT, ODR_CONTEXT, 2, Z_Diagnostic_explicitDiagnostic,
324             z_DiagFormat},
325         {-1, -1, -1, -1, 0}
326     };
327
328     if (o->direction == ODR_DECODE)
329         *p = odr_malloc(o, sizeof(**p));
330     else if (!*p)
331         return opt;
332     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
333         return 1;
334     *p = 0;
335     return opt && odr_ok(o);
336 }
337
338 int z_DiagnosticUnit(ODR o, Z_DiagnosticUnit **p, int opt)
339 {
340     if (!odr_sequence_begin(o, p, sizeof(**p)))
341         return opt && odr_ok(o);
342     return
343         odr_explicit(o, z_Diagnostic, &(*p)->diagnostic, ODR_CONTEXT, 1, 1) &&
344         odr_implicit(o, z_InternationalString, &(*p)->message, ODR_CONTEXT,
345             2, 1) &&
346         odr_sequence_end(o);
347 }
348
349 int z_DiagnosticFormat(ODR o, Z_DiagnosticFormat **p, int opt)
350 {
351     if (o->direction == ODR_DECODE)
352         *p = odr_malloc(o, sizeof(**p));
353     else if (!*p)
354         return opt;
355     if (odr_sequence_of(o, z_DiagnosticUnit, &(*p)->diagnostics,
356         &(*p)->num_diagnostics))
357         return 1;
358     *p = 0;
359     return opt && odr_ok(o);
360 }