Minor changes.
[yaz-moved-to-github.git] / odr / odr.c
1 /*
2  * Copyright (c) 1995-1999, Index Data
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: odr.c,v $
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.
9  *
10  * Revision 1.28  1998/07/20 12:38:13  adam
11  * More LOG_DEBUG-diagnostics.
12  *
13  * Revision 1.27  1998/02/11 11:53:34  adam
14  * Changed code so that it compiles as C++.
15  *
16  * Revision 1.26  1997/11/24 11:33:56  adam
17  * Using function odr_nullval() instead of global ODR_NULLVAL when
18  * appropriate.
19  *
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.
24  *
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
28  * ODR structure.
29  *
30  * Revision 1.23  1997/04/30 08:52:10  quinn
31  * Null
32  *
33  * Revision 1.22  1996/10/08  12:58:17  adam
34  * New ODR function, odr_choice_enable_bias, to control behaviour of
35  * odr_choice_bias.
36  *
37  * Revision 1.21  1996/07/26  13:38:19  quinn
38  * Various smaller things. Gathered header-files.
39  *
40  * Revision 1.20  1995/11/08  17:41:32  quinn
41  * Smallish.
42  *
43  * Revision 1.19  1995/11/01  13:54:41  quinn
44  * Minor adjustments
45  *
46  * Revision 1.18  1995/09/29  17:12:22  quinn
47  * Smallish
48  *
49  * Revision 1.17  1995/09/29  17:01:50  quinn
50  * More Windows work
51  *
52  * Revision 1.16  1995/09/27  15:02:57  quinn
53  * Modified function heads & prototypes.
54  *
55  * Revision 1.15  1995/08/15  12:00:22  quinn
56  * Updated External
57  *
58  * Revision 1.14  1995/06/19  12:38:46  quinn
59  * Added BER dumper.
60  *
61  * Revision 1.13  1995/05/22  11:32:02  quinn
62  * Fixing Interface to odr_null.
63  *
64  * Revision 1.12  1995/05/16  08:50:49  quinn
65  * License, documentation, and memory fixes
66  *
67  * Revision 1.11  1995/05/15  11:56:08  quinn
68  * More work on memory management.
69  *
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.
73  *
74  * Revision 1.9  1995/04/10  10:23:11  quinn
75  * Smallish changes.
76  *
77  * Revision 1.8  1995/03/17  10:17:43  quinn
78  * Added memory management.
79  *
80  * Revision 1.7  1995/03/10  11:44:41  quinn
81  * Fixed serious stack-bug in odr_cons_begin
82  *
83  * Revision 1.6  1995/03/08  12:12:15  quinn
84  * Added better error checking.
85  *
86  * Revision 1.5  1995/03/07  13:28:57  quinn
87  * *** empty log message ***
88  *
89  * Revision 1.4  1995/03/07  13:16:13  quinn
90  * Fixed bug in odr_reset
91  *
92  * Revision 1.3  1995/03/07  10:21:31  quinn
93  * odr_errno-->odr_error
94  *
95  * Revision 1.2  1995/03/07  10:19:05  quinn
96  * Addded some method functions to the ODR type.
97  *
98  * Revision 1.1  1995/03/07  09:23:15  quinn
99  * Installing top-level API and documentation.
100  *
101  *
102  */
103
104 #include <stdio.h>
105 #include <stdlib.h>
106
107 #include <xmalloc.h>
108 #include <odr.h>
109
110 Odr_null *ODR_NULLVAL = "NULL";  /* the presence of a null value */
111
112 Odr_null *odr_nullval (void)
113 {
114     return ODR_NULLVAL;
115 }
116
117 char *odr_errlist[] =
118 {
119     "No (unknown) error",
120     "Memory allocation failed",
121     "System error",
122     "No space in buffer",
123     "Required data element missing",
124     "Unexpected tag",
125     "Other error",
126     "Protocol error",
127     "Malformed data",
128     "Stack overflow",
129     "Length of constructed type different from sum of members",
130     "Overflow writing definite length of constructed type"
131 };
132
133 char *odr_errmsg(int n)
134 {
135     return odr_errlist[n];
136 }
137
138 void odr_perror(ODR o, char *message)
139 {
140     fprintf(stderr, "%s: %s\n", message, odr_errlist[o->error]);
141 }
142
143 int odr_geterror(ODR o)
144 {
145     return o->error;
146 }
147
148 void odr_setprint(ODR o, FILE *file)
149 {
150     o->print = file;
151 }
152
153 #include <log.h>
154
155 ODR odr_createmem(int direction)
156 {
157     ODR r;
158
159     if (!(r = (ODR)xmalloc(sizeof(*r))))
160         return 0;
161     r->direction = direction;
162     r->print = stderr;
163     r->buf = 0;
164     r->ecb.buf = 0;
165     r->ecb.size = r->ecb.pos = r->ecb.top = 0;
166     r->ecb.can_grow = 1;
167     r->buflen = 0;
168     r->mem = nmem_create();
169     r->enable_bias = 1;
170     r->odr_ber_tag.lclass = -1;
171     odr_reset(r);
172     logf (LOG_DEBUG, "odr_createmem dir=%d o=%p", direction, r);
173     return r;
174 }
175
176 void odr_reset(ODR o)
177 {
178     o->error = ONONE;
179     o->bp = o->buf;
180     odr_seek(o, ODR_S_SET, 0);
181     o->ecb.top = 0;
182     o->left = o->buflen;
183     o->t_class = -1;
184     o->t_tag = -1;
185     o->indent = 0;
186     o->stackp = -1;
187     nmem_reset(o->mem);
188     o->choice_bias = -1;
189     o->lenlen = 1;
190     logf (LOG_DEBUG, "odr_reset o=%p", o);
191 }
192     
193 void odr_destroy(ODR o)
194 {
195     nmem_destroy(o->mem);
196     if (o->ecb.buf && o->ecb.can_grow)
197        xfree(o->ecb.buf);
198     if (o->print && o->print != stderr)
199         fclose(o->print);
200     xfree(o);
201     logf (LOG_DEBUG, "odr_destroy o=%p", o);
202 }
203
204 void odr_setbuf(ODR o, char *buf, int len, int can_grow)
205 {
206     o->buf = o->bp = (unsigned char *) buf;
207     o->buflen = o->left = len;
208
209     o->ecb.buf = (unsigned char *) buf;
210     o->ecb.can_grow = can_grow;
211     o->ecb.top = o->ecb.pos = 0;
212     o->ecb.size = len;
213 }
214
215 char *odr_getbuf(ODR o, int *len, int *size)
216 {
217     *len = o->ecb.top;
218     if (size)
219         *size = o->ecb.size;
220     return (char*) o->ecb.buf;
221 }