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