YAZ 5.37.0
zoom-opt.c
Go to the documentation of this file.
1/* This file is part of the YAZ toolkit.
2 * Copyright (C) Index Data
3 * See the file LICENSE for details.
4 */
9#if HAVE_CONFIG_H
10#include <config.h>
11#endif
12
13#include <assert.h>
14#include "zoom-p.h"
15
16#include <yaz/xmalloc.h>
17#include <yaz/snprintf.h>
18
20 char *name;
21 char *value;
22 int len; /* of `value', which may contain NULs */
24};
25
34
35static void set_value(struct ZOOM_options_entry **e,
36 const char *value, int len)
37{
38 (*e)->value = 0;
39 (*e)->len = 0;
40 if (value)
41 {
42 (*e)->value = (char *) xmalloc(len+1);
43 memcpy((*e)->value, value, len);
44 (*e)->value[len] = '\0';
45 (*e)->len = len;
46 }
47}
48
49static void append_entry(struct ZOOM_options_entry **e,
50 const char *name, const char *value, int len)
51{
52 *e = (struct ZOOM_options_entry *) xmalloc(sizeof(**e));
53 (*e)->name = xstrdup(name);
54 set_value(e, value, len);
55 (*e)->next = 0;
56}
57
60{
61 if (!src)
62 return 0;
63 else
64 {
66 struct ZOOM_options_entry *src_e = src->entries;
67 struct ZOOM_options_entry **dst_e = &dst->entries;
68
69 while(src_e)
70 {
71 append_entry(dst_e, src_e->name, src_e->value, src_e->len);
72 dst_e = &(*dst_e)->next;
73 src_e = src_e->next;
74 }
75 dst->parent1 = ZOOM_options_dup(src->parent1);
76 dst->parent2 = ZOOM_options_dup(src->parent2);
77 return dst;
78 }
79}
80
86
92
93
96 ZOOM_options parent2)
97{
99
100 opt->refcount = 1;
101 opt->callback_func = 0;
102 opt->callback_handle = 0;
103 opt->entries = 0;
104 opt->parent1= parent1;
105 if (parent1)
106 (parent1->refcount)++;
107 opt->parent2= parent2;
108 if (parent2)
109 (parent2->refcount)++;
110 return opt;
111}
112
113
115{
116 (opt->refcount)++;
117}
118
122 ZOOM_options_callback callback_func,
123 void *callback_handle)
124{
125 ZOOM_options_callback callback_old;
126
127 assert(opt);
128 callback_old = opt->callback_func;
129 opt->callback_func = callback_func;
130 opt->callback_handle = callback_handle;
131 return callback_old;
132}
133
134ZOOM_API(void)
136{
137 if (!opt)
138 return;
139 (opt->refcount)--;
140 if (opt->refcount == 0)
141 {
142 struct ZOOM_options_entry *e;
143
144 ZOOM_options_destroy(opt->parent1);
145 ZOOM_options_destroy(opt->parent2);
146 e = opt->entries;
147 while (e)
148 {
149 struct ZOOM_options_entry *e0 = e;
150 xfree(e->name);
151 xfree(e->value);
152 e = e->next;
153 xfree(e0);
154 }
155 xfree(opt);
156 }
157}
158
159
160ZOOM_API(void)
161 ZOOM_options_setl(ZOOM_options opt, const char *name, const char *value,
162 int len)
163{
164 struct ZOOM_options_entry **e;
165
166 e = &opt->entries;
167 while (*e)
168 {
169 if (!strcmp((*e)->name, name))
170 {
171 xfree((*e)->value);
172 set_value(e, value, len);
173 return;
174 }
175 e = &(*e)->next;
176 }
178}
179
180ZOOM_API(void)
181 ZOOM_options_set(ZOOM_options opt, const char *name, const char *value)
182{
183 ZOOM_options_setl(opt, name, value, value ? strlen(value): 0);
184}
185
186ZOOM_API(const char *)
187 ZOOM_options_getl(ZOOM_options opt, const char *name, int *lenp)
188{
189 const char *v = 0;
190 if (!opt)
191 return 0;
192 if (opt->callback_func)
193 {
194 v = (*opt->callback_func)(opt->callback_handle, name);
195 if (v)
196 *lenp = strlen(v);
197 }
198 if (!v)
199 {
200 struct ZOOM_options_entry *e;
201 for (e = opt->entries; e; e = e->next)
202 if (!strcmp(e->name, name))
203 {
204 v = e->value;
205 *lenp = e->len;
206 break;
207 }
208 }
209 if (!v)
210 v = ZOOM_options_getl(opt->parent1, name, lenp);
211 if (!v)
212 v = ZOOM_options_getl(opt->parent2, name, lenp);
213 return v;
214}
215
216ZOOM_API(const char *)
218{
219 int dummy;
220 return ZOOM_options_getl(opt, name, &dummy);
221}
222
223ZOOM_API(int)
225{
226 const char *v = ZOOM_options_get(opt, name);
227
228 if (!v)
229 return defa;
230 if (!strcmp(v, "1") || !strcmp(v, "T"))
231 return 1;
232 return 0;
233}
234
235ZOOM_API(int)
237{
238 const char *v = ZOOM_options_get(opt, name);
239
240 if (!v || !*v)
241 return defa;
242 return atoi(v);
243}
244
245ZOOM_API(void)
247{
248 char s[40];
249
250 yaz_snprintf(s, sizeof(s), "%d", value);
252}
253/*
254 * Local variables:
255 * c-basic-offset: 4
256 * c-file-style: "Stroustrup"
257 * indent-tabs-mode: nil
258 * End:
259 * vim: shiftwidth=4 tabstop=8 expandtab
260 */
261
int opt
Definition initopt.c:19
char * name
Definition initopt.c:18
void yaz_snprintf(char *buf, size_t size, const char *fmt,...)
Definition snprintf.c:31
Header for config file reading utilities.
Definition zoom-opt.c:19
char * value
Definition zoom-opt.c:21
char * name
Definition zoom-opt.c:20
int len
Definition zoom-opt.c:22
struct ZOOM_options_entry * next
Definition zoom-opt.c:23
ZOOM_options_callback callback_func
Definition zoom-opt.c:29
struct ZOOM_options_entry * entries
Definition zoom-opt.c:30
ZOOM_options parent1
Definition zoom-opt.c:31
void * callback_handle
Definition zoom-opt.c:28
ZOOM_options parent2
Definition zoom-opt.c:32
Header for memory handling functions.
#define xstrdup(s)
utility macro which calls xstrdup_f
Definition xmalloc.h:55
#define xfree(x)
utility macro which calls xfree_f
Definition xmalloc.h:53
#define xmalloc(x)
utility macro which calls malloc_f
Definition xmalloc.h:49
ZOOM_options_create(void)
Definition zoom-opt.c:88
ZOOM_options_getl(ZOOM_options opt, const char *name, int *lenp)
Definition zoom-opt.c:187
ZOOM_options_create_with_parent(ZOOM_options parent)
Definition zoom-opt.c:82
ZOOM_options_create_with_parent2(ZOOM_options parent1, ZOOM_options parent2)
Definition zoom-opt.c:95
ZOOM_options_set(ZOOM_options opt, const char *name, const char *value)
Definition zoom-opt.c:181
void ZOOM_options_addref(ZOOM_options opt)
Definition zoom-opt.c:114
static void set_value(struct ZOOM_options_entry **e, const char *value, int len)
Definition zoom-opt.c:35
ZOOM_options_setl(ZOOM_options opt, const char *name, const char *value, int len)
Definition zoom-opt.c:161
ZOOM_options_get(ZOOM_options opt, const char *name)
Definition zoom-opt.c:217
ZOOM_options_dup(ZOOM_options src)
Definition zoom-opt.c:59
static void append_entry(struct ZOOM_options_entry **e, const char *name, const char *value, int len)
Definition zoom-opt.c:49
Internal header for ZOOM implementation.
ZOOM_options_destroy(ZOOM_options opt)
Definition zoom-opt.c:135
ZOOM_options_create(void)
Definition zoom-opt.c:88
ZOOM_options_set_callback(ZOOM_options opt, ZOOM_options_callback c, void *handle)
Definition zoom-opt.c:120
ZOOM_options_getl(ZOOM_options opt, const char *name, int *lenp)
Definition zoom-opt.c:187
ZOOM_options_create_with_parent(ZOOM_options parent)
Definition zoom-opt.c:82
typedefZOOM_BEGIN_CDECL struct ZOOM_options_p * ZOOM_options
Definition zoom.h:50
ZOOM_options_get_int(ZOOM_options opt, const char *name, int defa)
Definition zoom-opt.c:236
ZOOM_options_create_with_parent2(ZOOM_options parent1, ZOOM_options parent2)
Definition zoom-opt.c:95
ZOOM_options_set(ZOOM_options opt, const char *name, const char *v)
Definition zoom-opt.c:181
const char *(* ZOOM_options_callback)(void *handle, const char *name)
Definition zoom.h:59
ZOOM_options_set_int(ZOOM_options opt, const char *name, int value)
Definition zoom-opt.c:246
ZOOM_options_setl(ZOOM_options opt, const char *name, const char *value, int len)
Definition zoom-opt.c:161
ZOOM_options_get(ZOOM_options opt, const char *name)
Definition zoom-opt.c:217
ZOOM_options_dup(ZOOM_options src)
Definition zoom-opt.c:59
#define ZOOM_API(x)
Definition zoom.h:42
ZOOM_options_get_bool(ZOOM_options opt, const char *name, int defa)
Definition zoom-opt.c:224