X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fber_tag.c;h=0443857f2b61bb929afd722c8f5e08737be7a389;hp=9e4d31e3bf6dd3bd768abff4f4e9940ee47e1cc6;hb=d1b8a1c1647ebb00401f6b6e8f992cca7480b5f9;hpb=05c274ef315384faafcc5900c17468f0ea2474e6 diff --git a/src/ber_tag.c b/src/ber_tag.c index 9e4d31e..0443857 100644 --- a/src/ber_tag.c +++ b/src/ber_tag.c @@ -1,11 +1,9 @@ -/* - * Copyright (c) 1995-2004, Index Data +/* This file is part of the YAZ toolkit. + * Copyright (C) Index Data * See the file LICENSE for details. - * - * $Id: ber_tag.c,v 1.3 2004-10-15 00:18:59 adam Exp $ */ -/** +/** * \file ber_tag.c * \brief Implements BER tags encoding and decoding * @@ -19,15 +17,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) @@ -37,13 +39,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; - o->t_class = -1; - if (o->op->stackp < 0) + *pp = 0; + o->op->t_class = -1; + if (ODR_STACK_EMPTY(o)) { - odr_seek(o, ODR_S_SET, 0); - o->top = 0; - o->bp = o->buf; + odr_seek(o, ODR_S_SET, 0); + o->op->top = 0; + o->op->bp = o->op->buf; odr_ber_tag->lclass = -1; } switch (o->direction) @@ -60,14 +62,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->op->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) { @@ -79,7 +76,7 @@ int ber_tag(ODR o, void *p, int zclass, int tag, int *constructed, int opt, if (odr_ber_tag->lclass < 0) { if ((odr_ber_tag->br = - ber_dectag(o->bp, &odr_ber_tag->lclass, + ber_dectag(o->op->bp, &odr_ber_tag->lclass, &odr_ber_tag->ltag, &odr_ber_tag->lcons, odr_max(o))) <= 0) { @@ -87,16 +84,10 @@ 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->op->stackp); -#endif } if (zclass == odr_ber_tag->lclass && tag == odr_ber_tag->ltag) { - o->bp += odr_ber_tag->br; + o->op->bp += odr_ber_tag->br; *constructed = odr_ber_tag->lcons; odr_ber_tag->lclass = -1; return 1; @@ -124,9 +115,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) { @@ -137,40 +129,43 @@ 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 ber_dectag(const char *cp, int *zclass, int *tag, int *constructed, int max) { + const unsigned char *b = (const unsigned char *) cp; int l = 1; if (l > max) @@ -179,15 +174,24 @@ 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 + * c-file-style: "Stroustrup" + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */ +