X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fodr.c;h=9cbac0d0b501aed6e2b3a2224825ea9be6f635d5;hp=e424b20e17a00fa09d0d766506bc871f2ecccb94;hb=ce627148dbba2878565b8d9da33f6b25f33da4bd;hpb=69b1d8e7b437179163fe97b7cbead51a56835f2a diff --git a/src/odr.c b/src/odr.c index e424b20..9cbac0d 100644 --- a/src/odr.c +++ b/src/odr.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2013 Index Data + * Copyright (C) Index Data * See the file LICENSE for details. */ @@ -135,15 +135,6 @@ void odr_FILE_write(ODR o, void *handle, int type, const char *buf, int len) { int i; -#if 0 - if (type == ODR_OCTETSTRING) - { - const char **stack_names = odr_get_element_path(o); - for (i = 0; stack_names[i]; i++) - fprintf((FILE*) handle, "[%s]", stack_names[i]); - fputs("\n", (FILE*) handle); - } -#endif for (i = 0; i < len; i++) { unsigned c = ((const unsigned char *) buf)[i]; @@ -175,6 +166,10 @@ void odr_setprint(ODR o, FILE *file) odr_set_stream(o, file, odr_FILE_write, odr_FILE_close); } +void odr_setprint_noclose(ODR o, FILE *file) +{ + odr_set_stream(o, file, odr_FILE_write, 0); +} void odr_set_stream(ODR o, void *handle, void (*stream_write)(ODR o, @@ -215,14 +210,14 @@ ODR odr_createmem(int direction) return 0; o->op = (struct Odr_private *) xmalloc(sizeof(*o->op)); o->direction = direction; - o->buf = 0; - o->size = o->pos = o->top = 0; + o->op->buf = 0; + o->op->size = o->op->pos = o->op->top = 0; o->op->can_grow = 1; o->mem = nmem_create(); o->op->enable_bias = 1; o->op->odr_ber_tag.lclass = -1; o->op->iconv_handle = 0; - odr_setprint(o, stderr); + odr_setprint_noclose(o, stderr); odr_reset(o); yaz_log(log_level, "odr_createmem dir=%d o=%p", direction, o); return o; @@ -237,9 +232,9 @@ void odr_reset(ODR o) } odr_seterror(o, ONONE, 0); - o->bp = o->buf; + o->op->bp = o->op->buf; odr_seek(o, ODR_S_SET, 0); - o->top = 0; + o->op->top = 0; o->op->t_class = -1; o->op->t_tag = -1; o->op->indent = 0; @@ -258,8 +253,8 @@ void odr_reset(ODR o) void odr_destroy(ODR o) { nmem_destroy(o->mem); - if (o->buf && o->op->can_grow) - xfree(o->buf); + if (o->op->buf && o->op->can_grow) + xfree(o->op->buf); if (o->op->stream_close) o->op->stream_close(o->op->print); if (o->op->iconv_handle != 0) @@ -272,19 +267,24 @@ void odr_destroy(ODR o) void odr_setbuf(ODR o, char *buf, int len, int can_grow) { odr_seterror(o, ONONE, 0); - o->bp = buf; - o->buf = buf; + o->op->bp = buf; + o->op->buf = buf; o->op->can_grow = can_grow; - o->top = o->pos = 0; - o->size = len; + o->op->top = o->op->pos = 0; + o->op->size = len; } char *odr_getbuf(ODR o, int *len, int *size) { - *len = o->top; + *len = o->op->top; if (size) - *size = o->size; - return (char*) o->buf; + *size = o->op->size; + return o->op->buf; +} + +int odr_offset(ODR o) +{ + return o->op->bp - o->op->buf; } void odr_printf(ODR o, const char *fmt, ...)