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