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