2 * Copyright (c) 1995-1997, Index Data
3 * See the file LICENSE for details.
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.26 1997-11-24 11:33:56 adam
8 * Using function odr_nullval() instead of global ODR_NULLVAL when
11 * Revision 1.25 1997/10/31 12:20:08 adam
12 * Improved memory debugging for xmalloc/nmem.c. References to NMEM
13 * instead of ODR in n ESPEC-1 handling in source d1_espec.c.
14 * Bug fix: missing fclose in data1_read_espec1.
16 * Revision 1.24 1997/09/01 08:51:07 adam
17 * New windows NT/95 port using MSV5.0. Had to avoid a few static
18 * variables used in function ber_tag. These are now part of the
21 * Revision 1.23 1997/04/30 08:52:10 quinn
24 * Revision 1.22 1996/10/08 12:58:17 adam
25 * New ODR function, odr_choice_enable_bias, to control behaviour of
28 * Revision 1.21 1996/07/26 13:38:19 quinn
29 * Various smaller things. Gathered header-files.
31 * Revision 1.20 1995/11/08 17:41:32 quinn
34 * Revision 1.19 1995/11/01 13:54:41 quinn
37 * Revision 1.18 1995/09/29 17:12:22 quinn
40 * Revision 1.17 1995/09/29 17:01:50 quinn
43 * Revision 1.16 1995/09/27 15:02:57 quinn
44 * Modified function heads & prototypes.
46 * Revision 1.15 1995/08/15 12:00:22 quinn
49 * Revision 1.14 1995/06/19 12:38:46 quinn
52 * Revision 1.13 1995/05/22 11:32:02 quinn
53 * Fixing Interface to odr_null.
55 * Revision 1.12 1995/05/16 08:50:49 quinn
56 * License, documentation, and memory fixes
58 * Revision 1.11 1995/05/15 11:56:08 quinn
59 * More work on memory management.
61 * Revision 1.10 1995/04/18 08:15:20 quinn
62 * Added dynamic memory allocation on encoding (whew). Code is now somewhat
63 * neater. We'll make the same change for decoding one day.
65 * Revision 1.9 1995/04/10 10:23:11 quinn
68 * Revision 1.8 1995/03/17 10:17:43 quinn
69 * Added memory management.
71 * Revision 1.7 1995/03/10 11:44:41 quinn
72 * Fixed serious stack-bug in odr_cons_begin
74 * Revision 1.6 1995/03/08 12:12:15 quinn
75 * Added better error checking.
77 * Revision 1.5 1995/03/07 13:28:57 quinn
78 * *** empty log message ***
80 * Revision 1.4 1995/03/07 13:16:13 quinn
81 * Fixed bug in odr_reset
83 * Revision 1.3 1995/03/07 10:21:31 quinn
84 * odr_errno-->odr_error
86 * Revision 1.2 1995/03/07 10:19:05 quinn
87 * Addded some method functions to the ODR type.
89 * Revision 1.1 1995/03/07 09:23:15 quinn
90 * Installing top-level API and documentation.
101 Odr_null *ODR_NULLVAL = "NULL"; /* the presence of a null value */
103 Odr_null *odr_nullval (void)
108 char *odr_errlist[] =
110 "No (unknown) error",
111 "Memory allocation failed",
113 "No space in buffer",
114 "Required data element missing",
120 "Length of constructed type different from sum of members",
121 "Overflow writing definite length of constructed type"
124 char *odr_errmsg(int n)
126 return odr_errlist[n];
129 void odr_perror(ODR o, char *message)
131 fprintf(stderr, "%s: %s\n", message, odr_errlist[o->error]);
134 int odr_geterror(ODR o)
139 void odr_setprint(ODR o, FILE *file)
146 ODR odr_createmem(int direction)
151 logf (LOG_DEBUG, "odr_createmem dir=%d", direction);
152 if (!(r = xmalloc(sizeof(*r))))
154 r->direction = direction;
158 r->ecb.size = r->ecb.pos = r->ecb.top = 0;
161 r->mem = nmem_create();
163 r->odr_ber_tag.lclass = -1;
168 void odr_reset(ODR o)
172 odr_seek(o, ODR_S_SET, 0);
184 void odr_destroy(ODR o)
186 nmem_destroy(o->mem);
187 if (o->ecb.buf && o->ecb.can_grow)
189 if (o->print != stderr)
194 void odr_setbuf(ODR o, char *buf, int len, int can_grow)
196 o->buf = o->bp = (unsigned char *) buf;
197 o->buflen = o->left = len;
199 o->ecb.buf = (unsigned char *) buf;
200 o->ecb.can_grow = can_grow;
201 o->ecb.top = o->ecb.pos = 0;
205 char *odr_getbuf(ODR o, int *len, int *size)
210 return (char*) o->ecb.buf;