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