1 /* This file is part of the YAZ toolkit.
2 * Copyright (C) 1995-2009 Index Data
3 * See the file LICENSE for details.
7 #include <yaz/oid_util.h>
8 #include "tstodrcodec.h"
12 #define MYOID "1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19"
14 void tst_MySequence1(ODR encode, ODR decode)
19 Yc_MySequence *s = (Yc_MySequence *) odr_malloc(encode, sizeof(*s));
23 s->first = odr_intdup(encode, 12345);
24 s->second = (Odr_oct *) odr_malloc(encode, sizeof(*s->second));
25 s->second->buf = (unsigned char *) "hello";
28 s->third = odr_booldup(encode, 1);
29 s->fourth = odr_nullval();
30 s->fifth = odr_intdup(encode, YC_MySequence_enum1);
32 s->myoid = odr_getoidbystr(decode, MYOID);
34 ret = yc_MySequence(encode, &s, 0, 0);
39 ber_buf = odr_getbuf(encode, &ber_len, 0);
41 odr_setbuf(decode, ber_buf, ber_len, 0);
43 ret = yc_MySequence(decode, &t, 0, 0);
50 YAZ_CHECK(t->first && *t->first == 12345);
52 YAZ_CHECK(t->second && t->second->buf && t->second->len == 5);
54 YAZ_CHECK(t->second && t->second->buf && t->second->len == 5 &&
55 memcmp(t->second->buf, "hello", t->second->len) == 0);
57 YAZ_CHECK(t->third && *t->third == 1);
61 YAZ_CHECK(t->fifth && *t->fifth == YC_MySequence_enum1);
66 Odr_oid *myoid = odr_getoidbystr(decode, MYOID);
68 YAZ_CHECK(oid_oidcmp(myoid, t->myoid) == 0);
72 void tst_MySequence2(ODR encode, ODR decode)
75 Yc_MySequence *s = (Yc_MySequence *) odr_malloc(encode, sizeof(*s));
78 s->first = 0; /* deliberately miss this .. */
79 s->second = (Odr_oct *) odr_malloc(encode, sizeof(*s->second));
80 s->second->buf = (unsigned char *) "hello";
83 s->third = odr_booldup(encode, 1);
84 s->fourth = odr_nullval();
85 s->fifth = odr_intdup(encode, YC_MySequence_enum1);
86 s->myoid = odr_getoidbystr(encode, MYOID);
88 ret = yc_MySequence(encode, &s, 0, 0); /* should fail */
91 YAZ_CHECK(odr_geterror(encode) == OREQUIRED);
93 YAZ_CHECK(strcmp(odr_getelement(encode), "first") == 0);
96 YAZ_CHECK(odr_geterror(encode) == ONONE);
98 YAZ_CHECK(strcmp(odr_getelement(encode), "") == 0);
101 void tst_MySequence3(ODR encode, ODR decode)
108 for (i = 0; i<1000; i++)
111 for (j = 0; j<sizeof(buf); j++)
114 for (j = 1; j<sizeof(buf); j++)
116 odr_setbuf(decode, buf, j, 0);
117 yc_MySequence(decode, &t, 0, 0);
123 static void tst_berint(ODR encode, ODR decode)
133 r = ber_integer(encode, &val);
135 buf = odr_getbuf(encode, &len, 0);
137 YAZ_CHECK_EQ(len, 2);
138 YAZ_CHECK_EQ(buf[0], 1);
139 YAZ_CHECK_EQ(buf[1], 0);
142 odr_setbuf(decode, buf, len, 0);
143 ber_integer(decode, &ret_val);
144 YAZ_CHECK_EQ(ret_val, 0);
148 r = ber_integer(encode, &val);
150 buf = odr_getbuf(encode, &len, 0);
152 YAZ_CHECK_EQ(len, 2);
153 YAZ_CHECK_EQ(buf[0], 1);
154 YAZ_CHECK_EQ(buf[1], 1);
157 odr_setbuf(decode, buf, len, 0);
158 ber_integer(decode, &ret_val);
159 YAZ_CHECK_EQ(ret_val, 1);
163 r = ber_integer(encode, &val);
165 buf = odr_getbuf(encode, &len, 0);
167 YAZ_CHECK_EQ(len, 2);
168 YAZ_CHECK_EQ(buf[0], 1);
169 YAZ_CHECK_EQ(buf[1], -1);
172 odr_setbuf(decode, buf, len, 0);
173 ber_integer(decode, &ret_val);
174 YAZ_CHECK_EQ(ret_val, -1);
178 r = ber_integer(encode, &val);
180 buf = odr_getbuf(encode, &len, 0);
182 YAZ_CHECK_EQ(len, 2);
183 YAZ_CHECK_EQ(buf[0], 1);
184 YAZ_CHECK_EQ(buf[1], 127);
187 odr_setbuf(decode, buf, len, 0);
188 ber_integer(decode, &ret_val);
189 YAZ_CHECK_EQ(ret_val, 127);
194 r = ber_integer(encode, &val);
196 buf = odr_getbuf(encode, &len, 0);
198 YAZ_CHECK_EQ(len, 3);
199 YAZ_CHECK_EQ(buf[0], 2);
200 YAZ_CHECK_EQ(buf[1], 0);
201 YAZ_CHECK_EQ(((unsigned char *) buf)[2], 128);
204 odr_setbuf(decode, buf, len, 0);
205 ber_integer(decode, &ret_val);
206 YAZ_CHECK_EQ(ret_val, 128);
208 val = 2147483647; /* 2^31-1 */
210 r = ber_integer(encode, &val);
212 buf = odr_getbuf(encode, &len, 0);
214 YAZ_CHECK_EQ(len, 5);
215 YAZ_CHECK_EQ(buf[0], 4);
216 YAZ_CHECK_EQ(buf[1], 127);
217 YAZ_CHECK_EQ(buf[2], -1);
218 YAZ_CHECK_EQ(buf[3], -1);
219 YAZ_CHECK_EQ(buf[4], -1);
222 odr_setbuf(decode, buf, len, 0);
223 ber_integer(decode, &ret_val);
224 YAZ_CHECK_EQ(ret_val, 2147483647);
226 val = -2147483648L; /* -2^31 */
228 r = ber_integer(encode, &val);
230 buf = odr_getbuf(encode, &len, 0);
232 YAZ_CHECK_EQ(len, 5);
233 YAZ_CHECK_EQ(buf[0], 4);
234 YAZ_CHECK_EQ(buf[1], -128);
235 YAZ_CHECK_EQ(buf[2], 0);
236 YAZ_CHECK_EQ(buf[3], 0);
237 YAZ_CHECK_EQ(buf[4], 0);
240 odr_setbuf(decode, buf, len, 0);
241 ber_integer(decode, &ret_val);
242 YAZ_CHECK_EQ(ret_val, -2147483648L);
244 val = (Odr_int) 2 * 2147483648UL; /* 2^32 */
246 r = ber_integer(encode, &val);
248 buf = odr_getbuf(encode, &len, 0);
250 YAZ_CHECK_EQ(len, 6);
251 YAZ_CHECK_EQ(buf[0], 5);
252 YAZ_CHECK_EQ(buf[1], 1);
253 YAZ_CHECK_EQ(buf[2], 0);
254 YAZ_CHECK_EQ(buf[3], 0);
255 YAZ_CHECK_EQ(buf[4], 0);
256 YAZ_CHECK_EQ(buf[5], 0);
259 odr_setbuf(decode, buf, len, 0);
260 ber_integer(decode, &ret_val);
261 YAZ_CHECK_EQ(ret_val, val);
264 val = (Odr_int) -2 * 2147483648UL; /* -2^32 */
266 r = ber_integer(encode, &val);
268 buf = odr_getbuf(encode, &len, 0);
270 YAZ_CHECK_EQ(len, 6);
271 YAZ_CHECK_EQ(buf[0], 5);
272 YAZ_CHECK_EQ(buf[1], -1);
273 YAZ_CHECK_EQ(buf[2], 0);
274 YAZ_CHECK_EQ(buf[3], 0);
275 YAZ_CHECK_EQ(buf[4], 0);
276 YAZ_CHECK_EQ(buf[5], 0);
279 odr_setbuf(decode, buf, len, 0);
280 ber_integer(decode, &ret_val);
281 YAZ_CHECK_EQ(ret_val, val);
283 val = (Odr_int) 1000 * 1000000000L; /* 10^12 */
285 r = ber_integer(encode, &val);
287 buf = odr_getbuf(encode, &len, 0);
289 YAZ_CHECK_EQ(len, 7);
290 YAZ_CHECK_EQ(buf[0], 6);
291 YAZ_CHECK_EQ(buf[1], 0);
292 YAZ_CHECK_EQ(buf[2], -24);
293 YAZ_CHECK_EQ(buf[3], -44);
294 YAZ_CHECK_EQ(buf[4], -91);
295 YAZ_CHECK_EQ(buf[5], 16);
296 YAZ_CHECK_EQ(buf[6], 0);
299 odr_setbuf(decode, buf, len, 0);
300 ber_integer(decode, &ret_val);
301 YAZ_CHECK_EQ(ret_val, val);
304 static void tst(void)
306 ODR odr_encode = odr_createmem(ODR_ENCODE);
307 ODR odr_decode = odr_createmem(ODR_DECODE);
309 YAZ_CHECK(odr_encode);
310 YAZ_CHECK(odr_decode);
312 tst_MySequence1(odr_encode, odr_decode);
313 tst_MySequence2(odr_encode, odr_decode);
314 tst_MySequence3(odr_encode, odr_decode);
316 tst_berint(odr_encode, odr_decode);
318 odr_destroy(odr_encode);
319 odr_destroy(odr_decode);
322 /* example from documentation.. 'Using Odr' */
323 void do_nothing_useful(Odr_int value)
326 Odr_int *valp, *resvalp;
330 /* allocate streams */
331 if (!(encode = odr_createmem(ODR_ENCODE)))
333 if (!(decode = odr_createmem(ODR_DECODE)))
337 if (odr_integer(encode, &valp, 0, 0) == 0)
339 printf("encoding went bad\n");
342 bufferp = odr_getbuf(encode, &len, 0);
343 printf("length of encoded data is %d\n", len);
345 /* now let's decode the thing again */
346 odr_setbuf(decode, bufferp, len, 0);
347 if (odr_integer(decode, &resvalp, 0, 0) == 0)
349 printf("decoding went bad\n");
352 /* ODR_INT_PRINTF format for printf (such as %d) */
353 printf("the value is " ODR_INT_PRINTF "\n", *resvalp);
360 int main(int argc, char **argv)
362 YAZ_CHECK_INIT(argc, argv);
370 * c-file-style: "Stroustrup"
371 * indent-tabs-mode: nil
373 * vim: shiftwidth=4 tabstop=8 expandtab