YAZ 5.38.1
odr.c
Go to the documentation of this file.
1/* This file is part of the YAZ toolkit.
2 * Copyright (C) Index Data
3 * See the file LICENSE for details.
4 */
5
10
11#if HAVE_CONFIG_H
12#include <config.h>
13#endif
14
15#include <assert.h>
16#include <stdio.h>
17#include <stdlib.h>
18#include <stdarg.h>
19
20#include <yaz/xmalloc.h>
21#include <yaz/log.h>
22#include <yaz/snprintf.h>
23#include "odr-priv.h"
24
25static int log_level = 0;
26static int log_level_initialized = 0;
27
28Odr_null *ODR_NULLVAL = (Odr_null *) "NULL"; /* the presence of a null value */
29
31{
32 return ODR_NULLVAL;
33}
34
35char *odr_errlist[] =
36{
37 "No (unknown) error",
38 "Memory allocation failed",
39 "System error",
40 "No space in buffer",
41 "Required data element missing",
42 "Unexpected tag",
43 "Other error",
44 "Protocol error",
45 "Malformed data",
46 "Stack overflow",
47 "Length of constructed type different from sum of members",
48 "Overflow writing definite length of constructed type",
49 "Bad HTTP Request"
50};
51
52char *odr_errmsg(int n)
53{
54 return odr_errlist[n];
55}
56
57void odr_perror(ODR o, const char *message)
58{
59 const char *e = odr_getelement(o);
60 const char **element_path = odr_get_element_path(o);
61 int err, x;
62
63 err = odr_geterrorx(o, &x);
64 fprintf(stderr, "%s: %s (code %d:%d)", message, odr_errlist[err], err, x);
65 if (e && *e)
66 fprintf(stderr, " element %s", e);
67
68 fprintf(stderr, "\n");
69 if (element_path)
70 {
71 fprintf(stderr, "Element path:");
72 while (*element_path)
73 fprintf(stderr, " %s", *element_path++);
74 fprintf(stderr, "\n");
75 }
76}
77
79{
80 return o->error;
81}
82
83int odr_geterrorx(ODR o, int *x)
84{
85 if (x)
86 *x = o->op->error_id;
87 return o->error;
88}
89
90const char *odr_getelement(ODR o)
91{
92 return o->op->element;
93}
94
96{
97 int cur_sz = 0;
98 struct odr_constack *st;
99
100 for (st = o->op->stack_top; st; st = st->prev)
101 cur_sz++;
102 if (o->op->tmp_names_sz < cur_sz + 1)
103 {
104 o->op->tmp_names_sz = 2 * cur_sz + 5;
105 o->op->tmp_names_buf = (const char **)
106 odr_malloc(o, o->op->tmp_names_sz * sizeof(char*));
107 }
108 o->op->tmp_names_buf[cur_sz] = 0;
109 for (st = o->op->stack_top; st; st = st->prev)
110 {
111 cur_sz--;
112 o->op->tmp_names_buf[cur_sz] = st->name;
113 }
114 assert(cur_sz == 0);
115 return o->op->tmp_names_buf;
116}
117
118void odr_seterror(ODR o, int error, int id)
119{
120 o->error = error;
121 o->op->error_id = id;
122 o->op->element[0] = '\0';
123}
124
125void odr_setelement(ODR o, const char *element)
126{
127 if (element)
128 {
129 strncpy(o->op->element, element, sizeof(o->op->element)-1);
130 o->op->element[sizeof(o->op->element)-1] = '\0';
131 }
132}
133
134void odr_FILE_write(ODR o, void *handle, int type,
135 const char *buf, int len)
136{
137 int i;
138 for (i = 0; i < len; i++)
139 {
140 unsigned c = ((const unsigned char *) buf)[i];
141 if (i == 20000 && len > 31000)
142 {
143 fputs(" ..... ", (FILE*) handle);
144 i = len - 1000;
145 }
146 if (strchr("\r\n\f\t", c) || (c >= ' ' && c <= 126))
147 putc(c, (FILE*) handle);
148 else
149 {
150 fprintf((FILE*) handle, "\\X%02X", c);
151 }
152 }
153}
154
155void odr_FILE_close(void *handle)
156{
157 FILE *f = (FILE *) handle;
158 if (f && f != stderr && f != stdout)
159 fclose(f);
160}
161
162void odr_setprint(ODR o, FILE *file)
163{
165}
166
167void odr_setprint_noclose(ODR o, FILE *file)
168{
169 odr_set_stream(o, file, odr_FILE_write, 0);
170}
171
172void odr_set_stream(ODR o, void *handle,
173 void (*stream_write)(ODR o,
174 void *handle, int type,
175 const char *buf, int len),
176 void (*stream_close)(void *handle))
177{
178 o->op->print = (FILE*) handle;
179 o->op->stream_write = stream_write;
180 o->op->stream_close = stream_close;
181}
182
183int odr_set_charset(ODR o, const char *to, const char *from)
184{
185 if (o->op->iconv_handle)
187 o->op->iconv_handle = 0;
188 if (to && from)
189 {
190 o->op->iconv_handle = yaz_iconv_open(to, from);
191 if (o->op->iconv_handle == 0)
192 return -1;
193 }
194 return 0;
195}
196
197
198ODR odr_createmem(int direction)
199{
200 ODR o;
202 {
205 }
206
207 if (!(o = (ODR) xmalloc(sizeof(*o))))
208 return 0;
209 o->op = (struct Odr_private *) xmalloc(sizeof(*o->op));
210 o->direction = direction;
211 o->op->buf = 0;
212 o->op->size = o->op->pos = o->op->top = 0;
213 o->op->can_grow = 1;
214 o->mem = nmem_create();
215 o->op->enable_bias = 1;
216 o->op->odr_ber_tag.lclass = -1;
217 o->op->iconv_handle = 0;
218 odr_setprint_noclose(o, stderr);
219 odr_reset(o);
220 yaz_log(log_level, "odr_createmem dir=%d o=%p", direction, o);
221 return o;
222}
223
225{
227 {
230 }
231
232 odr_seterror(o, ONONE, 0);
233 o->op->bp = o->op->buf;
234 odr_seek(o, ODR_S_SET, 0);
235 o->op->top = 0;
236 o->op->t_class = -1;
237 o->op->t_tag = -1;
238 o->op->indent = 0;
239 o->op->stack_first = 0;
240 o->op->stack_top = 0;
241 o->op->tmp_names_sz = 0;
242 o->op->tmp_names_buf = 0;
243 o->op->stack_depth = 0;
244 nmem_reset(o->mem);
245 o->op->choice_bias = -1;
246 o->op->lenlen = 1;
247 if (o->op->iconv_handle != 0)
248 yaz_iconv(o->op->iconv_handle, 0, 0, 0, 0);
249 yaz_log(log_level, "odr_reset o=%p", o);
250}
251
253{
254 nmem_destroy(o->mem);
255 if (o->op->buf && o->op->can_grow)
256 xfree(o->op->buf);
257 if (o->op->stream_close)
258 o->op->stream_close(o->op->print);
259 if (o->op->iconv_handle != 0)
261 xfree(o->op);
262 xfree(o);
263 yaz_log(log_level, "odr_destroy o=%p", o);
264}
265
266void odr_setbuf(ODR o, char *buf, int len, int can_grow)
267{
268 odr_seterror(o, ONONE, 0);
269 o->op->bp = buf;
270 o->op->buf = buf;
271 o->op->can_grow = can_grow;
272 o->op->top = o->op->pos = 0;
273 o->op->size = len;
274}
275
276char *odr_getbuf(ODR o, int *len, int *size)
277{
278 *len = o->op->top;
279 if (size)
280 *size = o->op->size;
281 return o->op->buf;
282}
283
285{
286 return o->op->bp - o->op->buf;
287}
288
289void odr_printf(ODR o, const char *fmt, ...)
290{
291 va_list ap;
292 char buf[4096];
293
294 va_start(ap, fmt);
295 yaz_vsnprintf(buf, sizeof(buf), fmt, ap);
296 o->op->stream_write(o, o->op->print, ODR_VISIBLESTRING, buf, strlen(buf));
297 va_end(ap);
298}
299/*
300 * Local variables:
301 * c-basic-offset: 4
302 * c-file-style: "Stroustrup"
303 * indent-tabs-mode: nil
304 * End:
305 * vim: shiftwidth=4 tabstop=8 expandtab
306 */
307
static int log_level
Definition eventl.c:39
static int log_level_initialized
Definition eventl.c:40
void yaz_log(int level, const char *fmt,...)
Writes log message.
Definition log.c:487
int yaz_log_module_level(const char *name)
returns level for module
Definition log.c:586
Logging utility.
void nmem_reset(NMEM n)
releases memory associaged with an NMEM handle
Definition nmem.c:129
NMEM nmem_create(void)
returns new NMEM handle
Definition nmem.c:181
void nmem_destroy(NMEM n)
destroys NMEM handle and memory associated with it
Definition nmem.c:204
Internal ODR definitions.
void odr_perror(ODR o, const char *message)
Definition odr.c:57
void odr_setprint_noclose(ODR o, FILE *file)
Definition odr.c:167
const char * odr_getelement(ODR o)
Definition odr.c:90
void odr_FILE_close(void *handle)
Definition odr.c:155
const char ** odr_get_element_path(ODR o)
Definition odr.c:95
void odr_setelement(ODR o, const char *element)
Definition odr.c:125
Odr_null * ODR_NULLVAL
Definition odr.c:28
int odr_geterrorx(ODR o, int *x)
Definition odr.c:83
int odr_geterror(ODR o)
Definition odr.c:78
char * odr_getbuf(ODR o, int *len, int *size)
Definition odr.c:276
int odr_offset(ODR o)
Definition odr.c:284
void odr_seterror(ODR o, int error, int id)
Definition odr.c:118
void odr_FILE_write(ODR o, void *handle, int type, const char *buf, int len)
Definition odr.c:134
ODR odr_createmem(int direction)
Definition odr.c:198
int odr_set_charset(ODR o, const char *to, const char *from)
Definition odr.c:183
void odr_setbuf(ODR o, char *buf, int len, int can_grow)
Definition odr.c:266
void odr_setprint(ODR o, FILE *file)
Definition odr.c:162
Odr_null * odr_nullval(void)
Definition odr.c:30
void odr_set_stream(ODR o, void *handle, void(*stream_write)(ODR o, void *handle, int type, const char *buf, int len), void(*stream_close)(void *handle))
Definition odr.c:172
char * odr_errmsg(int n)
Definition odr.c:52
void odr_destroy(ODR o)
Definition odr.c:252
void odr_reset(ODR o)
Definition odr.c:224
char * odr_errlist[]
Definition odr.c:35
void odr_printf(ODR o, const char *fmt,...)
Definition odr.c:289
#define ODR_VISIBLESTRING
Definition odr.h:89
struct odr * ODR
Definition odr.h:121
#define ODR_S_SET
Definition odr.h:117
void Odr_null
Definition odr.h:105
#define ONONE
Definition odr.h:150
void * odr_malloc(ODR o, size_t size)
Definition odr_mem.c:31
int odr_seek(ODR o, int whence, int offset)
Definition odr_mem.c:117
size_t yaz_iconv(yaz_iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
just like iconv(3)
Definition siconv.c:146
int yaz_iconv_close(yaz_iconv_t cd)
just like iconv_close(3)
Definition siconv.c:284
yaz_iconv_t yaz_iconv_open(const char *tocode, const char *fromcode)
just like iconv_open(3)
Definition siconv.c:95
void yaz_vsnprintf(char *buf, size_t size, const char *fmt, va_list ap)
Definition snprintf.c:17
Header for config file reading utilities.
ODR private data.
Definition odr-priv.h:83
char * buf
Definition odr-priv.h:84
void(*) stream_close(void *handle)
Definition odr-priv.h:105
int enable_bias
Definition odr-priv.h:111
struct odr_constack * stack_top
Definition odr-priv.h:92
const char * bp
Definition odr-priv.h:85
int stack_depth
Definition odr-priv.h:93
void(*) stream_write(ODR o, void *handle, int type, const char *buf, int len)
Definition odr-priv.h:103
int choice_bias
Definition odr-priv.h:112
yaz_iconv_t iconv_handle
Definition odr-priv.h:100
int tmp_names_sz
Definition odr-priv.h:96
const char ** tmp_names_buf
Definition odr-priv.h:95
FILE * print
Definition odr-priv.h:114
struct odr_constack * stack_first
Definition odr-priv.h:91
char element[80]
Definition odr-priv.h:102
struct Odr_ber_tag odr_ber_tag
Definition odr-priv.h:98
stack for BER constructed items
Definition odr-priv.h:64
struct odr_constack * prev
Definition odr-priv.h:74
const char * name
Definition odr-priv.h:72
struct Odr_private * op
Definition odr.h:132
int error
Definition odr.h:128
int direction
Definition odr.h:126
NMEM mem
Definition odr.h:130
Header for memory handling functions.
#define xfree(x)
utility macro which calls xfree_f
Definition xmalloc.h:53
#define xmalloc(x)
utility macro which calls malloc_f
Definition xmalloc.h:49