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