X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=odr%2Fber_bit.c;fp=odr%2Fber_bit.c;h=ce8e21ae6be20402f41e2d6a38aa54b65053b6ad;hb=173d9f50b7a6c63dff6c74dc5c3efe985f75ef39;hp=0000000000000000000000000000000000000000;hpb=a7d28a25277a208edb9c44d124f179cc2be6db70;p=yaz-moved-to-github.git diff --git a/odr/ber_bit.c b/odr/ber_bit.c new file mode 100644 index 0000000..ce8e21a --- /dev/null +++ b/odr/ber_bit.c @@ -0,0 +1,68 @@ +/* + * Copyright (C) 1994, Index Data I/S + * All rights reserved. + * Sebastian Hammer, Adam Dickmeiss + * + * $Log: ber_bit.c,v $ + * Revision 1.1 1995-02-02 20:38:49 quinn + * Updates. + * + * + */ + +#include + +int ber_bitstring(ODR o, ODR_BITMASK *p, int cons) +{ + int res, len; + unsigned char *base; + + switch (o->direction) + { + case ODR_DECODE: + if ((res = ber_declen(o->bp, &len)) < 0) + return 0; + o->bp += res; + o->left -= res; + if (cons) /* fetch component strings */ + { + base = o->bp; + while (odp_more_chunks(o, base, len)) + if (!odr_bitstring(o, &p, 0)) + return 0; + return 1; + } + /* primitive bitstring */ + if (len < 0) + return 0; + if (len == 0) + return 1; + if (len - 1 > ODR_BITMASK_SIZE) + return 0; + o->bp++; /* silently ignore the unused-bits field */ + o->left--; + len--; + memcpy(p->bits + p->top + 1, o->bp, len); + p->top += len; + o->bp += len; + o->left -= len; + return 1; + case ODR_ENCODE: + if ((res = ber_enclen(o->bp, p->top + 2, 5, 0)) < 0) + return 0; + o->bp += res; + o->left -= res; + if (p->top + 2 > o->left) + return 0; + *(o->bp++) = 0; /* no unused bits here */ + o->left--; + if (p->top < 0) + return 1; + memcpy(o->bp, p->bits, p->top + 1); + o->bp += p->top + 1; + o->left -= p->top +1; + return 1; + case ODR_PRINT: return 1; + default: return 0; + } +}