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