Fix sample PQF
[yaz-moved-to-github.git] / odr / odr.c
index 7bd3fae..aaaec46 100644 (file)
--- a/odr/odr.c
+++ b/odr/odr.c
@@ -2,7 +2,7 @@
  * Copyright (c) 1995-2003, Index Data
  * See the file LICENSE for details.
  *
  * Copyright (c) 1995-2003, Index Data
  * See the file LICENSE for details.
  *
- * $Id: odr.c,v 1.41 2003-03-11 11:03:31 adam Exp $
+ * $Id: odr.c,v 1.46 2003-10-16 10:37:06 adam Exp $
  *
  */
 #if HAVE_CONFIG_H
  *
  */
 #if HAVE_CONFIG_H
@@ -36,7 +36,7 @@ char *odr_errlist[] =
     "Stack overflow",
     "Length of constructed type different from sum of members",
     "Overflow writing definite length of constructed type",
     "Stack overflow",
     "Length of constructed type different from sum of members",
     "Overflow writing definite length of constructed type",
-    "HTTP Bad Request"
+    "Bad HTTP Request"
 };
 
 char *odr_errmsg(int n)
 };
 
 char *odr_errmsg(int n)
@@ -44,9 +44,16 @@ char *odr_errmsg(int n)
     return odr_errlist[n];
 }
 
     return odr_errlist[n];
 }
 
-void odr_perror(ODR o, char *message)
+void odr_perror(ODR o, const char *message)
 {
 {
-    fprintf(stderr, "%s: %s\n", message, odr_errlist[o->error]);
+    const char *e = odr_getelement(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, "\n");
 }
 
 int odr_geterror(ODR o)
 }
 
 int odr_geterror(ODR o)
@@ -61,10 +68,25 @@ int odr_geterrorx(ODR o, int *x)
     return o->error;
 }
 
     return o->error;
 }
 
+char *odr_getelement(ODR o)
+{
+    return o->op->element;
+}
+
 void odr_seterror(ODR o, int error, int id)
 {
     o->error = error;
     o->op->error_id = id;
 void odr_seterror(ODR o, int error, int id)
 {
     o->error = error;
     o->op->error_id = id;
+    o->op->element[0] = '\0';
+}
+
+void odr_setelement(ODR o, const char *element)
+{
+    if (element)
+    {
+        strncpy(o->op->element, element, sizeof(o->op->element)-1);
+        o->op->element[sizeof(o->op->element)-1] = '\0';
+    }
 }
 
 void odr_setprint(ODR o, FILE *file)
 }
 
 void odr_setprint(ODR o, FILE *file)
@@ -76,10 +98,13 @@ int odr_set_charset(ODR o, const char *to, const char *from)
 {
     if (o->op->iconv_handle)
         yaz_iconv_close (o->op->iconv_handle);
 {
     if (o->op->iconv_handle)
         yaz_iconv_close (o->op->iconv_handle);
-
-    o->op->iconv_handle = yaz_iconv_open (to, from);
-    if (o->op->iconv_handle == 0)
-        return -1;
+    o->op->iconv_handle = 0;
+    if (to && from)
+    {
+        o->op->iconv_handle = yaz_iconv_open (to, from);
+        if (o->op->iconv_handle == 0)
+            return -1;
+    }
     return 0;
 }
 
     return 0;
 }