Check for config.h (currently not generated).
[yaz-moved-to-github.git] / odr / odr_oct.c
1 /*
2  * Copyright (c) 1995-2000, Index Data
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: odr_oct.c,v $
7  * Revision 1.16  2000-02-29 13:44:55  adam
8  * Check for config.h (currently not generated).
9  *
10  * Revision 1.15  1999/11/30 13:47:11  adam
11  * Improved installation. Moved header files to include/yaz.
12  *
13  * Revision 1.14  1999/10/19 12:35:55  adam
14  * Better dump of OCTET STRING.
15  *
16  * Revision 1.13  1999/04/20 09:56:48  adam
17  * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
18  * Modified all encoders/decoders to reflect this change.
19  *
20  * Revision 1.12  1998/02/11 11:53:34  adam
21  * Changed code so that it compiles as C++.
22  *
23  * Revision 1.11  1995/09/29 17:12:25  quinn
24  * Smallish
25  *
26  * Revision 1.10  1995/09/27  15:02:59  quinn
27  * Modified function heads & prototypes.
28  *
29  * Revision 1.9  1995/05/16  08:50:56  quinn
30  * License, documentation, and memory fixes
31  *
32  * Revision 1.8  1995/03/17  10:17:54  quinn
33  * Added memory management.
34  *
35  * Revision 1.7  1995/03/08  12:12:27  quinn
36  * Added better error checking.
37  *
38  * Revision 1.6  1995/02/10  18:57:26  quinn
39  * More in the way of error-checking.
40  *
41  * Revision 1.5  1995/02/09  15:51:49  quinn
42  * Works better now.
43  *
44  * Revision 1.4  1995/02/07  14:13:46  quinn
45  * Bug fixes.
46  *
47  * Revision 1.3  1995/02/03  17:04:38  quinn
48  * *** empty log message ***
49  *
50  * Revision 1.2  1995/02/02  20:38:51  quinn
51  * Updates.
52  *
53  * Revision 1.1  1995/02/02  16:21:54  quinn
54  * First kick.
55  *
56  */
57 #if HAVE_CONFIG_H
58 #include <config.h>
59 #endif
60
61 #include <yaz/odr.h>
62
63 /*
64  * Top level octet string en/decoder.
65  * Returns 1 on success, 0 on error.
66  */
67 int odr_octetstring(ODR o, Odr_oct **p, int opt, const char *name)
68 {
69     int res, cons = 0;
70
71     if (o->error)
72         return 0;
73     if (o->t_class < 0)
74     {
75         o->t_class = ODR_UNIVERSAL;
76         o->t_tag = ODR_OCTETSTRING;
77     }
78     if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt)) < 0)
79         return 0;
80     if (!res)
81         return opt;
82     if (o->direction == ODR_PRINT)
83     {
84         int i;
85         odr_prname(o, name);
86         fprintf(o->print, "OCTETSTRING(len=%d)", (*p)->len);
87         for (i = 0; i<(*p)->len; i++)
88         {
89             if (i < 5 || i > ((*p)->len - 4))
90             {
91                 fprintf (o->print, " %02X", (*p)->buf[i]);
92             }
93             else if (i == 5)
94                 fprintf (o->print, " .. ");
95         }
96         fprintf(o->print, "\n");
97         return 1;
98     }
99     if (o->direction == ODR_DECODE)
100     {
101         *p = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct));
102         (*p)->size= 0;
103         (*p)->len = 0;
104         (*p)->buf = 0;
105     }
106     if (ber_octetstring(o, *p, cons))
107         return 1;
108     o->error = OOTHER;
109     return 0;
110 }
111
112 /*
113  * Friendlier interface to octetstring.
114  */
115 int odr_cstring(ODR o, char **p, int opt, const char *name)
116 {
117     int cons = 0, res;
118     Odr_oct *t;
119
120     if (o->error)
121         return 0;
122     if (o->t_class < 0)
123     {
124         o->t_class = ODR_UNIVERSAL;
125         o->t_tag = ODR_OCTETSTRING;
126     }
127     if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt)) < 0)
128         return 0;
129     if (!res)
130         return opt;
131     if (o->direction == ODR_PRINT)
132     {
133         odr_prname(o, name);
134         fprintf(o->print, "'%s'\n", *p);
135         return 1;
136     }
137     t = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct));   /* wrapper for octstring */
138     if (o->direction == ODR_ENCODE)
139     {
140         t->buf = (unsigned char *) *p;
141         t->size = t->len = strlen(*p);
142     }
143     else
144     {
145         t->size= 0;
146         t->len = 0;
147         t->buf = 0;
148     }
149     if (!ber_octetstring(o, t, cons))
150         return 0;
151     if (o->direction == ODR_DECODE)
152     {
153         *p = (char *) t->buf;
154         *(*p + t->len) = '\0';  /* ber_octs reserves space for this */
155     }
156     return 1;
157 }