/*
- * Copyright (C) 1995-2005, Index Data ApS
+ * Copyright (C) 1995-2007, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: odr.c,v 1.11 2005-01-15 19:47:14 adam Exp $
+ * $Id: odr.c,v 1.14 2007-01-03 08:42:15 adam Exp $
*
*/
#include <config.h>
#endif
+#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void odr_perror(ODR o, const char *message)
{
const char *e = odr_getelement(o);
+ const char **element_path = odr_get_element_path(o);
int err, x;
err = odr_geterrorx(o, &x);
fprintf(stderr, "%s: %s (code %d:%d)", message, odr_errlist[err], err, x);
if (e && *e)
- fprintf (stderr, " element %s", e);
+ fprintf(stderr, " element %s", e);
+
fprintf(stderr, "\n");
+ if (element_path)
+ {
+ fprintf(stderr, "Element path:");
+ while (*element_path)
+ fprintf(stderr, " %s", *element_path++);
+ fprintf(stderr, "\n");
+ }
}
int odr_geterror(ODR o)
const char **odr_get_element_path(ODR o)
{
- return o->op->stack_names;
+ int cur_sz = 0;
+ struct odr_constack *st;
+
+ for (st = o->op->stack_top; st; st = st->prev)
+ cur_sz++;
+ if (o->op->tmp_names_sz < cur_sz + 1)
+ {
+ o->op->tmp_names_sz = 2 * cur_sz + 5;
+ o->op->tmp_names_buf = (const char **)
+ odr_malloc(o, o->op->tmp_names_sz * sizeof(char*));
+ }
+ o->op->tmp_names_buf[cur_sz] = 0;
+ for (st = o->op->stack_top; st; st = st->prev)
+ {
+ cur_sz--;
+ o->op->tmp_names_buf[cur_sz] = st->name;
+ }
+ assert(cur_sz == 0);
+ return o->op->tmp_names_buf;
}
void odr_seterror(ODR o, int error, int id)
}
void odr_FILE_write(ODR o, void *handle, int type,
- const char *buf, int len)
+ 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);
+ 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];
- if (i == 2000 && len > 3100)
- {
- fputs(" ..... ", (FILE*) handle);
- i = len - 1000;
- }
- if (strchr("\r\n\f\t", c) || (c >= ' ' && c <= 126))
- putc(c, (FILE*) handle);
- else
- {
- char x[5];
- sprintf(x, "\\X%02X", c);
- fputs(x, (FILE*) handle);
- }
+ unsigned c = ((const unsigned char *) buf)[i];
+ if (i == 2000 && len > 3100)
+ {
+ fputs(" ..... ", (FILE*) handle);
+ i = len - 1000;
+ }
+ if (strchr("\r\n\f\t", c) || (c >= ' ' && c <= 126))
+ putc(c, (FILE*) handle);
+ else
+ {
+ char x[5];
+ sprintf(x, "\\X%02X", c);
+ fputs(x, (FILE*) handle);
+ }
}
}
{
FILE *f = (FILE *) handle;
if (f && f != stderr && f != stdout)
- fclose(f);
+ fclose(f);
}
void odr_setprint(ODR o, FILE *file)
}
void odr_set_stream(ODR o, void *handle,
- void (*stream_write)(ODR o,
- void *handle, int type,
- const char *buf, int len),
- void (*stream_close)(void *handle))
+ 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->stream_write = stream_write;
o->t_class = -1;
o->t_tag = -1;
o->indent = 0;
- o->op->stackp = -1;
+ 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;
if (o->buf && o->can_grow)
xfree(o->buf);
if (o->op->stream_close)
- o->op->stream_close(o->print);
+ o->op->stream_close(o->print);
if (o->op->iconv_handle != 0)
yaz_iconv_close (o->op->iconv_handle);
xfree(o->op);
o->op->stream_write(o, o->print, ODR_VISIBLESTRING, buf, strlen(buf));
va_end(ap);
}
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+