X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=odr%2Fodr.c;h=da919a5d687e9abcf917878b1db6337620ffa15d;hb=0d82f249f832e8b0a6f2dc099304219e2ad29f72;hp=1f8a6251f2f860527afe0998028d67b40fe08789;hpb=c620a713f1418315efcd4e6fab225e036775d365;p=yaz-moved-to-github.git diff --git a/odr/odr.c b/odr/odr.c index 1f8a625..da919a5 100644 --- a/odr/odr.c +++ b/odr/odr.c @@ -2,7 +2,7 @@ * Copyright (c) 1995-2003, Index Data * See the file LICENSE for details. * - * $Id: odr.c,v 1.40 2003-02-12 15:06:43 adam Exp $ + * $Id: odr.c,v 1.45 2003-06-19 21:09:25 adam Exp $ * */ #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", - "HTTP Bad Request" + "Bad HTTP Request" }; char *odr_errmsg(int n) @@ -46,7 +46,14 @@ char *odr_errmsg(int n) void odr_perror(ODR o, 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) @@ -54,6 +61,34 @@ int odr_geterror(ODR o) return o->error; } +int odr_geterrorx(ODR o, int *x) +{ + if (x) + *x = o->op->error_id; + 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; + 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) { o->print = file; @@ -63,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); - - 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; } @@ -95,7 +133,7 @@ ODR odr_createmem(int direction) void odr_reset(ODR o) { - o->error = ONONE; + odr_seterror(o, ONONE, 0); o->bp = o->buf; odr_seek(o, ODR_S_SET, 0); o->top = 0; @@ -142,3 +180,4 @@ char *odr_getbuf(ODR o, int *len, int *size) *size = o->size; return (char*) o->buf; } +