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