2 * Copyright (c) 1995-1999, Index Data
3 * See the file LICENSE for details.
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.31 1999-11-30 13:47:11 adam
8 * Improved installation. Moved header files to include/yaz.
10 * Revision 1.30 1999/08/27 09:40:32 adam
11 * Renamed logf function to yaz_log. Removed VC++ project files.
13 * Revision 1.29 1999/04/27 08:34:10 adam
14 * Modified odr_destroy so that file is not closed when file is 0.
16 * Revision 1.28 1998/07/20 12:38:13 adam
17 * More LOG_DEBUG-diagnostics.
19 * Revision 1.27 1998/02/11 11:53:34 adam
20 * Changed code so that it compiles as C++.
22 * Revision 1.26 1997/11/24 11:33:56 adam
23 * Using function odr_nullval() instead of global ODR_NULLVAL when
26 * Revision 1.25 1997/10/31 12:20:08 adam
27 * Improved memory debugging for xmalloc/nmem.c. References to NMEM
28 * instead of ODR in n ESPEC-1 handling in source d1_espec.c.
29 * Bug fix: missing fclose in data1_read_espec1.
31 * Revision 1.24 1997/09/01 08:51:07 adam
32 * New windows NT/95 port using MSV5.0. Had to avoid a few static
33 * variables used in function ber_tag. These are now part of the
36 * Revision 1.23 1997/04/30 08:52:10 quinn
39 * Revision 1.22 1996/10/08 12:58:17 adam
40 * New ODR function, odr_choice_enable_bias, to control behaviour of
43 * Revision 1.21 1996/07/26 13:38:19 quinn
44 * Various smaller things. Gathered header-files.
46 * Revision 1.20 1995/11/08 17:41:32 quinn
49 * Revision 1.19 1995/11/01 13:54:41 quinn
52 * Revision 1.18 1995/09/29 17:12:22 quinn
55 * Revision 1.17 1995/09/29 17:01:50 quinn
58 * Revision 1.16 1995/09/27 15:02:57 quinn
59 * Modified function heads & prototypes.
61 * Revision 1.15 1995/08/15 12:00:22 quinn
64 * Revision 1.14 1995/06/19 12:38:46 quinn
67 * Revision 1.13 1995/05/22 11:32:02 quinn
68 * Fixing Interface to odr_null.
70 * Revision 1.12 1995/05/16 08:50:49 quinn
71 * License, documentation, and memory fixes
73 * Revision 1.11 1995/05/15 11:56:08 quinn
74 * More work on memory management.
76 * Revision 1.10 1995/04/18 08:15:20 quinn
77 * Added dynamic memory allocation on encoding (whew). Code is now somewhat
78 * neater. We'll make the same change for decoding one day.
80 * Revision 1.9 1995/04/10 10:23:11 quinn
83 * Revision 1.8 1995/03/17 10:17:43 quinn
84 * Added memory management.
86 * Revision 1.7 1995/03/10 11:44:41 quinn
87 * Fixed serious stack-bug in odr_cons_begin
89 * Revision 1.6 1995/03/08 12:12:15 quinn
90 * Added better error checking.
92 * Revision 1.5 1995/03/07 13:28:57 quinn
93 * *** empty log message ***
95 * Revision 1.4 1995/03/07 13:16:13 quinn
96 * Fixed bug in odr_reset
98 * Revision 1.3 1995/03/07 10:21:31 quinn
99 * odr_errno-->odr_error
101 * Revision 1.2 1995/03/07 10:19:05 quinn
102 * Addded some method functions to the ODR type.
104 * Revision 1.1 1995/03/07 09:23:15 quinn
105 * Installing top-level API and documentation.
113 #include <yaz/xmalloc.h>
116 Odr_null *ODR_NULLVAL = "NULL"; /* the presence of a null value */
118 Odr_null *odr_nullval (void)
123 char *odr_errlist[] =
125 "No (unknown) error",
126 "Memory allocation failed",
128 "No space in buffer",
129 "Required data element missing",
135 "Length of constructed type different from sum of members",
136 "Overflow writing definite length of constructed type"
139 char *odr_errmsg(int n)
141 return odr_errlist[n];
144 void odr_perror(ODR o, char *message)
146 fprintf(stderr, "%s: %s\n", message, odr_errlist[o->error]);
149 int odr_geterror(ODR o)
154 void odr_setprint(ODR o, FILE *file)
161 ODR odr_createmem(int direction)
165 if (!(r = (ODR)xmalloc(sizeof(*r))))
167 r->direction = direction;
171 r->ecb.size = r->ecb.pos = r->ecb.top = 0;
174 r->mem = nmem_create();
176 r->odr_ber_tag.lclass = -1;
178 yaz_log (LOG_DEBUG, "odr_createmem dir=%d o=%p", direction, r);
182 void odr_reset(ODR o)
186 odr_seek(o, ODR_S_SET, 0);
196 yaz_log (LOG_DEBUG, "odr_reset o=%p", o);
199 void odr_destroy(ODR o)
201 nmem_destroy(o->mem);
202 if (o->ecb.buf && o->ecb.can_grow)
204 if (o->print && o->print != stderr)
207 yaz_log (LOG_DEBUG, "odr_destroy o=%p", o);
210 void odr_setbuf(ODR o, char *buf, int len, int can_grow)
212 o->buf = o->bp = (unsigned char *) buf;
213 o->buflen = o->left = len;
215 o->ecb.buf = (unsigned char *) buf;
216 o->ecb.can_grow = can_grow;
217 o->ecb.top = o->ecb.pos = 0;
221 char *odr_getbuf(ODR o, int *len, int *size)
226 return (char*) o->ecb.buf;