2 * Copyright (c) 1995-2003, Index Data
3 * See the file LICENSE for details.
5 * $Id: odr.c,v 1.42 2003-05-19 14:37:38 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 int odr_geterrorx(ODR o, int *x)
64 void odr_seterror(ODR o, int error, int id)
70 void odr_setprint(ODR o, FILE *file)
75 int odr_set_charset(ODR o, const char *to, const char *from)
77 if (o->op->iconv_handle)
78 yaz_iconv_close (o->op->iconv_handle);
79 o->op->iconv_handle = 0;
82 o->op->iconv_handle = yaz_iconv_open (to, from);
83 if (o->op->iconv_handle == 0)
91 ODR odr_createmem(int direction)
95 if (!(r = (ODR)xmalloc(sizeof(*r))))
97 r->direction = direction;
100 r->size = r->pos = r->top = 0;
102 r->mem = nmem_create();
104 r->op = (struct Odr_private *) xmalloc (sizeof(*r->op));
105 r->op->odr_ber_tag.lclass = -1;
106 r->op->iconv_handle = 0;
108 yaz_log (LOG_DEBUG, "odr_createmem dir=%d o=%p", direction, r);
112 void odr_reset(ODR o)
114 odr_seterror(o, ONONE, 0);
116 odr_seek(o, ODR_S_SET, 0);
125 if (o->op->iconv_handle != 0)
126 yaz_iconv(o->op->iconv_handle, 0, 0, 0, 0);
127 yaz_log (LOG_DEBUG, "odr_reset o=%p", o);
130 void odr_destroy(ODR o)
132 nmem_destroy(o->mem);
133 if (o->buf && o->can_grow)
135 if (o->print && o->print != stderr)
137 if (o->op->iconv_handle != 0)
138 yaz_iconv_close (o->op->iconv_handle);
141 yaz_log (LOG_DEBUG, "odr_destroy o=%p", o);
144 void odr_setbuf(ODR o, char *buf, int len, int can_grow)
146 o->bp = (unsigned char *) buf;
148 o->buf = (unsigned char *) buf;
149 o->can_grow = can_grow;
154 char *odr_getbuf(ODR o, int *len, int *size)
159 return (char*) o->buf;