Fix.
[yaz-moved-to-github.git] / odr / odr_util.c
1 /*
2  * Copyright (c) 1995-1997, Index Data
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: odr_util.c,v $
7  * Revision 1.13  1998-02-11 11:53:34  adam
8  * Changed code so that it compiles as C++.
9  *
10  * Revision 1.12  1997/10/31 12:20:08  adam
11  * Improved memory debugging for xmalloc/nmem.c. References to NMEM
12  * instead of ODR in n ESPEC-1 handling in source d1_espec.c.
13  * Bug fix: missing fclose in data1_read_espec1.
14  *
15  */
16
17 #include <stdlib.h>
18 #include <string.h>
19 #include <ctype.h>
20 #include <odr.h>
21 #include <oid.h>
22
23 char *odr_indent(ODR o)
24 {
25     static char buf[512];
26     int i = o->indent;
27
28     memset(buf, ' ', 512);
29     if (i >= 128)
30         i = 127;
31     buf[o->indent * 4] = 0;
32     return buf;
33 }
34
35 int odp_more_chunks(ODR o, unsigned char *base, int len)
36 {
37     if (!len)
38         return 0;
39     if (len < 0) /* indefinite length */
40     {
41         if (*o->bp == 0 && *(o->bp + 1) == 0)
42         {
43             o->bp += 2;
44             o->left -= 2;
45             return 0;
46         }
47         else
48             return 1;
49     }
50     else
51         return o->bp - base < len;
52 }
53
54 Odr_oid *odr_oiddup_nmem(NMEM nmem, Odr_oid *o)
55 {
56     Odr_oid *r;
57
58     if (!o)
59         return 0;
60     if (!(r = (int *)nmem_malloc(nmem, (oid_oidlen(o) + 1) * sizeof(int))))
61         return 0;
62     oid_oidcpy(r, o);
63     return r;
64 }
65
66 Odr_oid *odr_oiddup(ODR odr, Odr_oid *o)
67 {
68     return odr_oiddup_nmem (odr->mem, o);
69 }
70
71 Odr_oid *odr_getoidbystr_nmem(NMEM nmem, char *str)
72 {
73     int num = 1, i = 0;
74     char *p = str;
75     Odr_oid *ret;
76
77     if (!isdigit(*str))
78         return 0;
79     while ((p = strchr(p, '.')))
80         num++, p++;
81     ret = (int *)nmem_malloc(nmem, sizeof(*ret)*(num + 1));
82     p = str;
83     do
84         ret[i++] = atoi(p);
85     while ((p = strchr(p, '.')) && ++p);
86     ret[i] = -1;
87     return ret;
88 }
89
90 Odr_oid *odr_getoidbystr(ODR o, char *str)
91 {
92     return odr_getoidbystr_nmem (o->mem, str);
93 }
94