Added snprintf/vsnprintf wrappers for systems that don't have
[yaz-moved-to-github.git] / src / odr.c
index 8d4cff8..645317e 100644 (file)
--- a/src/odr.c
+++ b/src/odr.c
@@ -1,8 +1,8 @@
 /*
- * 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.12 2005-06-25 15:46:04 adam Exp $
+ * $Id: odr.c,v 1.15 2007-02-23 10:15:01 adam Exp $
  *
  */
 
 #include <config.h>
 #endif
 
+#include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdarg.h>
 
 #include <yaz/xmalloc.h>
 #include <yaz/log.h>
+#include <yaz/snprintf.h>
 #include "odr-priv.h"
 
 static int log_level=0;
@@ -58,13 +60,22 @@ char *odr_errmsg(int n)
 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)
@@ -86,7 +97,25 @@ const char *odr_getelement(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)
@@ -216,7 +245,10 @@ void odr_reset(ODR o)
     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;
@@ -264,15 +296,7 @@ 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
+    yaz_vsnprintf(buf, sizeof(buf), fmt, ap);
     o->op->stream_write(o, o->print, ODR_VISIBLESTRING, buf, strlen(buf));
     va_end(ap);
 }