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