24b15b352cf3808996a0e92578113d1d743ac697
[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.8  1995-03-17 10:17:43  quinn
8  * Added memory management.
9  *
10  * Revision 1.7  1995/03/10  11:44:41  quinn
11  * Fixed serious stack-bug in odr_cons_begin
12  *
13  * Revision 1.6  1995/03/08  12:12:15  quinn
14  * Added better error checking.
15  *
16  * Revision 1.5  1995/03/07  13:28:57  quinn
17  * *** empty log message ***
18  *
19  * Revision 1.4  1995/03/07  13:16:13  quinn
20  * Fixed bug in odr_reset
21  *
22  * Revision 1.3  1995/03/07  10:21:31  quinn
23  * odr_errno-->odr_error
24  *
25  * Revision 1.2  1995/03/07  10:19:05  quinn
26  * Addded some method functions to the ODR type.
27  *
28  * Revision 1.1  1995/03/07  09:23:15  quinn
29  * Installing top-level API and documentation.
30  *
31  *
32  */
33
34 #include <stdio.h>
35 #include <stdlib.h>
36
37 #include <odr.h>
38
39 char *odr_errlist[] =
40 {
41     "No (unknown) error",
42     "Memory allocation failed",
43     "System error",
44     "No space in buffer",
45     "Required data element missing",
46     "Unexpected tag",
47     "Other error",
48     "Protocol error",
49     "Malformed data",
50     "Stack overflow"
51 };
52
53 void odr_perror(ODR o, char *message)
54 {
55     fprintf(stderr, "%s: %s\n", message, odr_errlist[o->error]);
56 }
57
58 int odr_geterror(ODR o)
59 {
60     return o->error;
61 }
62
63 void odr_setprint(ODR o, FILE *file)
64 {
65     o->print = file;
66 }
67
68 ODR odr_createmem(int direction)
69 {
70     struct odr *r;
71
72     if (!(r = malloc(sizeof(*r))))
73         return 0;
74     r->direction = direction;
75     r->print = stdout;
76     r->buf = 0;
77     r->buflen = 0;
78     r->mem = 0;
79     odr_reset(r);
80     return r;
81 }
82
83 void odr_reset(ODR o)
84 {
85     o->error = ONONE;
86     o->bp = o->buf;
87     o->left = o->buflen;
88     o->t_class = -1;
89     o->t_tag = -1;
90     o->indent = 0;
91     o->stackp = -1;
92     odr_release_mem(o->mem);
93     o->mem = 0;
94 }
95     
96 void odr_destroy(ODR o)
97 {
98     odr_release_mem(o->mem);
99     free(o);
100 }
101
102 void odr_setbuf(ODR o, char *buf, int len)
103 {
104     o->buf = o->bp = (unsigned char *) buf;
105     o->buflen = o->left = len;
106 }
107
108 char *odr_getbuf(ODR o, int *len)
109 {
110     *len = o->bp - o->buf;
111     return (char *) o->buf;
112 }