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