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