Small mods.
[yaz-moved-to-github.git] / odr / test.c
1 #include <stdio.h>
2 #include <odr.h>
3 #include <odr_use.h>
4
5 typedef Odr_bitmask Z_ReferenceId;
6
7 typedef struct Z_InitRequest
8 {
9     Z_ReferenceId *referenceId;    /* OPTIONAL */
10     Odr_bitmask *options;
11     Odr_bitmask *protocolVersion;
12     int *preferredMessageSize;
13     int *maximumRecordSize;
14     char *idAuthentication;      /* OPTIONAL */
15     char *implementationId;      /* OPTIONAL */
16     char *implementationName;    /* OPTIONAL */
17     char *implementationVersion; /* OPTIONAL */
18 } Z_InitRequest;
19
20 int z_ReferenceId(ODR o, Z_ReferenceId **p, int opt)
21 {
22     return odr_implicit(o, odr_octetstring, (Odr_oct**) p, ODR_CONTEXT, 2, opt);
23 }
24
25 int z_InitRequest(ODR o, Z_InitRequest **p, int opt)
26 {
27     Z_InitRequest *pp;
28
29     if (!odr_sequence_begin(o, p, sizeof(Z_InitRequest)))
30         return opt;
31     pp = *p;
32     return
33         z_ReferenceId(o, &pp->referenceId, 1) &&
34         odr_implicit(o, odr_bitstring, &pp->protocolVersion, ODR_CONTEXT, 
35             3, 0) &&
36         odr_implicit(o, odr_bitstring, &pp->options, ODR_CONTEXT, 4, 0) &&
37         odr_implicit(o, odr_integer, &pp->preferredMessageSize, ODR_CONTEXT,
38             5, 0) &&
39         odr_implicit(o, odr_integer, &pp->maximumRecordSize, ODR_CONTEXT,
40             6, 0) &&
41         odr_implicit(o, odr_visiblestring, &pp->idAuthentication, ODR_CONTEXT,
42             7, 1) &&
43         odr_implicit(o, odr_visiblestring, &pp->implementationId, ODR_CONTEXT,
44             110, 1) &&
45         odr_implicit(o, odr_visiblestring, &pp->implementationName, ODR_CONTEXT,
46             111, 1) &&
47         odr_implicit(o, odr_visiblestring, &pp->implementationVersion,
48             ODR_CONTEXT, 112, 1) &&
49         odr_sequence_end(o);
50 }
51
52 struct A
53 {
54     int which;
55     union
56     {
57         int *b;   /* integer */
58         char *c;  /* visstring */
59     } u;
60 };
61
62 int f_A(ODR o, struct A **p, int opt)
63 {
64     int res;
65     Odr_arm arm[] =
66     {
67         { -1, -1, -1, 0, (Odr_fun) odr_integer },
68         { ODR_IMPLICIT, ODR_CONTEXT, 200, 1, (Odr_fun) odr_visiblestring },
69         { -1, -1, -1, -1, 0 }
70     };
71
72     if (o->direction == ODR_DECODE && !*p)
73         *p = nalloc(o, sizeof(**p));
74     res = odr_choice(o, arm, &(*p)->u, &(*p)->which);
75     if (!res)
76     {
77         *p = 0;
78         return opt;
79     }
80     return 1;
81 }
82
83 #if 0
84 int main()
85 {
86     int i;
87     unsigned char buf[4048];
88     struct odr o;
89     Z_InitRequest ireq, *ireqp, *ireq2p;
90     Odr_bitmask options, protocolVersion;
91     char *iId = "YAZ", *iName = "Yet Another Z39.50 Implementation",
92         *iVersion = "0.1";
93     int maximumRS = 4096, preferredMS = 2048;
94     static Odr_oid oid[] = {1, 2, 3, 4, -1}, *oidp1, *oidp2;
95
96     oidp1 = oid;
97
98     ODR_MASK_ZERO(&protocolVersion);
99     ODR_MASK_SET(&protocolVersion, 0);
100     ODR_MASK_SET(&protocolVersion, 1);
101
102     ODR_MASK_ZERO(&options);
103     ODR_MASK_SET(&options, 0);
104     ODR_MASK_SET(&options, 1);
105     ODR_MASK_SET(&options, 2);
106
107     ireq.referenceId = 0;
108     ireq.protocolVersion = &protocolVersion;
109     ireq.options = &options;
110     ireq.preferredMessageSize = &preferredMS;
111     ireq.maximumRecordSize = &maximumRS;
112     ireq.idAuthentication = 0;
113     ireq.implementationId = iId;
114     ireq.implementationName = iName;
115     ireq.implementationVersion = iVersion;
116     ireqp = &ireq;
117
118     o.buf = buf;
119     o.bp=o.buf;
120     o.left = o.buflen = 1024;
121     o.direction = ODR_ENCODE;
122     o.t_class = -1;
123
124     odr_oid(&o, &oidp1, 0);
125
126     o.direction = ODR_DECODE;
127     o.bp = o.buf;
128
129     odr_oid(&o, &oidp2, 0);
130 }    
131 #endif
132
133 int main()
134 {
135     struct A ch, *chp1, *chp2;
136     int b = 9999;
137     char *c = "Nu tester vi en satans forpulet CHOICE!";
138     struct odr o;
139     unsigned char buf[4096];
140     
141     ch.u.c = c; 
142     ch.which = 1;
143     chp1 = &ch;
144
145     o.buf = buf;
146     o.bp=o.buf;
147     o.left = o.buflen = 1024;
148     o.direction = ODR_ENCODE;
149     o.t_class = -1;
150
151     f_A(&o, &chp1, 0);
152
153     o.direction = ODR_DECODE;
154     o.bp = o.buf;
155
156     f_A(&o, &chp2, 0);
157
158     return 0;
159 }