YAZ 5.35.1
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
19 char *name;
20 char *value;
21 int len; /* of `value', which may contain NULs */
23};
24
33
34static void set_value(struct ZOOM_options_entry **e,
35 const char *value, int len)
36{
37 (*e)->value = 0;
38 (*e)->len = 0;
39 if (value)
40 {
41 (*e)->value = (char *) xmalloc(len+1);
42 memcpy((*e)->value, value, len);
43 (*e)->value[len] = '\0';
44 (*e)->len = len;
45 }
46}
47
48static void append_entry(struct ZOOM_options_entry **e,
49 const char *name, const char *value, int len)
50{
51 *e = (struct ZOOM_options_entry *) xmalloc(sizeof(**e));
52 (*e)->name = xstrdup(name);
53 set_value(e, value, len);
54 (*e)->next = 0;
55}
56
59{
60 if (!src)
61 return 0;
62 else
63 {
65 struct ZOOM_options_entry *src_e = src->entries;
66 struct ZOOM_options_entry **dst_e = &dst->entries;
67
68 while(src_e)
69 {
70 append_entry(dst_e, src_e->name, src_e->value, src_e->len);
71 dst_e = &(*dst_e)->next;
72 src_e = src_e->next;
73 }
74 dst->parent1 = ZOOM_options_dup(src->parent1);
75 dst->parent2 = ZOOM_options_dup(src->parent2);
76 return dst;
77 }
78}
79
85
91
92
95 ZOOM_options parent2)
96{
98
99 opt->refcount = 1;
100 opt->callback_func = 0;
101 opt->callback_handle = 0;
102 opt->entries = 0;
103 opt->parent1= parent1;
104 if (parent1)
105 (parent1->refcount)++;
106 opt->parent2= parent2;
107 if (parent2)
108 (parent2->refcount)++;
109 return opt;
110}
111
112
114{
115 (opt->refcount)++;
116}
117
121 ZOOM_options_callback callback_func,
122 void *callback_handle)
123{
124 ZOOM_options_callback callback_old;
125
126 assert(opt);
127 callback_old = opt->callback_func;
128 opt->callback_func = callback_func;
129 opt->callback_handle = callback_handle;
130 return callback_old;
131}
132
133ZOOM_API(void)
135{
136 if (!opt)
137 return;
138 (opt->refcount)--;
139 if (opt->refcount == 0)
140 {
141 struct ZOOM_options_entry *e;
142
143 ZOOM_options_destroy(opt->parent1);
144 ZOOM_options_destroy(opt->parent2);
145 e = opt->entries;
146 while (e)
147 {
148 struct ZOOM_options_entry *e0 = e;
149 xfree(e->name);
150 xfree(e->value);
151 e = e->next;
152 xfree(e0);
153 }
154 xfree(opt);
155 }
156}
157
158
159ZOOM_API(void)
160 ZOOM_options_setl(ZOOM_options opt, const char *name, const char *value,
161 int len)
162{
163 struct ZOOM_options_entry **e;
164
165 e = &opt->entries;
166 while (*e)
167 {
168 if (!strcmp((*e)->name, name))
169 {
170 xfree((*e)->value);
171 set_value(e, value, len);
172 return;
173 }
174 e = &(*e)->next;
175 }
177}
178
179ZOOM_API(void)
180 ZOOM_options_set(ZOOM_options opt, const char *name, const char *value)
181{
182 ZOOM_options_setl(opt, name, value, value ? strlen(value): 0);
183}
184
185ZOOM_API(const char *)
186 ZOOM_options_getl(ZOOM_options opt, const char *name, int *lenp)
187{
188 const char *v = 0;
189 if (!opt)
190 return 0;
191 if (opt->callback_func)
192 {
193 v = (*opt->callback_func)(opt->callback_handle, name);
194 if (v)
195 *lenp = strlen(v);
196 }
197 if (!v)
198 {
199 struct ZOOM_options_entry *e;
200 for (e = opt->entries; e; e = e->next)
201 if (!strcmp(e->name, name))
202 {
203 v = e->value;
204 *lenp = e->len;
205 break;
206 }
207 }
208 if (!v)
209 v = ZOOM_options_getl(opt->parent1, name, lenp);
210 if (!v)
211 v = ZOOM_options_getl(opt->parent2, name, lenp);
212 return v;
213}
214
215ZOOM_API(const char *)
217{
218 int dummy;
219 return ZOOM_options_getl(opt, name, &dummy);
220}
221
222ZOOM_API(int)
224{
225 const char *v = ZOOM_options_get(opt, name);
226
227 if (!v)
228 return defa;
229 if (!strcmp(v, "1") || !strcmp(v, "T"))
230 return 1;
231 return 0;
232}
233
234ZOOM_API(int)
236{
237 const char *v = ZOOM_options_get(opt, name);
238
239 if (!v || !*v)
240 return defa;
241 return atoi(v);
242}
243
244ZOOM_API(void)
246{
247 char s[40];
248
249 sprintf(s, "%d", value);
251}
252/*
253 * Local variables:
254 * c-basic-offset: 4
255 * c-file-style: "Stroustrup"
256 * indent-tabs-mode: nil
257 * End:
258 * vim: shiftwidth=4 tabstop=8 expandtab
259 */
260
int opt
Definition initopt.c:19
char * name
Definition initopt.c:18
Definition zoom-opt.c:18
char * value
Definition zoom-opt.c:20
char * name
Definition zoom-opt.c:19
int len
Definition zoom-opt.c:21
struct ZOOM_options_entry * next
Definition zoom-opt.c:22
ZOOM_options_callback callback_func
Definition zoom-opt.c:28
struct ZOOM_options_entry * entries
Definition zoom-opt.c:29
ZOOM_options parent1
Definition zoom-opt.c:30
void * callback_handle
Definition zoom-opt.c:27
ZOOM_options parent2
Definition zoom-opt.c:31
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_destroy(ZOOM_options opt)
Definition zoom-opt.c:134
ZOOM_options_create(void)
Definition zoom-opt.c:87
ZOOM_options_getl(ZOOM_options opt, const char *name, int *lenp)
Definition zoom-opt.c:186
ZOOM_options_create_with_parent(ZOOM_options parent)
Definition zoom-opt.c:81
ZOOM_options_get_int(ZOOM_options opt, const char *name, int defa)
Definition zoom-opt.c:235
ZOOM_options_create_with_parent2(ZOOM_options parent1, ZOOM_options parent2)
Definition zoom-opt.c:94
ZOOM_options_set(ZOOM_options opt, const char *name, const char *value)
Definition zoom-opt.c:180
void ZOOM_options_addref(ZOOM_options opt)
Definition zoom-opt.c:113
ZOOM_options_set_int(ZOOM_options opt, const char *name, int value)
Definition zoom-opt.c:245
static void set_value(struct ZOOM_options_entry **e, const char *value, int len)
Definition zoom-opt.c:34
ZOOM_options_setl(ZOOM_options opt, const char *name, const char *value, int len)
Definition zoom-opt.c:160
ZOOM_options_get(ZOOM_options opt, const char *name)
Definition zoom-opt.c:216
ZOOM_options_set_callback(ZOOM_options opt, ZOOM_options_callback callback_func, void *callback_handle)
Definition zoom-opt.c:119
ZOOM_options_dup(ZOOM_options src)
Definition zoom-opt.c:58
static void append_entry(struct ZOOM_options_entry **e, const char *name, const char *value, int len)
Definition zoom-opt.c:48
ZOOM_options_get_bool(ZOOM_options opt, const char *name, int defa)
Definition zoom-opt.c:223
Internal header for ZOOM implementation.
typedefZOOM_BEGIN_CDECL struct ZOOM_options_p * ZOOM_options
Definition zoom.h:50
const char *(* ZOOM_options_callback)(void *handle, const char *name)
Definition zoom.h:59
#define ZOOM_API(x)
Definition zoom.h:42