X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fber_tag.c;h=f7c06863b0a9b8d2a3bbe93f93448a54d677cda9;hp=19c412f703d53a89cc90fe4d92590fcb86a9758f;hb=471c6dccdbb5c5a9c08b24c9abd6a1dcda29e79e;hpb=c6e47cbbff56f39f6d81b079ebaeac41d793d4d9 diff --git a/src/ber_tag.c b/src/ber_tag.c index 19c412f..f7c0686 100644 --- a/src/ber_tag.c +++ b/src/ber_tag.c @@ -1,9 +1,16 @@ /* - * Copyright (c) 1995-2003, Index Data + * Copyright (C) 1995-2005, Index Data ApS * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss * - * $Id: ber_tag.c,v 1.1 2003-10-27 12:21:30 adam Exp $ + * $Id: ber_tag.c,v 1.6 2005-08-11 14:21:55 adam Exp $ + */ + +/** + * \file ber_tag.c + * \brief Implements BER tags encoding and decoding + * + * This source file implements BER encoding and decoding of + * the tags. */ #if HAVE_CONFIG_H #include @@ -12,15 +19,19 @@ #include #include "odr-priv.h" -/* ber_tag +/** + * \brief Encode/decode BER tags + * * On encoding: - * if p: write tag. return 1 (success) or -1 (error). - * if !p: return 0. + * \verbatim + * if p: write tag. return 1 (success) or -1 (error). + * if !p: return 0. + * \endverbatim * On decoding: + * \verbatim * if tag && zclass match up, advance pointer and return 1. set cons. * else leave pointer unchanged. Return 0. - * - * Should perhaps be odr_tag? + * \endverbatim */ int ber_tag(ODR o, void *p, int zclass, int tag, int *constructed, int opt, const char *name) @@ -30,13 +41,13 @@ int ber_tag(ODR o, void *p, int zclass, int tag, int *constructed, int opt, char **pp = (char **)p; if (o->direction == ODR_DECODE) - *pp = 0; + *pp = 0; o->t_class = -1; - if (o->op->stackp < 0) + if (ODR_STACK_EMPTY(o)) { - odr_seek(o, ODR_S_SET, 0); + odr_seek(o, ODR_S_SET, 0); o->top = 0; - o->bp = o->buf; + o->bp = o->buf; odr_ber_tag->lclass = -1; } switch (o->direction) @@ -53,14 +64,9 @@ int ber_tag(ODR o, void *p, int zclass, int tag, int *constructed, int opt, } if ((rd = ber_enctag(o, zclass, tag, *constructed)) < 0) return -1; -#ifdef ODR_DEBUG - fprintf(stderr, "\n[class=%d,tag=%d,cons=%d,stackp=%d]", zclass, tag, - *constructed, o->stackp); -#endif return 1; - case ODR_DECODE: - if (o->op->stackp > -1 && !odr_constructed_more(o)) + if (ODR_STACK_NOT_EMPTY(o) && !odr_constructed_more(o)) { if (!opt) { @@ -80,12 +86,6 @@ int ber_tag(ODR o, void *p, int zclass, int tag, int *constructed, int opt, odr_setelement(o, name); return 0; } -#ifdef ODR_DEBUG - fprintf(stderr, - "\n[class=%d,tag=%d,cons=%d,stackp=%d]", - odr_ber_tag->lclass, odr_ber_tag->ltag, - odr_ber_tag->lcons, o->stackp); -#endif } if (zclass == odr_ber_tag->lclass && tag == odr_ber_tag->ltag) { @@ -117,9 +117,10 @@ int ber_tag(ODR o, void *p, int zclass, int tag, int *constructed, int opt, } } -/* ber_enctag - * BER-encode a zclass/tag/constructed package (identifier octets). Return - * number of bytes encoded, or -1 if out of bounds. +/** + * \brief BER-encode a zclass/tag/constructed package (identifier octets). + * + * Return number of bytes encoded, or -1 if out of bounds. */ int ber_enctag(ODR o, int zclass, int tag, int constructed) { @@ -130,36 +131,38 @@ int ber_enctag(ODR o, int zclass, int tag, int constructed) b |= (cons << 5) & 0X20; if (tag <= 30) { - b |= tag & 0X1F; - if (odr_putc(o, b) < 0) - return -1; - return 1; + b |= tag & 0X1F; + if (odr_putc(o, b) < 0) + return -1; + return 1; } else { - b |= 0X1F; - if (odr_putc(o, b) < 0) - return -1; - do - { - octs[n++] = tag & 0X7F; - tag >>= 7; - } - while (tag); - while (n--) - { - unsigned char oo; + b |= 0X1F; + if (odr_putc(o, b) < 0) + return -1; + do + { + octs[n++] = tag & 0X7F; + tag >>= 7; + } + while (tag); + while (n--) + { + unsigned char oo; - oo = octs[n] | ((n > 0) << 7); - if (odr_putc(o, oo) < 0) - return -1; - } - return 0; + oo = octs[n] | ((n > 0) << 7); + if (odr_putc(o, oo) < 0) + return -1; + } + return 0; } } -/* ber_dectag - * Decode BER identifier octets. Return number of bytes read or -1 for error. +/** + * \brief Decodes BER identifier octets. + * + * Returns number of bytes read or -1 for error. */ int ber_dectag(const unsigned char *b, int *zclass, int *tag, int *constructed, int max) @@ -172,15 +175,23 @@ int ber_dectag(const unsigned char *b, int *zclass, int *tag, *zclass = *b >> 6; *constructed = (*b >> 5) & 0X01; if ((*tag = *b & 0x1F) <= 30) - return 1; + return 1; *tag = 0; do { if (l >= max) return -1; - *tag <<= 7; - *tag |= b[l] & 0X7F; + *tag <<= 7; + *tag |= b[l] & 0X7F; } while (b[l++] & 0X80); return l; } +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +