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