c396b992c441809bc3045ffcde0d183f43781532
[yaz-moved-to-github.git] / asn / prt-dat.c
1 /*
2  * This file is part of the YAZ toolkit:
3  * Copyright (c) 1998-1999, Index Data.
4  * See the file LICENSE for details.
5  * Sebastian Hammer, Adam Dickmeiss
6  *
7  * Contribution by Ronald van Der Meer (RVDM):
8  *  Databasix Information Systems B.V., Utrecht, The Netherlands.
9  *
10  * $Log: prt-dat.c,v $
11  * Revision 1.4  1999-11-30 13:47:11  adam
12  * Improved installation. Moved header files to include/yaz.
13  *
14  * Revision 1.3  1999/04/20 09:56:47  adam
15  * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
16  * Modified all encoders/decoders to reflect this change.
17  *
18  * Revision 1.2  1998/02/11 11:53:32  adam
19  * Changed code so that it compiles as C++.
20  *
21  * Revision 1.1  1998/02/10 15:31:46  adam
22  * Implemented date and time structure. Changed the Update Extended
23  * Service.
24  *
25  */
26
27 #include <yaz/proto.h>
28
29 int z_MonthAndDay(ODR o, Z_MonthAndDay **p, int opt, const char *name)
30 {
31     if (!odr_sequence_begin(o, p, sizeof(**p), 0))
32         return opt && odr_ok(o);
33     return
34         odr_implicit(o, odr_integer, &(*p)->month, ODR_CONTEXT, 2, 0) &&
35         odr_implicit(o, odr_integer, &(*p)->day, ODR_CONTEXT, 3, 1) &&
36         odr_sequence_end(o);
37 }
38
39 int z_Quarter(ODR o, Z_Quarter **p, int opt, const char *name)
40 {
41     static Odr_arm arm[] =
42     {
43         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Quarter_first,
44          (Odr_fun)odr_null, 0},
45         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Quarter_second,
46          (Odr_fun)odr_null, 0},
47         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Quarter_third,
48          (Odr_fun)odr_null, 0},
49         {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_Quarter_fourth,
50          (Odr_fun)odr_null, 0},
51         {-1, -1, -1, -1, 0, 0}
52     };
53     
54     if (!odr_initmember(o, p, sizeof(**p)))
55         return opt && odr_ok(o);
56     if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
57         return 1;
58     *p = 0;
59     return opt && odr_ok(o);
60 }
61
62 int z_Season(ODR o, Z_Season **p, int opt, const char *name)
63 {
64     static Odr_arm arm[] =
65     {
66         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Season_winter,
67          (Odr_fun)odr_null, 0},
68         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Season_spring,
69          (Odr_fun)odr_null, 0},
70         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Season_summer,
71          (Odr_fun)odr_null, 0},
72         {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_Season_autumn,
73          (Odr_fun)odr_null, 0},
74         {-1, -1, -1, -1, 0, 0}
75     };
76
77     if (!odr_initmember(o, p, sizeof(**p)))
78         return opt && odr_ok(o);
79     if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
80         return 1;
81     *p = 0;
82     return opt && odr_ok(o);
83 }
84
85 int z_PartOfYear(ODR o, Z_PartOfYear **p, int opt, const char *name)
86 {
87     static Odr_arm arm[] =
88     {
89         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_PartOfYear_monthAndDay,
90          (Odr_fun) z_MonthAndDay, 0},
91         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_PartOfYear_julianDay,
92          (Odr_fun) odr_integer, 0},
93         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_PartOfYear_weekNumber,
94          (Odr_fun) odr_integer, 0},
95         {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_PartOfYear_quarter,
96          (Odr_fun) z_Quarter, 0},
97         {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_PartOfYear_season,
98          (Odr_fun) z_Season, 0},
99         {-1, -1, -1, -1, 0, 0}
100     };
101     
102     if (!odr_initmember(o, p, sizeof(**p)))
103         return opt && odr_ok(o);
104     if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
105         return 1;
106     *p = 0;
107     return opt && odr_ok(o);
108 }
109
110 int z_Era(ODR o, Z_Era **p, int opt, const char *name)
111 {
112     static Odr_arm arm[] =
113     {
114         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Era_decade, (Odr_fun)odr_null, 0},
115         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Era_century, (Odr_fun)odr_null, 0},
116         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Era_millennium, (Odr_fun)odr_null, 0},
117         {-1, -1, -1, -1, 0, 0}
118     };
119     
120     if (!odr_initmember(o, p, sizeof(**p)))
121         return opt && odr_ok(o);
122     if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
123         return 1;
124     *p = 0;
125     return opt && odr_ok(o);
126 }
127
128 int z_DateFlags(ODR o, Z_DateFlags **p, int opt, const char *name)
129 {
130     if (!odr_sequence_begin(o, p, sizeof(**p), 0))
131         return opt && odr_ok(o);
132     return
133         odr_implicit(o, odr_null, &(*p)->circa, ODR_CONTEXT, 1, 1) &&
134         odr_implicit(o, z_Era, &(*p)->era, ODR_CONTEXT, 2, 1) &&
135         odr_sequence_end(o);
136 }
137
138 int z_Date(ODR o, Z_Date **p, int opt, const char *name)
139 {
140     if (!odr_sequence_begin(o, p, sizeof(**p), 0))
141         return opt && odr_ok(o);
142     return
143         odr_implicit(o, odr_integer, &(*p)->year, ODR_CONTEXT, 1, 0) &&
144         odr_implicit(o, z_PartOfYear, &(*p)->partOfYear, ODR_CONTEXT, 1, 1) &&
145         odr_implicit(o, z_DateFlags, &(*p)->flags, ODR_CONTEXT, 2, 1) &&
146         odr_sequence_end(o);
147 }
148
149 int z_Zone(ODR o, Z_Zone **p, int opt, const char *name)
150 {
151     static Odr_arm arm[] =
152     {
153         {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Zone_local, (Odr_fun)odr_null, 0},
154         {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Zone_utc, (Odr_fun)odr_null, 0},
155         {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Zone_utcOffset,
156          (Odr_fun)odr_integer, 0},
157         {-1, -1, -1, -1, 0, 0}
158     };
159     
160     if (!odr_initmember(o, p, sizeof(**p)))
161         return opt && odr_ok(o);
162     if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
163         return 1;
164     *p = 0;
165     return opt && odr_ok(o);
166 }
167
168 int z_Time(ODR o, Z_Time **p, int opt, const char *name)
169 {
170     if (!odr_sequence_begin(o, p, sizeof(**p), 0))
171         return opt && odr_ok(o);
172     return
173         odr_implicit(o, odr_integer, &(*p)->hour, ODR_CONTEXT, 1, 0) &&
174         odr_implicit(o, odr_integer, &(*p)->minute, ODR_CONTEXT, 2, 1) &&
175         odr_implicit(o, odr_integer, &(*p)->second, ODR_CONTEXT, 3, 1) &&
176         odr_implicit(o, z_IntUnit, &(*p)->partOfSecond, ODR_CONTEXT, 4, 1) &&
177         odr_implicit(o, z_Zone, &(*p)->zone, ODR_CONTEXT, 5, 1) &&
178         odr_sequence_end(o);
179 }
180
181 int z_DateTime(ODR o, Z_DateTime **p, int opt, const char *name)
182 {
183     if (!odr_sequence_begin(o, p, sizeof(**p), 0))
184         return opt && odr_ok(o);
185     return
186         odr_implicit(o, z_Date, &(*p)->z3950Date, ODR_CONTEXT, 1, 1) &&
187         odr_implicit(o, z_Time, &(*p)->z3950Time, ODR_CONTEXT, 2, 1) &&
188         odr_sequence_end(o);
189 }
190