2 * Copyright (c) 1995-2003, Index Data
3 * See the file LICENSE for details.
5 * $Id: odr.c,v 1.44 2003-05-24 19:20:14 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 const char *e = odr_getelement(o);
51 fprintf(stderr, "%s: %s", message, odr_errlist[o->error]);
53 fprintf (stderr, " element %s", e);
54 fprintf(stderr, "\n");
57 int odr_geterror(ODR o)
62 int odr_geterrorx(ODR o, int *x)
69 char *odr_getelement(ODR o)
71 return o->op->element;
74 void odr_seterror(ODR o, int error, int id)
78 o->op->element[0] = '\0';
81 void odr_setelement(ODR o, const char *element)
85 strncpy(o->op->element, element, sizeof(o->op->element)-1);
86 o->op->element[sizeof(o->op->element)-1] = '\0';
90 void odr_setprint(ODR o, FILE *file)
95 int odr_set_charset(ODR o, const char *to, const char *from)
97 if (o->op->iconv_handle)
98 yaz_iconv_close (o->op->iconv_handle);
99 o->op->iconv_handle = 0;
102 o->op->iconv_handle = yaz_iconv_open (to, from);
103 if (o->op->iconv_handle == 0)
111 ODR odr_createmem(int direction)
115 if (!(r = (ODR)xmalloc(sizeof(*r))))
117 r->direction = direction;
120 r->size = r->pos = r->top = 0;
122 r->mem = nmem_create();
124 r->op = (struct Odr_private *) xmalloc (sizeof(*r->op));
125 r->op->odr_ber_tag.lclass = -1;
126 r->op->iconv_handle = 0;
128 yaz_log (LOG_DEBUG, "odr_createmem dir=%d o=%p", direction, r);
132 void odr_reset(ODR o)
134 odr_seterror(o, ONONE, 0);
136 odr_seek(o, ODR_S_SET, 0);
145 if (o->op->iconv_handle != 0)
146 yaz_iconv(o->op->iconv_handle, 0, 0, 0, 0);
147 yaz_log (LOG_DEBUG, "odr_reset o=%p", o);
150 void odr_destroy(ODR o)
152 nmem_destroy(o->mem);
153 if (o->buf && o->can_grow)
155 if (o->print && o->print != stderr)
157 if (o->op->iconv_handle != 0)
158 yaz_iconv_close (o->op->iconv_handle);
161 yaz_log (LOG_DEBUG, "odr_destroy o=%p", o);
164 void odr_setbuf(ODR o, char *buf, int len, int can_grow)
166 o->bp = (unsigned char *) buf;
168 o->buf = (unsigned char *) buf;
169 o->can_grow = can_grow;
174 char *odr_getbuf(ODR o, int *len, int *size)
179 return (char*) o->buf;