2 * Copyright (c) 1995-2000, Index Data
3 * See the file LICENSE for details.
6 * Revision 1.32 2000-01-31 13:15:21 adam
7 * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
8 * that some characters are not surrounded by spaces in resulting term.
11 * Revision 1.31 1999/11/30 13:47:11 adam
12 * Improved installation. Moved header files to include/yaz.
14 * Revision 1.30 1999/08/27 09:40:32 adam
15 * Renamed logf function to yaz_log. Removed VC++ project files.
17 * Revision 1.29 1999/04/27 08:34:10 adam
18 * Modified odr_destroy so that file is not closed when file is 0.
20 * Revision 1.28 1998/07/20 12:38:13 adam
21 * More LOG_DEBUG-diagnostics.
23 * Revision 1.27 1998/02/11 11:53:34 adam
24 * Changed code so that it compiles as C++.
26 * Revision 1.26 1997/11/24 11:33:56 adam
27 * Using function odr_nullval() instead of global ODR_NULLVAL when
30 * Revision 1.25 1997/10/31 12:20:08 adam
31 * Improved memory debugging for xmalloc/nmem.c. References to NMEM
32 * instead of ODR in n ESPEC-1 handling in source d1_espec.c.
33 * Bug fix: missing fclose in data1_read_espec1.
35 * Revision 1.24 1997/09/01 08:51:07 adam
36 * New windows NT/95 port using MSV5.0. Had to avoid a few static
37 * variables used in function ber_tag. These are now part of the
40 * Revision 1.23 1997/04/30 08:52:10 quinn
43 * Revision 1.22 1996/10/08 12:58:17 adam
44 * New ODR function, odr_choice_enable_bias, to control behaviour of
47 * Revision 1.21 1996/07/26 13:38:19 quinn
48 * Various smaller things. Gathered header-files.
50 * Revision 1.20 1995/11/08 17:41:32 quinn
53 * Revision 1.19 1995/11/01 13:54:41 quinn
56 * Revision 1.18 1995/09/29 17:12:22 quinn
59 * Revision 1.17 1995/09/29 17:01:50 quinn
62 * Revision 1.16 1995/09/27 15:02:57 quinn
63 * Modified function heads & prototypes.
65 * Revision 1.15 1995/08/15 12:00:22 quinn
68 * Revision 1.14 1995/06/19 12:38:46 quinn
71 * Revision 1.13 1995/05/22 11:32:02 quinn
72 * Fixing Interface to odr_null.
74 * Revision 1.12 1995/05/16 08:50:49 quinn
75 * License, documentation, and memory fixes
77 * Revision 1.11 1995/05/15 11:56:08 quinn
78 * More work on memory management.
80 * Revision 1.10 1995/04/18 08:15:20 quinn
81 * Added dynamic memory allocation on encoding (whew). Code is now somewhat
82 * neater. We'll make the same change for decoding one day.
84 * Revision 1.9 1995/04/10 10:23:11 quinn
87 * Revision 1.8 1995/03/17 10:17:43 quinn
88 * Added memory management.
90 * Revision 1.7 1995/03/10 11:44:41 quinn
91 * Fixed serious stack-bug in odr_cons_begin
93 * Revision 1.6 1995/03/08 12:12:15 quinn
94 * Added better error checking.
96 * Revision 1.5 1995/03/07 13:28:57 quinn
97 * *** empty log message ***
99 * Revision 1.4 1995/03/07 13:16:13 quinn
100 * Fixed bug in odr_reset
102 * Revision 1.3 1995/03/07 10:21:31 quinn
103 * odr_errno-->odr_error
105 * Revision 1.2 1995/03/07 10:19:05 quinn
106 * Addded some method functions to the ODR type.
108 * Revision 1.1 1995/03/07 09:23:15 quinn
109 * Installing top-level API and documentation.
117 #include <yaz/xmalloc.h>
120 Odr_null *ODR_NULLVAL = "NULL"; /* the presence of a null value */
122 Odr_null *odr_nullval (void)
127 char *odr_errlist[] =
129 "No (unknown) error",
130 "Memory allocation failed",
132 "No space in buffer",
133 "Required data element missing",
139 "Length of constructed type different from sum of members",
140 "Overflow writing definite length of constructed type"
143 char *odr_errmsg(int n)
145 return odr_errlist[n];
148 void odr_perror(ODR o, char *message)
150 fprintf(stderr, "%s: %s\n", message, odr_errlist[o->error]);
153 int odr_geterror(ODR o)
158 void odr_setprint(ODR o, FILE *file)
165 ODR odr_createmem(int direction)
169 if (!(r = (ODR)xmalloc(sizeof(*r))))
171 r->direction = direction;
174 r->size = r->pos = r->top = 0;
176 r->mem = nmem_create();
178 r->odr_ber_tag.lclass = -1;
180 yaz_log (LOG_DEBUG, "odr_createmem dir=%d o=%p", direction, r);
184 void odr_reset(ODR o)
188 odr_seek(o, ODR_S_SET, 0);
197 yaz_log (LOG_DEBUG, "odr_reset o=%p", o);
200 void odr_destroy(ODR o)
202 nmem_destroy(o->mem);
203 if (o->buf && o->can_grow)
205 if (o->print && o->print != stderr)
208 yaz_log (LOG_DEBUG, "odr_destroy o=%p", o);
211 void odr_setbuf(ODR o, char *buf, int len, int can_grow)
213 o->bp = (unsigned char *) buf;
215 o->buf = (unsigned char *) buf;
216 o->can_grow = can_grow;
221 char *odr_getbuf(ODR o, int *len, int *size)
226 return (char*) o->buf;