1 /* This file is part of the YAZ toolkit.
2 * Copyright (C) Index Data
3 * See the file LICENSE for details.
10 #include <yaz/oid_util.h>
11 #include "test_odrcodec.h"
15 #define MYOID "1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19"
17 void tst_MySequence1(ODR encode, ODR decode)
22 Yc_MySequence *s = (Yc_MySequence *) odr_malloc(encode, sizeof(*s));
26 s->first = odr_intdup(encode, 12345);
27 s->second = (Odr_oct *) odr_malloc(encode, sizeof(*s->second));
28 s->second->buf = (char *) "hello";
30 s->third = odr_booldup(encode, 1);
31 s->fourth = odr_nullval();
32 s->fifth = odr_intdup(encode, YC_MySequence_enum1);
34 s->myoid = odr_getoidbystr(decode, MYOID);
36 ret = yc_MySequence(encode, &s, 0, 0);
41 ber_buf = odr_getbuf(encode, &ber_len, 0);
43 odr_setbuf(decode, ber_buf, ber_len, 0);
45 ret = yc_MySequence(decode, &t, 0, 0);
52 YAZ_CHECK(t->first && *t->first == 12345);
54 YAZ_CHECK(t->second && t->second->buf && t->second->len == 5);
56 YAZ_CHECK(t->second && t->second->buf && t->second->len == 5 &&
57 memcmp(t->second->buf, "hello", t->second->len) == 0);
59 YAZ_CHECK(t->third && *t->third == 1);
63 YAZ_CHECK(t->fifth && *t->fifth == YC_MySequence_enum1);
68 Odr_oid *myoid = odr_getoidbystr(decode, MYOID);
70 YAZ_CHECK(oid_oidcmp(myoid, t->myoid) == 0);
74 void tst_MySequence2(ODR encode, ODR decode)
77 Yc_MySequence *s = (Yc_MySequence *) odr_malloc(encode, sizeof(*s));
80 s->first = 0; /* deliberately miss this .. */
81 s->second = (Odr_oct *) odr_malloc(encode, sizeof(*s->second));
82 s->second->buf = (char *) "hello";
84 s->third = odr_booldup(encode, 1);
85 s->fourth = odr_nullval();
86 s->fifth = odr_intdup(encode, YC_MySequence_enum1);
87 s->myoid = odr_getoidbystr(encode, MYOID);
89 ret = yc_MySequence(encode, &s, 0, 0); /* should fail */
92 YAZ_CHECK(odr_geterror(encode) == OREQUIRED);
94 YAZ_CHECK(strcmp(odr_getelement(encode), "first") == 0);
97 YAZ_CHECK(odr_geterror(encode) == ONONE);
99 YAZ_CHECK(strcmp(odr_getelement(encode), "") == 0);
102 void tst_MySequence3(ODR encode, ODR decode)
109 for (i = 0; i < 1000; i++)
112 for (j = 0; j < (int) sizeof(buf); j++)
115 for (j = 1; j < (int) sizeof(buf); j++)
117 odr_setbuf(decode, buf, j, 0);
118 yc_MySequence(decode, &t, 0, 0);
124 static void tst_berint32(ODR encode, ODR decode)
134 r = ber_integer(encode, &val);
136 buf = odr_getbuf(encode, &len, 0);
138 YAZ_CHECK_EQ(len, 2);
139 YAZ_CHECK_EQ(buf[0], 1);
140 YAZ_CHECK_EQ(buf[1], 0);
143 odr_setbuf(decode, buf, len, 0);
144 ber_integer(decode, &ret_val);
145 YAZ_CHECK_EQ(ret_val, 0);
149 r = ber_integer(encode, &val);
151 buf = odr_getbuf(encode, &len, 0);
153 YAZ_CHECK_EQ(len, 2);
154 YAZ_CHECK_EQ(buf[0], 1);
155 YAZ_CHECK_EQ(buf[1], 1);
158 odr_setbuf(decode, buf, len, 0);
159 ber_integer(decode, &ret_val);
160 YAZ_CHECK_EQ(ret_val, 1);
164 r = ber_integer(encode, &val);
166 buf = odr_getbuf(encode, &len, 0);
168 YAZ_CHECK_EQ(len, 2);
169 YAZ_CHECK_EQ(buf[0], 1);
170 YAZ_CHECK_EQ((unsigned char) buf[1], 255);
173 odr_setbuf(decode, buf, len, 0);
174 ber_integer(decode, &ret_val);
175 YAZ_CHECK_EQ(ret_val, -1);
179 r = ber_integer(encode, &val);
181 buf = odr_getbuf(encode, &len, 0);
183 YAZ_CHECK_EQ(len, 2);
184 YAZ_CHECK_EQ(buf[0], 1);
185 YAZ_CHECK_EQ(buf[1], 127);
188 odr_setbuf(decode, buf, len, 0);
189 ber_integer(decode, &ret_val);
190 YAZ_CHECK_EQ(ret_val, 127);
195 r = ber_integer(encode, &val);
197 buf = odr_getbuf(encode, &len, 0);
199 YAZ_CHECK_EQ(len, 3);
200 YAZ_CHECK_EQ(buf[0], 2);
201 YAZ_CHECK_EQ(buf[1], 0);
202 YAZ_CHECK_EQ(((unsigned char *) buf)[2], 128);
205 odr_setbuf(decode, buf, len, 0);
206 ber_integer(decode, &ret_val);
207 YAZ_CHECK_EQ(ret_val, 128);
209 val = 2147483647; /* 2^31-1 */
211 r = ber_integer(encode, &val);
213 buf = odr_getbuf(encode, &len, 0);
215 YAZ_CHECK_EQ(len, 5);
216 YAZ_CHECK_EQ(buf[0], 4);
217 YAZ_CHECK_EQ(buf[1], 127);
218 YAZ_CHECK_EQ((unsigned char) buf[2], 255);
219 YAZ_CHECK_EQ((unsigned char) buf[3], 255);
220 YAZ_CHECK_EQ((unsigned char) buf[4], 255);
223 odr_setbuf(decode, buf, len, 0);
224 ber_integer(decode, &ret_val);
225 YAZ_CHECK_EQ(ret_val, 2147483647);
227 val = -2147483647L -1; /* -2^31 */
229 r = ber_integer(encode, &val);
231 buf = odr_getbuf(encode, &len, 0);
233 YAZ_CHECK_EQ(len, 5);
234 YAZ_CHECK_EQ(buf[0], 4);
235 YAZ_CHECK_EQ((unsigned char) buf[1], 128);
236 YAZ_CHECK_EQ(buf[2], 0);
237 YAZ_CHECK_EQ(buf[3], 0);
238 YAZ_CHECK_EQ(buf[4], 0);
241 odr_setbuf(decode, buf, len, 0);
242 ber_integer(decode, &ret_val);
243 YAZ_CHECK_EQ(ret_val, (Odr_int) -2147483647L -1);
246 static void tst_berint64(ODR encode, ODR decode)
255 val = (Odr_int) 2 * 2147483648UL; /* 2^32 */
257 r = ber_integer(encode, &val);
259 buf = odr_getbuf(encode, &len, 0);
261 YAZ_CHECK_EQ(len, 6);
262 YAZ_CHECK_EQ(buf[0], 5);
263 YAZ_CHECK_EQ(buf[1], 1);
264 YAZ_CHECK_EQ(buf[2], 0);
265 YAZ_CHECK_EQ(buf[3], 0);
266 YAZ_CHECK_EQ(buf[4], 0);
267 YAZ_CHECK_EQ(buf[5], 0);
270 odr_setbuf(decode, buf, len, 0);
271 ber_integer(decode, &ret_val);
272 YAZ_CHECK_EQ(ret_val, val);
274 val = (Odr_int) -2 * 2147483648UL; /* -2^32 */
276 r = ber_integer(encode, &val);
278 buf = odr_getbuf(encode, &len, 0);
280 YAZ_CHECK_EQ(len, 6);
281 YAZ_CHECK_EQ(buf[0], 5);
282 YAZ_CHECK_EQ((unsigned char) buf[1], 255);
283 YAZ_CHECK_EQ(buf[2], 0);
284 YAZ_CHECK_EQ(buf[3], 0);
285 YAZ_CHECK_EQ(buf[4], 0);
286 YAZ_CHECK_EQ(buf[5], 0);
289 odr_setbuf(decode, buf, len, 0);
290 ber_integer(decode, &ret_val);
291 YAZ_CHECK_EQ(ret_val, val);
293 val = (Odr_int) 1000 * 1000000000L; /* 10^12 */
295 r = ber_integer(encode, &val);
297 buf = odr_getbuf(encode, &len, 0);
299 YAZ_CHECK_EQ(len, 7);
300 YAZ_CHECK_EQ(buf[0], 6);
301 YAZ_CHECK_EQ(buf[1], 0);
302 YAZ_CHECK_EQ((unsigned char) buf[2], 232);
303 YAZ_CHECK_EQ((unsigned char) buf[3], 212);
304 YAZ_CHECK_EQ((unsigned char) buf[4], 165);
305 YAZ_CHECK_EQ(buf[5], 16);
306 YAZ_CHECK_EQ(buf[6], 0);
309 odr_setbuf(decode, buf, len, 0);
310 ber_integer(decode, &ret_val);
311 YAZ_CHECK_EQ(ret_val, val);
315 static void tst(void)
317 ODR odr_encode = odr_createmem(ODR_ENCODE);
318 ODR odr_decode = odr_createmem(ODR_DECODE);
320 YAZ_CHECK(odr_encode);
321 YAZ_CHECK(odr_decode);
323 tst_MySequence1(odr_encode, odr_decode);
324 tst_MySequence2(odr_encode, odr_decode);
325 tst_MySequence3(odr_encode, odr_decode);
327 tst_berint32(odr_encode, odr_decode);
328 tst_berint64(odr_encode, odr_decode);
330 odr_destroy(odr_encode);
331 odr_destroy(odr_decode);
334 /* example from documentation.. 'Using Odr' */
335 void do_nothing_useful(Odr_int value)
338 Odr_int *valp, *resvalp;
342 /* allocate streams */
343 if (!(encode = odr_createmem(ODR_ENCODE)))
345 if (!(decode = odr_createmem(ODR_DECODE)))
349 if (odr_integer(encode, &valp, 0, 0) == 0)
351 printf("encoding went bad\n");
354 bufferp = odr_getbuf(encode, &len, 0);
355 printf("length of encoded data is %d\n", len);
357 /* now let's decode the thing again */
358 odr_setbuf(decode, bufferp, len, 0);
359 if (odr_integer(decode, &resvalp, 0, 0) == 0)
361 printf("decoding went bad\n");
364 /* ODR_INT_PRINTF format for printf (such as %d) */
365 printf("the value is " ODR_INT_PRINTF "\n", *resvalp);
372 int main(int argc, char **argv)
374 YAZ_CHECK_INIT(argc, argv);
382 * c-file-style: "Stroustrup"
383 * indent-tabs-mode: nil
385 * vim: shiftwidth=4 tabstop=8 expandtab