1 /* This file is part of the YAZ toolkit.
2 * Copyright (C) Index Data
3 * See the file LICENSE for details.
4 */
5 /**
6 * \file odr_util.c
7 * \brief Implements various ODR utilities
8 */
9 #if HAVE_CONFIG_H
10 #include <config.h>
11 #endif
12
13 #include <stdlib.h>
14 #include <string.h>
15 #include "odr-priv.h"
16 #include <yaz/oid_util.h>
17
odr_prname(ODR o,const char * name)18 void odr_prname(ODR o, const char *name)
19 {
20 if (o->op->indent < 16)
21 odr_printf(o, "%*s", o->op->indent * 2, "");
22 else
23 odr_printf(o, "level=%-7d%*s", o->op->indent,
24 2 * (o->op->indent % 8) , "");
25 if (name)
26 odr_printf(o, "%s ", name);
27 }
28
odp_more_chunks(ODR o,const char * base,int len)29 int odp_more_chunks(ODR o, const char *base, int len)
30 {
31 if (!len)
32 return 0;
33 if (len < 0) /* indefinite length */
34 {
35 if (*o->op->bp == 0 && *(o->op->bp + 1) == 0)
36 {
37 o->op->bp += 2;
38 return 0;
39 }
40 else
41 return 1;
42 }
43 else
44 return o->op->bp - base < len;
45 }
46
odr_oiddup_nmem(NMEM nmem,const Odr_oid * o)47 Odr_oid *odr_oiddup_nmem(NMEM nmem, const Odr_oid *o)
48 {
49 Odr_oid *r;
50
51 if (!o)
52 return 0;
53 if (!(r = (Odr_oid *)
54 nmem_malloc(nmem, (oid_oidlen(o) + 1) * sizeof(Odr_oid))))
55 return 0;
56 oid_oidcpy(r, o);
57 return r;
58 }
59
odr_oiddup(ODR odr,const Odr_oid * o)60 Odr_oid *odr_oiddup(ODR odr, const Odr_oid *o)
61 {
62 return odr_oiddup_nmem(odr_getmem(odr), o);
63 }
64
odr_getoidbystr_nmem(NMEM nmem,const char * str)65 Odr_oid *odr_getoidbystr_nmem(NMEM nmem, const char *str)
66 {
67 Odr_oid oid[OID_SIZE];
68 Odr_oid *ret;
69
70 if (oid_dotstring_to_oid(str, oid))
71 return 0;
72 ret = (Odr_oid *)nmem_malloc(nmem, sizeof(*ret)*(oid_oidlen(oid) + 1));
73 oid_oidcpy(ret, oid);
74 return ret;
75 }
76
odr_getoidbystr(ODR o,const char * str)77 Odr_oid *odr_getoidbystr(ODR o, const char *str)
78 {
79 return odr_getoidbystr_nmem(odr_getmem(o), str);
80 }
81
odr_missing(ODR o,int opt,const char * name)82 int odr_missing(ODR o, int opt, const char *name)
83 {
84 if (o->error)
85 return 0;
86 if (!opt)
87 {
88 odr_seterror(o, OREQUIRED, 53);
89 odr_setelement(o, name);
90 }
91 return opt;
92 }
93
94 /*
95 * Reallocate the buffer `old', using the ODR memory pool `o' to be
96 * big enough to hold its existing value (if any) plus `prefix' (if
97 * any) and a separator character. Copy `prefix', a forward slash and
98 * the old value into the new area and return its address. Can be
99 * used as follows:
100 * initRequest->implementationName = odr_prepend(o,
101 * initRequest->implementationName, "ZOOM-C");
102 */
odr_prepend(ODR o,const char * prefix,const char * old)103 char *odr_prepend(ODR o, const char *prefix, const char *old)
104 {
105 int plen = (prefix == 0) ? 0 : strlen(prefix);
106 int olen = (old == 0) ? 0 : strlen(old);
107 char *res = (char*) odr_malloc (o, olen + plen + 2);
108
109 *res = '\0';
110 if (plen > 0)
111 strcpy(res, prefix);
112 if (plen > 0 && old != 0)
113 strcat(res, "/");
114 if (old != 0)
115 strcat(res, old);
116 return res;
117 }
118 /*
119 * Local variables:
120 * c-basic-offset: 4
121 * c-file-style: "Stroustrup"
122 * indent-tabs-mode: nil
123 * End:
124 * vim: shiftwidth=4 tabstop=8 expandtab
125 */
126
127