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