-/*
- * Copyright (C) 1995-2005, Index Data ApS
+/* This file is part of the YAZ toolkit.
+ * Copyright (C) 1995-2013 Index Data
* See the file LICENSE for details.
- *
- * $Id: odr.c,v 1.13 2005-08-11 14:21:55 adam Exp $
- *
*/
/**
#include <yaz/xmalloc.h>
#include <yaz/log.h>
+#include <yaz/snprintf.h>
#include "odr-priv.h"
-static int log_level=0;
-static int log_level_initialized=0;
+static int log_level = 0;
+static int log_level_initialized = 0;
Odr_null *ODR_NULLVAL = (Odr_null *) "NULL"; /* the presence of a null value */
-Odr_null *odr_nullval (void)
+Odr_null *odr_nullval(void)
{
return ODR_NULLVAL;
}
fprintf(stderr, "%s: %s (code %d:%d)", message, odr_errlist[err], err, x);
if (e && *e)
fprintf(stderr, " element %s", e);
-
+
fprintf(stderr, "\n");
if (element_path)
{
fputs("\n", (FILE*) handle);
}
#endif
- for (i = 0; i<len; i++)
+ for (i = 0; i < len; i++)
{
unsigned c = ((const unsigned char *) buf)[i];
- if (i == 2000 && len > 3100)
+ if (i == 20000 && len > 31000)
{
fputs(" ..... ", (FILE*) handle);
i = len - 1000;
odr_set_stream(o, file, odr_FILE_write, odr_FILE_close);
}
+
void odr_set_stream(ODR o, void *handle,
- void (*stream_write)(ODR o,
+ void (*stream_write)(ODR o,
void *handle, int type,
const char *buf, int len),
void (*stream_close)(void *handle))
{
- o->print = (FILE*) handle;
+ o->op->print = (FILE*) handle;
o->op->stream_write = stream_write;
o->op->stream_close = stream_close;
}
o->op->iconv_handle = 0;
if (to && from)
{
- o->op->iconv_handle = yaz_iconv_open (to, from);
+ o->op->iconv_handle = yaz_iconv_open(to, from);
if (o->op->iconv_handle == 0)
return -1;
}
ODR o;
if (!log_level_initialized)
{
- log_level=yaz_log_module_level("odr");
- log_level_initialized=1;
+ log_level = yaz_log_module_level("odr");
+ log_level_initialized = 1;
}
- if (!(o = (ODR)xmalloc(sizeof(*o))))
+ if (!(o = (ODR) xmalloc(sizeof(*o))))
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->can_grow = 1;
+ o->op->buf = 0;
+ o->op->size = o->op->pos = o->op->top = 0;
+ o->op->can_grow = 1;
o->mem = nmem_create();
- o->enable_bias = 1;
- o->op = (struct Odr_private *) xmalloc (sizeof(*o->op));
+ o->op->enable_bias = 1;
o->op->odr_ber_tag.lclass = -1;
o->op->iconv_handle = 0;
odr_setprint(o, stderr);
odr_reset(o);
- yaz_log (log_level, "odr_createmem dir=%d o=%p", direction, o);
+ yaz_log(log_level, "odr_createmem dir=%d o=%p", direction, o);
return o;
}
{
if (!log_level_initialized)
{
- log_level=yaz_log_module_level("odr");
- log_level_initialized=1;
+ log_level = yaz_log_module_level("odr");
+ log_level_initialized = 1;
}
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->t_class = -1;
- o->t_tag = -1;
- o->indent = 0;
+ o->op->top = 0;
+ o->op->t_class = -1;
+ o->op->t_tag = -1;
+ o->op->indent = 0;
o->op->stack_first = 0;
o->op->stack_top = 0;
o->op->tmp_names_sz = 0;
o->op->tmp_names_buf = 0;
nmem_reset(o->mem);
- o->choice_bias = -1;
- o->lenlen = 1;
+ o->op->choice_bias = -1;
+ o->op->lenlen = 1;
if (o->op->iconv_handle != 0)
yaz_iconv(o->op->iconv_handle, 0, 0, 0, 0);
- yaz_log (log_level, "odr_reset o=%p", o);
+ yaz_log(log_level, "odr_reset o=%p", o);
}
-
+
void odr_destroy(ODR o)
{
nmem_destroy(o->mem);
- if (o->buf && o->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->print);
+ o->op->stream_close(o->op->print);
if (o->op->iconv_handle != 0)
- yaz_iconv_close (o->op->iconv_handle);
+ yaz_iconv_close(o->op->iconv_handle);
xfree(o->op);
xfree(o);
- yaz_log (log_level, "odr_destroy o=%p", o);
+ yaz_log(log_level, "odr_destroy o=%p", o);
}
void odr_setbuf(ODR o, char *buf, int len, int can_grow)
{
odr_seterror(o, ONONE, 0);
- o->bp = (unsigned char *) buf;
-
- o->buf = (unsigned char *) buf;
- o->can_grow = can_grow;
- o->top = o->pos = 0;
- o->size = len;
+ o->op->bp = buf;
+ o->op->buf = buf;
+ o->op->can_grow = can_grow;
+ 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, ...)
char buf[4096];
va_start(ap, fmt);
-#ifdef WIN32
- _vsnprintf(buf, sizeof(buf)-1, fmt, ap);
-#else
-#if HAVE_VSNPRINTF
- vsnprintf(buf, sizeof(buf), fmt, ap);
-#else
- vsprintf(buf, fmt, ap);
-#endif
-#endif
- o->op->stream_write(o, o->print, ODR_VISIBLESTRING, buf, strlen(buf));
+ yaz_vsnprintf(buf, sizeof(buf), fmt, ap);
+ o->op->stream_write(o, o->op->print, ODR_VISIBLESTRING, buf, strlen(buf));
va_end(ap);
}
/*
* Local variables:
* c-basic-offset: 4
+ * c-file-style: "Stroustrup"
* indent-tabs-mode: nil
* End:
* vim: shiftwidth=4 tabstop=8 expandtab