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