2 * Copyright (c) 1995-2003, Index Data
3 * See the file LICENSE for details.
5 * $Id: odr.c,v 1.40 2003-02-12 15:06:43 adam Exp $
15 #include <yaz/xmalloc.h>
18 Odr_null *ODR_NULLVAL = (Odr_null *) "NULL"; /* the presence of a null value */
20 Odr_null *odr_nullval (void)
28 "Memory allocation failed",
31 "Required data element missing",
37 "Length of constructed type different from sum of members",
38 "Overflow writing definite length of constructed type",
42 char *odr_errmsg(int n)
44 return odr_errlist[n];
47 void odr_perror(ODR o, char *message)
49 fprintf(stderr, "%s: %s\n", message, odr_errlist[o->error]);
52 int odr_geterror(ODR o)
57 void odr_setprint(ODR o, FILE *file)
62 int odr_set_charset(ODR o, const char *to, const char *from)
64 if (o->op->iconv_handle)
65 yaz_iconv_close (o->op->iconv_handle);
67 o->op->iconv_handle = yaz_iconv_open (to, from);
68 if (o->op->iconv_handle == 0)
75 ODR odr_createmem(int direction)
79 if (!(r = (ODR)xmalloc(sizeof(*r))))
81 r->direction = direction;
84 r->size = r->pos = r->top = 0;
86 r->mem = nmem_create();
88 r->op = (struct Odr_private *) xmalloc (sizeof(*r->op));
89 r->op->odr_ber_tag.lclass = -1;
90 r->op->iconv_handle = 0;
92 yaz_log (LOG_DEBUG, "odr_createmem dir=%d o=%p", direction, r);
100 odr_seek(o, ODR_S_SET, 0);
109 if (o->op->iconv_handle != 0)
110 yaz_iconv(o->op->iconv_handle, 0, 0, 0, 0);
111 yaz_log (LOG_DEBUG, "odr_reset o=%p", o);
114 void odr_destroy(ODR o)
116 nmem_destroy(o->mem);
117 if (o->buf && o->can_grow)
119 if (o->print && o->print != stderr)
121 if (o->op->iconv_handle != 0)
122 yaz_iconv_close (o->op->iconv_handle);
125 yaz_log (LOG_DEBUG, "odr_destroy o=%p", o);
128 void odr_setbuf(ODR o, char *buf, int len, int can_grow)
130 o->bp = (unsigned char *) buf;
132 o->buf = (unsigned char *) buf;
133 o->can_grow = can_grow;
138 char *odr_getbuf(ODR o, int *len, int *size)
143 return (char*) o->buf;