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