1 /* This file is part of the YAZ toolkit.
2 * Copyright (C) 1995-2009 Index Data
3 * See the file LICENSE for details.
8 * \brief Implements BER INTEGER encoding and decoding.
10 * This source file implements BER encoding and decoding of
21 #include <sys/types.h>
30 static int ber_encinteger(ODR o, Odr_int val);
31 static int ber_decinteger(const unsigned char *buf, Odr_int *val, int max);
33 int ber_integer(ODR o, Odr_int *val)
40 if ((res = ber_decinteger(o->bp, val, odr_max(o))) <= 0)
42 odr_seterror(o, OPROTO, 50);
48 if ((res = ber_encinteger(o, *val)) < 0)
54 odr_seterror(o, OOTHER, 51); return 0;
59 * Returns: number of bytes written or -1 for error (out of bounds).
61 int ber_encinteger(ODR o, Odr_int val)
63 unsigned char tmp[sizeof(Odr_int)];
64 unsigned long long uval = val;
66 for (i = sizeof(uval); i > 0; )
71 for (i = 0; i < sizeof(Odr_int)-1; i++)
72 if (!((tmp[i] == 0 && !(tmp[i+1] & 0x80))
74 (tmp[i] == 0xFF && (tmp[i+1] & 0x80))))
76 len = sizeof(Odr_int) - i;
77 if (ber_enclen(o, len, 1, 1) != 1)
79 if (odr_write(o, (unsigned char*) tmp + i, len) < 0)
85 * Returns: Number of bytes read or 0 if no match, -1 if error.
87 int ber_decinteger(const unsigned char *buf, Odr_int *val, int max)
89 unsigned long long uval = 0;
92 const unsigned char *b = buf;
94 if ((res = ber_declen(b, &len, max)) < 0)
96 if (len+res > max || len < 0) /* out of bounds or indefinite encoding */
98 if (len > (int) sizeof(Odr_int)) /* let's be reasonable, here */
103 for (i = 0; i < sizeof(uval) - len; i++)
104 uval = (uval << 8) + 0xFF;
105 for (i = 0; i < len; i++)
106 uval = (uval << 8) + b[i];
114 * c-file-style: "Stroustrup"
115 * indent-tabs-mode: nil
117 * vim: shiftwidth=4 tabstop=8 expandtab