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