X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=odr%2Fber_len.c;h=ee705635386130f10fc2fe495c9b6b76d207f4b8;hp=e8bf0702ae0c968aaddee877a10edd8e86446a77;hb=aa82967af8f06004b567ad1ed40c67b056c44e7b;hpb=f2944c80ada3871faf8ec49bcad1470e6add4bac diff --git a/odr/ber_len.c b/odr/ber_len.c index e8bf070..ee70563 100644 --- a/odr/ber_len.c +++ b/odr/ber_len.c @@ -9,18 +9,19 @@ * 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 @@ -28,12 +29,14 @@ int ber_enclen(unsigned char *buf, int len, int lenlen, int exact) } 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 */ @@ -45,14 +48,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; } /*