Implemented date and time structure. Changed the Update Extended
[yaz-moved-to-github.git] / asn / prt-esp.c
1 /*
2  * Copyright (c) 1995, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: prt-esp.c,v $
7  * Revision 1.2  1998-02-10 15:31:46  adam
8  * Implemented date and time structure. Changed the Update Extended
9  * Service.
10  *
11  * Revision 1.1  1995/10/12 10:34:37  quinn
12  * Added Espec-1.
13  *
14  *
15  */
16
17 #include <proto.h>
18
19 int z_OccurValues(ODR o, Z_OccurValues **p, int opt)
20 {
21     if (!odr_sequence_begin(o, p, sizeof(**p)))
22         return opt && odr_ok(o);
23     return
24         odr_implicit(o, odr_integer, &(*p)->start, ODR_CONTEXT, 1, 0) &&
25         odr_implicit(o, odr_integer, &(*p)->howMany, ODR_CONTEXT, 2, 1) &&
26         odr_sequence_end(o);
27 }
28
29 int z_Occurrences(ODR o, Z_Occurrences **p, int opt)
30 {
31     static Odr_arm arm[] =
32     {
33         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Occurrences_all, odr_null},
34         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Occurrences_last, odr_null},
35         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Occurrences_values, z_OccurValues},
36         {-1, -1, -1, -1, 0}
37     };
38
39     if (o->direction == ODR_DECODE)
40         *p = odr_malloc(o, sizeof(**p));
41     else if (!*p)
42         return opt;
43     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
44         return 1;
45     *p = 0;
46     return opt && odr_ok(o);
47 }
48
49 int z_SpecificTag(ODR o, Z_SpecificTag **p, int opt)
50 {
51     if (!odr_sequence_begin(o, p, sizeof(**p)))
52         return opt && odr_ok(o);
53     return
54         odr_implicit(o, odr_oid, &(*p)->schemaId, ODR_CONTEXT, 0, 1) &&
55         odr_implicit(o, odr_integer, &(*p)->tagType, ODR_CONTEXT, 1, 1) &&
56         odr_explicit(o, z_StringOrNumeric, &(*p)->tagValue, ODR_CONTEXT,
57             2, 0) &&
58         odr_explicit(o, z_Occurrences, &(*p)->occurrences, ODR_CONTEXT, 3, 1) &&
59         odr_sequence_end(o);
60 }
61
62 int z_ETagUnit(ODR o, Z_ETagUnit **p, int opt)
63 {
64     static Odr_arm arm[] =
65     {
66         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ETagUnit_specificTag, z_SpecificTag},
67         {ODR_EXPLICIT, ODR_CONTEXT, 2, Z_ETagUnit_wildThing, z_Occurrences},
68         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_ETagUnit_wildPath, odr_null},
69         {-1, -1, -1 -1, 0}
70     };
71
72     if (o->direction == ODR_DECODE)
73         *p = odr_malloc(o, sizeof(**p));
74     else if (!*p)
75         return opt;
76     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
77         return 1;
78     *p = 0;
79     return opt && odr_ok(o);
80 }
81
82 int z_ETagPath(ODR o, Z_ETagPath **p, int opt)
83 {
84     if (o->direction == ODR_DECODE)
85         *p = odr_malloc(o, sizeof(**p));
86     else if (!*p)
87         return opt;
88     if (odr_sequence_of(o, z_ETagUnit, &(*p)->tags, &(*p)->num_tags))
89         return 1;
90     *p = 0;
91     return opt && odr_ok(o);
92 }
93
94 int z_SimpleElement(ODR o, Z_SimpleElement **p, int opt)
95 {
96     if (!odr_sequence_begin(o, p, sizeof(**p)))
97         return opt && odr_ok(o);
98     return
99         odr_implicit(o, z_ETagPath, &(*p)->path, ODR_CONTEXT, 1, 0) &&
100         odr_implicit(o, z_Variant, &(*p)->variantRequest, ODR_CONTEXT,
101             2, 1) &&
102         odr_sequence_end(o);
103 }
104
105 int z_CompoPrimitives(ODR o, Z_CompoPrimitives **p, int opt)
106 {
107     if (o->direction == ODR_DECODE)
108         *p = odr_malloc(o, sizeof(**p));
109     else if (!*p)
110         return opt;
111     if (odr_sequence_of(o, z_InternationalString, &(*p)->primitives,
112         &(*p)->num_primitives))
113         return 1;
114     *p = 0;
115     return opt && odr_ok(o);
116 }
117
118 int z_CompoSpecs(ODR o, Z_CompoSpecs **p, int opt)
119 {
120     if (o->direction == ODR_DECODE)
121         *p = odr_malloc(o, sizeof(**p));
122     else if (!*p)
123         return opt;
124     if (odr_sequence_of(o, z_SimpleElement, &(*p)->specs, &(*p)->num_specs))
125         return 1;
126     *p = 0;
127     return opt && odr_ok(o);
128 }
129
130 int z_CompositeElement(ODR o, Z_CompositeElement **p, int opt)
131 {
132     static Odr_arm arm[] =
133     {
134         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_CompoElement_primitives,
135             z_CompoPrimitives},
136         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_CompoElement_specs,
137             z_CompoSpecs},
138         {-1, -1, -1, -1, 0}
139     };
140
141     if (!odr_sequence_begin(o, p, sizeof(**p)))
142         return opt && odr_ok(o);
143     return
144         odr_constructed_begin(o, &(*p)->elementList, ODR_CONTEXT, 1) &&
145         odr_choice(o, arm, &(*p)->elementList, &(*p)->which) &&
146         odr_constructed_end(o) &&
147         odr_implicit(o, z_ETagPath, &(*p)->deliveryTag, ODR_CONTEXT, 2, 0) &&
148         odr_implicit(o, z_Variant, &(*p)->variantRequest, ODR_CONTEXT, 3, 1) &&
149         odr_sequence_end(o);
150 }
151
152 int z_ElementRequest(ODR o, Z_ElementRequest **p, int opt)
153 {
154     static Odr_arm arm[] =
155     {
156         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ERequest_simpleElement,
157             z_SimpleElement},
158         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ERequest_compositeElement,
159             z_CompositeElement},
160         {-1, -1, -1 -1, 0}
161     };
162
163     if (o->direction == ODR_DECODE)
164         *p = odr_malloc(o, sizeof(**p));
165     else if (!*p)
166         return opt;
167     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
168         return 1;
169     *p = 0;
170     return opt && odr_ok(o);
171 }
172
173 int z_Espec1(ODR o, Z_Espec1 **p, int opt)
174 {
175     if (!odr_sequence_begin(o, p, sizeof(**p)))
176         return opt && odr_ok(o);
177     return
178         odr_implicit_settag(o, ODR_CONTEXT, 1) &&
179         (odr_sequence_of(o, z_InternationalString, &(*p)->elementSetNames,
180             &(*p)->num_elementSetNames) || odr_ok(o)) &&
181         odr_implicit(o, odr_oid, &(*p)->defaultVariantSetId, ODR_CONTEXT,
182             2, 1) &&
183         odr_implicit(o, z_Variant, &(*p)->defaultVariantRequest, ODR_CONTEXT,
184             3, 1) &&
185         odr_implicit(o, odr_integer, &(*p)->defaultTagType, ODR_CONTEXT,
186             4, 1) &&
187         odr_implicit_settag(o, ODR_CONTEXT, 5) &&
188         (odr_sequence_of(o, z_ElementRequest, &(*p)->elements,
189             &(*p)->num_elements) || odr_ok(o)) &&
190         odr_sequence_end(o);
191 }