Minor adjustments
[yaz-moved-to-github.git] / odr / odr.c
1 /*
2  * Copyright (c) 1995, Index Data
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: odr.c,v $
7  * Revision 1.19  1995-11-01 13:54:41  quinn
8  * Minor adjustments
9  *
10  * Revision 1.18  1995/09/29  17:12:22  quinn
11  * Smallish
12  *
13  * Revision 1.17  1995/09/29  17:01:50  quinn
14  * More Windows work
15  *
16  * Revision 1.16  1995/09/27  15:02:57  quinn
17  * Modified function heads & prototypes.
18  *
19  * Revision 1.15  1995/08/15  12:00:22  quinn
20  * Updated External
21  *
22  * Revision 1.14  1995/06/19  12:38:46  quinn
23  * Added BER dumper.
24  *
25  * Revision 1.13  1995/05/22  11:32:02  quinn
26  * Fixing Interface to odr_null.
27  *
28  * Revision 1.12  1995/05/16  08:50:49  quinn
29  * License, documentation, and memory fixes
30  *
31  * Revision 1.11  1995/05/15  11:56:08  quinn
32  * More work on memory management.
33  *
34  * Revision 1.10  1995/04/18  08:15:20  quinn
35  * Added dynamic memory allocation on encoding (whew). Code is now somewhat
36  * neater. We'll make the same change for decoding one day.
37  *
38  * Revision 1.9  1995/04/10  10:23:11  quinn
39  * Smallish changes.
40  *
41  * Revision 1.8  1995/03/17  10:17:43  quinn
42  * Added memory management.
43  *
44  * Revision 1.7  1995/03/10  11:44:41  quinn
45  * Fixed serious stack-bug in odr_cons_begin
46  *
47  * Revision 1.6  1995/03/08  12:12:15  quinn
48  * Added better error checking.
49  *
50  * Revision 1.5  1995/03/07  13:28:57  quinn
51  * *** empty log message ***
52  *
53  * Revision 1.4  1995/03/07  13:16:13  quinn
54  * Fixed bug in odr_reset
55  *
56  * Revision 1.3  1995/03/07  10:21:31  quinn
57  * odr_errno-->odr_error
58  *
59  * Revision 1.2  1995/03/07  10:19:05  quinn
60  * Addded some method functions to the ODR type.
61  *
62  * Revision 1.1  1995/03/07  09:23:15  quinn
63  * Installing top-level API and documentation.
64  *
65  *
66  */
67
68 #include <stdio.h>
69 #include <stdlib.h>
70
71 #include <xmalloc.h>
72 #include <odr.h>
73
74 Odr_null *ODR_NULLVAL = "NULL";  /* the presence of a null value */
75
76 char *odr_errlist[] =
77 {
78     "No (unknown) error",
79     "Memory allocation failed",
80     "System error",
81     "No space in buffer",
82     "Required data element missing",
83     "Unexpected tag",
84     "Other error",
85     "Protocol error",
86     "Malformed data",
87     "Stack overflow",
88     "Length of constructed type different from sum of members"
89 };
90
91 char *odr_errmsg(int n)
92 {
93     return odr_errlist[n];
94 }
95
96 void odr_perror(ODR o, char *message)
97 {
98     fprintf(stderr, "%s: %s\n", message, odr_errlist[o->error]);
99 }
100
101 int odr_geterror(ODR o)
102 {
103     return o->error;
104 }
105
106 void odr_setprint(ODR o, FILE *file)
107 {
108     o->print = file;
109 }
110
111 ODR odr_createmem(int direction)
112 {
113     struct odr *r;
114
115     if (!(r = xmalloc(sizeof(*r))))
116         return 0;
117     r->direction = direction;
118     r->print = stderr;
119     r->buf = 0;
120     r->ecb.buf = 0;
121     r->ecb.size = r->ecb.pos = r->ecb.top = 0;
122     r->ecb.can_grow = 1;
123     r->buflen = 0;
124     r->mem = 0;
125     odr_reset(r);
126     return r;
127 }
128
129 void odr_reset(ODR o)
130 {
131     o->error = ONONE;
132     o->bp = o->buf;
133     odr_seek(o, ODR_S_SET, 0);
134     o->ecb.top = 0;
135     o->left = o->buflen;
136     o->t_class = -1;
137     o->t_tag = -1;
138     o->indent = 0;
139     o->stackp = -1;
140     odr_release_mem(o->mem);
141     o->mem = 0;
142     o->choice_bias = -1;
143 }
144     
145 void odr_destroy(ODR o)
146 {
147     odr_release_mem(o->mem);
148     if (o->ecb.buf && o->ecb.can_grow)
149        xfree(o->ecb.buf);
150     if (o->print != stderr)
151         fclose(o->print);
152    xfree(o);
153 }
154
155 void odr_setbuf(ODR o, char *buf, int len, int can_grow)
156 {
157     o->buf = o->bp = (unsigned char *) buf;
158     o->buflen = o->left = len;
159
160     o->ecb.buf = (unsigned char *) buf;
161     o->ecb.can_grow = can_grow;
162     o->ecb.top = o->ecb.pos = 0;
163     o->ecb.size = len;
164 }
165
166 char *odr_getbuf(ODR o, int *len, int *size)
167 {
168     *len = o->ecb.top;
169     if (size)
170         *size = o->ecb.size;
171     return (char*) o->ecb.buf;
172 }