2169842fd4451437a8df0f6d0e3df2bb03a7966c
[yaz-moved-to-github.git] / odr / ber_oct.c
1 /*
2  * Copyright (C) 1994, Index Data I/S 
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: ber_oct.c,v $
7  * Revision 1.5  1995-03-08 12:12:10  quinn
8  * Added better error checking.
9  *
10  * Revision 1.4  1995/02/10  15:55:28  quinn
11  * Bug fixes, mostly.
12  *
13  * Revision 1.3  1995/02/03  17:04:34  quinn
14  * *** empty log message ***
15  *
16  * Revision 1.2  1995/02/02  20:38:50  quinn
17  * Updates.
18  *
19  * Revision 1.1  1995/02/02  16:21:52  quinn
20  * First kick.
21  *
22  */
23
24 #include <odr.h>
25
26 int ber_octetstring(ODR o, Odr_oct *p, int cons)
27 {
28     int res, len;
29     unsigned char *base, *c;
30
31     switch (o->direction)
32     {
33         case ODR_DECODE:
34             if ((res = ber_declen(o->bp, &len)) < 0)
35             {
36                 o->error = OPROTO;
37                 return 0;
38             }
39             o->bp += res;
40             o->left -= res;
41             if (cons)       /* fetch component strings */
42             {
43                 base = o->bp;
44                 while (odp_more_chunks(o, base, len))
45                     if (!odr_octetstring(o, &p, 0))
46                         return 0;
47                 return 1;
48             }
49             /* primitive octetstring */
50             if (len < 0)
51             {
52                 o->error = OOTHER;
53                 return 0;
54             }
55             if (len + 1 > p->size - p->len)
56             {
57                 c = nalloc(o, p->size += len + 1);
58                 if (p->len)
59                     memcpy(c, p->buf, p->len);
60                 p->buf = c;
61             }
62             if (len)
63                 memcpy(p->buf + p->len, o->bp, len);
64             p->len += len;
65             o->bp += len;
66             o->left -= len;
67             return 1;
68         case ODR_ENCODE:
69             if ((res = ber_enclen(o->bp, p->len, 5, 0)) < 0)
70             {
71                 o->error = OOTHER;
72                 return 0;
73             }
74             o->bp += res;
75             o->left -= res;
76             if (p->len == 0)
77                 return 1;
78             if (p->len > o->left)
79             {
80                 o->error = OSPACE;
81                 return 0;
82             }
83             memcpy(o->bp, p->buf, p->len);
84             o->bp += p->len;
85             o->left -= p->len;
86             return 1;
87         case ODR_PRINT: return 1;
88         default: o->error = OOTHER; return 0;
89     }
90 }