X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=odr%2Fber_len.c;h=e772e73d7eabb2c0d0468898405ab748b4f9243d;hb=21ea17f766bb492a93154ec7b242653fa37dec91;hp=44b0f6a06bf987c4809acb5982fad9f57ca6dd3d;hpb=a7d28a25277a208edb9c44d124f179cc2be6db70;p=yaz-moved-to-github.git diff --git a/odr/ber_len.c b/odr/ber_len.c index 44b0f6a..e772e73 100644 --- a/odr/ber_len.c +++ b/odr/ber_len.c @@ -1,3 +1,24 @@ +/* + * Copyright (C) 1995-1999, Index Data. + * See the file LICENSE for details. + * Sebastian Hammer, Adam Dickmeiss + * + * $Log: ber_len.c,v $ + * Revision 1.7 1999-01-08 11:23:23 adam + * Added const modifier to some of the BER/ODR encoding routines. + * + * Revision 1.6 1995/09/29 17:12:17 quinn + * Smallish + * + * Revision 1.5 1995/09/27 15:02:55 quinn + * Modified function heads & prototypes. + * + * Revision 1.4 1995/05/16 08:50:45 quinn + * License, documentation, and memory fixes + * + * + */ + #include #include @@ -9,27 +30,34 @@ * Returns: =0 success, indefinite start-marker set. 1 byte encoded. * Returns: -1 failure, out of bounds. */ -int ber_enclen(unsigned char *buf, int len, int lenlen, int exact) +int ber_enclen(ODR o, int len, int lenlen, int exact) { - unsigned char *b = buf; unsigned char octs[sizeof(int)]; int n = 0; + int lenpos, end; +#ifdef ODR_DEBUG fprintf(stderr, "[len=%d]", len); +#endif if (len < 0) /* Indefinite */ { - *b = 0X80; + if (odr_putc(o, 0x80) < 0) + return 0; +#ifdef ODR_DEBUG fprintf(stderr, "[indefinite]"); +#endif return 0; } if (len <= 127 && (lenlen == 1 || !exact)) /* definite short form */ { - *b = len; + if (odr_putc(o, (unsigned char) len) < 0) + return 0; return 1; } if (lenlen == 1) { - *b = 0X80; + if (odr_putc(o, 0x80) < 0) + return 0; return 0; } /* definite long form */ @@ -41,14 +69,23 @@ int ber_enclen(unsigned char *buf, int len, int lenlen, int exact) while (len); if (n >= lenlen) return -1; - b++; + lenpos = odr_tell(o); /* remember length-of-length position */ + if (odr_putc(o, 0) < 0) /* dummy */ + return 0; if (exact) while (n < --lenlen) /* pad length octets */ - *(++b) = 0; + if (odr_putc(o, 0) < 0) + return 0; while (n--) - *(b++) = octs[n]; - *buf = (b - buf - 1) | 0X80; - return b - buf; + if (odr_putc(o, octs[n]) < 0) + return 0; + /* set length of length */ + end = odr_tell(o); + odr_seek(o, ODR_S_SET, lenpos); + if (odr_putc(o, (end - lenpos - 1) | 0X80) < 0) + return 0; + odr_seek(o, ODR_S_END, 0); + return odr_tell(o) - lenpos; } /* @@ -57,21 +94,25 @@ int ber_enclen(unsigned char *buf, int len, int lenlen, int exact) * len = -1 indefinite. * len >= 0 Length. */ -int ber_declen(unsigned char *buf, int *len) +int ber_declen(const unsigned char *buf, int *len) { - unsigned char *b = buf; + const unsigned char *b = buf; int n; if (*b == 0X80) /* Indefinite */ { *len = -1; +#ifdef ODR_DEBUG fprintf(stderr, "[len=%d]", *len); +#endif return 1; } if (!(*b & 0X80)) /* Definite short form */ { *len = (int) *b; +#ifdef ODR_DEBUG fprintf(stderr, "[len=%d]", *len); +#endif return 1; } if (*b == 0XFF) /* reserved value */ @@ -85,6 +126,8 @@ int ber_declen(unsigned char *buf, int *len) *len <<= 8; *len |= *(b++); } +#ifdef ODR_DEBUG fprintf(stderr, "[len=%d]", *len); +#endif return (b - buf); }