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