Add casts for signed/unsigned ints
[yaz-moved-to-github.git] / test / tstodr.c
index f2b8b3a..83d2d2c 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2009 Index Data
+ * Copyright (C) 1995-2010 Index Data
  * See the file LICENSE for details.
  */
 #include <stdlib.h>
@@ -105,13 +105,13 @@ void tst_MySequence3(ODR encode, ODR decode)
     Yc_MySequence *t;
 
     srand(123);
-    for (i = 0; i<1000; i++)
+    for (i = 0; i < 1000; i++)
     {
         int j;
-        for (j = 0; j<sizeof(buf); j++)
+        for (j = 0; j < (int) sizeof(buf); j++)
             buf[j] = rand();
 
-        for (j = 1; j<sizeof(buf); j++)
+        for (j = 1; j < (int) sizeof(buf); j++)
         {
             odr_setbuf(decode, buf, j, 0);
             yc_MySequence(decode, &t, 0, 0);
@@ -120,6 +120,197 @@ void tst_MySequence3(ODR encode, ODR decode)
     }
 }
 
+static void tst_berint32(ODR encode, ODR decode)
+{
+    char *buf = 0;
+    int len = 0;
+    Odr_int val;
+    Odr_int ret_val;
+    int r;
+    
+    val = 0;
+    odr_reset(encode);
+    r = ber_integer(encode, &val);
+    YAZ_CHECK_EQ(r, 1);
+    buf = odr_getbuf(encode, &len, 0);
+    YAZ_CHECK(buf);
+    YAZ_CHECK_EQ(len, 2);
+    YAZ_CHECK_EQ(buf[0], 1);
+    YAZ_CHECK_EQ(buf[1], 0);
+
+    odr_reset(decode);
+    odr_setbuf(decode, buf, len, 0);
+    ber_integer(decode, &ret_val);
+    YAZ_CHECK_EQ(ret_val, 0);
+
+    val = 1;
+    odr_reset(encode);
+    r = ber_integer(encode, &val);
+    YAZ_CHECK_EQ(r, 1);
+    buf = odr_getbuf(encode, &len, 0);
+    YAZ_CHECK(buf);
+    YAZ_CHECK_EQ(len, 2);
+    YAZ_CHECK_EQ(buf[0], 1);
+    YAZ_CHECK_EQ(buf[1], 1);
+
+    odr_reset(decode);
+    odr_setbuf(decode, buf, len, 0);
+    ber_integer(decode, &ret_val);
+    YAZ_CHECK_EQ(ret_val, 1);
+
+    val = -1;
+    odr_reset(encode);
+    r = ber_integer(encode, &val);
+    YAZ_CHECK_EQ(r, 1);
+    buf = odr_getbuf(encode, &len, 0);
+    YAZ_CHECK(buf);
+    YAZ_CHECK_EQ(len, 2);
+    YAZ_CHECK_EQ(buf[0], 1);
+    YAZ_CHECK_EQ(buf[1], -1);
+
+    odr_reset(decode);
+    odr_setbuf(decode, buf, len, 0);
+    ber_integer(decode, &ret_val);
+    YAZ_CHECK_EQ(ret_val, -1);
+
+    val = 127;
+    odr_reset(encode);
+    r = ber_integer(encode, &val);
+    YAZ_CHECK_EQ(r, 1);
+    buf = odr_getbuf(encode, &len, 0);
+    YAZ_CHECK(buf);
+    YAZ_CHECK_EQ(len, 2);
+    YAZ_CHECK_EQ(buf[0], 1);
+    YAZ_CHECK_EQ(buf[1], 127);
+
+    odr_reset(decode);
+    odr_setbuf(decode, buf, len, 0);
+    ber_integer(decode, &ret_val);
+    YAZ_CHECK_EQ(ret_val, 127);
+
+
+    val = 128;
+    odr_reset(encode);
+    r = ber_integer(encode, &val);
+    YAZ_CHECK_EQ(r, 1);
+    buf = odr_getbuf(encode, &len, 0);
+    YAZ_CHECK(buf);
+    YAZ_CHECK_EQ(len, 3);
+    YAZ_CHECK_EQ(buf[0], 2);
+    YAZ_CHECK_EQ(buf[1], 0);
+    YAZ_CHECK_EQ(((unsigned char *) buf)[2], 128);
+
+    odr_reset(decode);
+    odr_setbuf(decode, buf, len, 0);
+    ber_integer(decode, &ret_val);
+    YAZ_CHECK_EQ(ret_val, 128);
+
+    val = 2147483647; /* 2^31-1 */
+    odr_reset(encode);
+    r = ber_integer(encode, &val);
+    YAZ_CHECK_EQ(r, 1);
+    buf = odr_getbuf(encode, &len, 0);
+    YAZ_CHECK(buf);
+    YAZ_CHECK_EQ(len, 5);
+    YAZ_CHECK_EQ(buf[0], 4);
+    YAZ_CHECK_EQ(buf[1], 127);
+    YAZ_CHECK_EQ(buf[2], -1);
+    YAZ_CHECK_EQ(buf[3], -1);
+    YAZ_CHECK_EQ(buf[4], -1);
+
+    odr_reset(decode);
+    odr_setbuf(decode, buf, len, 0);
+    ber_integer(decode, &ret_val);
+    YAZ_CHECK_EQ(ret_val, 2147483647);
+
+    val = -2147483647L -1; /* -2^31 */
+    odr_reset(encode);
+    r = ber_integer(encode, &val);
+    YAZ_CHECK_EQ(r, 1);
+    buf = odr_getbuf(encode, &len, 0);
+    YAZ_CHECK(buf);
+    YAZ_CHECK_EQ(len, 5);
+    YAZ_CHECK_EQ(buf[0], 4);
+    YAZ_CHECK_EQ(buf[1], -128);
+    YAZ_CHECK_EQ(buf[2], 0);
+    YAZ_CHECK_EQ(buf[3], 0);
+    YAZ_CHECK_EQ(buf[4], 0);
+
+    odr_reset(decode);
+    odr_setbuf(decode, buf, len, 0);
+    ber_integer(decode, &ret_val);
+    YAZ_CHECK_EQ(ret_val, (Odr_int) -2147483647L -1);
+}
+
+static void tst_berint64(ODR encode, ODR decode)
+{
+#if NMEM_64
+    char *buf = 0;
+    int len = 0;
+    Odr_int val;
+    Odr_int ret_val;
+    int r;
+    
+    val = (Odr_int) 2 * 2147483648UL; /* 2^32 */
+    odr_reset(encode);
+    r = ber_integer(encode, &val);
+    YAZ_CHECK_EQ(r, 1);
+    buf = odr_getbuf(encode, &len, 0);
+    YAZ_CHECK(buf);
+    YAZ_CHECK_EQ(len, 6);
+    YAZ_CHECK_EQ(buf[0], 5);
+    YAZ_CHECK_EQ(buf[1], 1);
+    YAZ_CHECK_EQ(buf[2], 0);
+    YAZ_CHECK_EQ(buf[3], 0);
+    YAZ_CHECK_EQ(buf[4], 0);
+    YAZ_CHECK_EQ(buf[5], 0);
+
+    odr_reset(decode);
+    odr_setbuf(decode, buf, len, 0);
+    ber_integer(decode, &ret_val);
+    YAZ_CHECK_EQ(ret_val, val);
+
+    val = (Odr_int) -2 * 2147483648UL; /* -2^32 */
+    odr_reset(encode);
+    r = ber_integer(encode, &val);
+    YAZ_CHECK_EQ(r, 1);
+    buf = odr_getbuf(encode, &len, 0);
+    YAZ_CHECK(buf);
+    YAZ_CHECK_EQ(len, 6);
+    YAZ_CHECK_EQ(buf[0], 5);
+    YAZ_CHECK_EQ(buf[1], -1);
+    YAZ_CHECK_EQ(buf[2], 0);
+    YAZ_CHECK_EQ(buf[3], 0);
+    YAZ_CHECK_EQ(buf[4], 0);
+    YAZ_CHECK_EQ(buf[5], 0);
+
+    odr_reset(decode);
+    odr_setbuf(decode, buf, len, 0);
+    ber_integer(decode, &ret_val);
+    YAZ_CHECK_EQ(ret_val, val);
+
+    val = (Odr_int) 1000 * 1000000000L; /* 10^12 */
+    odr_reset(encode);
+    r = ber_integer(encode, &val);
+    YAZ_CHECK_EQ(r, 1);
+    buf = odr_getbuf(encode, &len, 0);
+    YAZ_CHECK(buf);
+    YAZ_CHECK_EQ(len, 7);
+    YAZ_CHECK_EQ(buf[0], 6);
+    YAZ_CHECK_EQ(buf[1], 0);
+    YAZ_CHECK_EQ(buf[2], -24);
+    YAZ_CHECK_EQ(buf[3], -44);
+    YAZ_CHECK_EQ(buf[4], -91);
+    YAZ_CHECK_EQ(buf[5], 16);
+    YAZ_CHECK_EQ(buf[6], 0);
+
+    odr_reset(decode);
+    odr_setbuf(decode, buf, len, 0);
+    ber_integer(decode, &ret_val);
+    YAZ_CHECK_EQ(ret_val, val);
+#endif
+}
+
 static void tst(void)
 {
     ODR odr_encode = odr_createmem(ODR_ENCODE);
@@ -132,12 +323,15 @@ static void tst(void)
     tst_MySequence2(odr_encode, odr_decode);
     tst_MySequence3(odr_encode, odr_decode);
 
+    tst_berint32(odr_encode, odr_decode);
+    tst_berint64(odr_encode, odr_decode);
+
     odr_destroy(odr_encode);
     odr_destroy(odr_decode);
 }
 
 /* example from documentation.. 'Using Odr' */
-void do_nothing_useful(int value)
+void do_nothing_useful(Odr_int value)
 {
     ODR encode, decode;
     Odr_int *valp, *resvalp;