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