X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fodr_bit.c;h=6600e43163bb44c80206bc2f48f526f759a9070c;hp=20362bd79f6df58a224ae67b964cc031c3783ff9;hb=7fc72f3ae149e416a297ef1f55c09271056e98f1;hpb=4c176312acdc3444c9afc820f76a393e64668e52 diff --git a/src/odr_bit.c b/src/odr_bit.c index 20362bd..6600e43 100644 --- a/src/odr_bit.c +++ b/src/odr_bit.c @@ -1,8 +1,6 @@ -/* - * Copyright (C) 1995-2005, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) Index Data * See the file LICENSE for details. - * - * $Id: odr_bit.c,v 1.4 2005-01-15 19:47:14 adam Exp $ */ /** @@ -26,30 +24,43 @@ int odr_bitstring(ODR o, Odr_bitmask **p, int opt, const char *name) int res, cons = 0; if (o->error) - return 0; - if (o->t_class < 0) + return 0; + if (o->op->t_class < 0) { - o->t_class = ODR_UNIVERSAL; - o->t_tag = ODR_BITSTRING; + o->op->t_class = ODR_UNIVERSAL; + o->op->t_tag = ODR_BITSTRING; } - if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt, name)) < 0) - return 0; + res = ber_tag(o, p, o->op->t_class, o->op->t_tag, &cons, opt, name); + if (res < 0) + return 0; if (!res) - return odr_missing(o, opt, name); + return odr_missing(o, opt, name); if (o->direction == ODR_PRINT) { - odr_prname(o, name); - odr_printf(o, "BITSTRING(len=%d)\n",(*p)->top + 1); - return 1; + int i = ODR_BITMASK_SIZE; + int j; + odr_prname(o, name); + odr_printf(o, "BITSTRING(len=%d) ",(*p)->top + 1); + while (--i > 0) + if (ODR_MASK_GET(*p, i)) + break; + for (j = 0; j <= i; j++) + { + odr_printf(o, "%c", ODR_MASK_GET(*p, j) ? '1' : '0'); + if (j && ((j+1)&7) == 0) + odr_printf(o, "-"); + } + odr_printf(o, "\n"); + return 1; } if (o->direction == ODR_DECODE) { - *p = (Odr_bitmask *)odr_malloc(o, sizeof(Odr_bitmask)); - memset((*p)->bits, 0, ODR_BITMASK_SIZE); - (*p)->top = -1; + *p = (Odr_bitmask *)odr_malloc(o, sizeof(Odr_bitmask)); + memset((*p)->bits, 0, ODR_BITMASK_SIZE); + (*p)->top = -1; } #if 0 - /* ignoring the cons helps with at least one target. + /* ignoring the cons helps with at least one target. * http://bugzilla.indexdata.dk/cgi-bin/bugzilla/show_bug.cgi?id=24 */ return ber_bitstring(o, *p, 0); @@ -57,3 +68,12 @@ int odr_bitstring(ODR o, Odr_bitmask **p, int opt, const char *name) return ber_bitstring(o, *p, cons); #endif } +/* + * Local variables: + * c-basic-offset: 4 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +