YAZ 5.37.0
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 nmem_reset(o->mem);
244 o->op->choice_bias = -1;
245 o->op->lenlen = 1;
246 if (o->op->iconv_handle != 0)
247 yaz_iconv(o->op->iconv_handle, 0, 0, 0, 0);
248 yaz_log(log_level, "odr_reset o=%p", o);
249}
250
252{
253 nmem_destroy(o->mem);
254 if (o->op->buf && o->op->can_grow)
255 xfree(o->op->buf);
256 if (o->op->stream_close)
257 o->op->stream_close(o->op->print);
258 if (o->op->iconv_handle != 0)
260 xfree(o->op);
261 xfree(o);
262 yaz_log(log_level, "odr_destroy o=%p", o);
263}
264
265void odr_setbuf(ODR o, char *buf, int len, int can_grow)
266{
267 odr_seterror(o, ONONE, 0);
268 o->op->bp = buf;
269 o->op->buf = buf;
270 o->op->can_grow = can_grow;
271 o->op->top = o->op->pos = 0;
272 o->op->size = len;
273}
274
275char *odr_getbuf(ODR o, int *len, int *size)
276{
277 *len = o->op->top;
278 if (size)
279 *size = o->op->size;
280 return o->op->buf;
281}
282
284{
285 return o->op->bp - o->op->buf;
286}
287
288void odr_printf(ODR o, const char *fmt, ...)
289{
290 va_list ap;
291 char buf[4096];
292
293 va_start(ap, fmt);
294 yaz_vsnprintf(buf, sizeof(buf), fmt, ap);
295 o->op->stream_write(o, o->op->print, ODR_VISIBLESTRING, buf, strlen(buf));
296 va_end(ap);
297}
298/*
299 * Local variables:
300 * c-basic-offset: 4
301 * c-file-style: "Stroustrup"
302 * indent-tabs-mode: nil
303 * End:
304 * vim: shiftwidth=4 tabstop=8 expandtab
305 */
306
static int log_level
Definition eventl.c:39
static int log_level_initialized
Definition eventl.c:40
enum l_file_type type
Definition log.c:47
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:275
int odr_offset(ODR o)
Definition odr.c:283
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:265
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:251
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:288
#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
int enable_bias
Definition odr-priv.h:110
struct odr_constack * stack_top
Definition odr-priv.h:92
const char * bp
Definition odr-priv.h:85
int choice_bias
Definition odr-priv.h:111
yaz_iconv_t iconv_handle
Definition odr-priv.h:99
void(* stream_write)(ODR o, void *handle, int type, const char *buf, int len)
Definition odr-priv.h:102
void(* stream_close)(void *handle)
Definition odr-priv.h:104
int tmp_names_sz
Definition odr-priv.h:95
const char ** tmp_names_buf
Definition odr-priv.h:94
FILE * print
Definition odr-priv.h:113
struct odr_constack * stack_first
Definition odr-priv.h:91
char element[80]
Definition odr-priv.h:101
struct Odr_ber_tag odr_ber_tag
Definition odr-priv.h:97
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