X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-opt.c;h=48c0da796e510a3b167efdf3fb1b2382199e18a4;hp=631f467c1494f0eb094a8a487188c3c0bf34449f;hb=d7cba4993e5c7c06c655d9a1d903f889fdee8329;hpb=3ca2b225d05541f30950ed1d6a0da315d7832bed diff --git a/src/zoom-opt.c b/src/zoom-opt.c index 631f467..48c0da7 100644 --- a/src/zoom-opt.c +++ b/src/zoom-opt.c @@ -1,18 +1,82 @@ -/* - * Copyright (C) 1995-2007, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) Index Data * See the file LICENSE for details. - * - * $Id: zoom-opt.c,v 1.7 2007-05-04 17:16:21 adam Exp $ */ /** * \file zoom-opt.c * \brief Implements ZOOM options handling */ +#if HAVE_CONFIG_H +#include +#endif + #include #include "zoom-p.h" #include +struct ZOOM_options_entry { + char *name; + char *value; + int len; /* of `value', which may contain NULs */ + struct ZOOM_options_entry *next; +}; + +struct ZOOM_options_p { + int refcount; + void *callback_handle; + ZOOM_options_callback callback_func; + struct ZOOM_options_entry *entries; + ZOOM_options parent1; + ZOOM_options parent2; +}; + +static void set_value(struct ZOOM_options_entry **e, + const char *value, int len) +{ + (*e)->value = 0; + (*e)->len = 0; + if (value) + { + (*e)->value = (char *) xmalloc(len+1); + memcpy((*e)->value, value, len); + (*e)->value[len] = '\0'; + (*e)->len = len; + } +} + +static void append_entry(struct ZOOM_options_entry **e, + const char *name, const char *value, int len) +{ + *e = (struct ZOOM_options_entry *) xmalloc(sizeof(**e)); + (*e)->name = xstrdup(name); + set_value(e, value, len); + (*e)->next = 0; +} + +ZOOM_API(ZOOM_options) + ZOOM_options_dup(ZOOM_options src) +{ + if (!src) + return 0; + else + { + ZOOM_options dst = ZOOM_options_create(); + struct ZOOM_options_entry *src_e = src->entries; + struct ZOOM_options_entry **dst_e = &dst->entries; + + while(src_e) + { + append_entry(dst_e, src_e->name, src_e->value, src_e->len); + dst_e = &(*dst_e)->next; + src_e = src_e->next; + } + dst->parent1 = ZOOM_options_dup(src->parent1); + dst->parent2 = ZOOM_options_dup(src->parent2); + return dst; + } +} + ZOOM_API(ZOOM_options) ZOOM_options_create_with_parent(ZOOM_options parent) { @@ -58,7 +122,7 @@ ZOOM_API(ZOOM_options_callback) void *callback_handle) { ZOOM_options_callback callback_old; - + assert(opt); callback_old = opt->callback_func; opt->callback_func = callback_func; @@ -75,7 +139,7 @@ ZOOM_API(void) if (opt->refcount == 0) { struct ZOOM_options_entry *e; - + ZOOM_options_destroy(opt->parent1); ZOOM_options_destroy(opt->parent2); e = opt->entries; @@ -91,20 +155,6 @@ ZOOM_API(void) } } -/* PRIVATE to ZOOM_options_setl() */ -static void -_set_value(struct ZOOM_options_entry **e, const char *value, int len) -{ - (*e)->value = 0; - (*e)->len = 0; - if (value) - { - (*e)->value = (char *) xmalloc(len+1); - memcpy((*e)->value, value, len); - (*e)->value[len] = '\0'; - (*e)->len = len; - } -} ZOOM_API(void) ZOOM_options_setl(ZOOM_options opt, const char *name, const char *value, @@ -118,15 +168,12 @@ ZOOM_API(void) if (!strcmp((*e)->name, name)) { xfree((*e)->value); - _set_value(e, value, len); + set_value(e, value, len); return; } e = &(*e)->next; } - *e = (struct ZOOM_options_entry *) xmalloc(sizeof(**e)); - (*e)->name = xstrdup(name); - _set_value(e, value, len); - (*e)->next = 0; + append_entry(e, name, value, len); } ZOOM_API(void) @@ -142,7 +189,11 @@ ZOOM_API(const char *) if (!opt) return 0; if (opt->callback_func) + { v = (*opt->callback_func)(opt->callback_handle, name); + if (v) + *lenp = strlen(v); + } if (!v) { struct ZOOM_options_entry *e; @@ -172,7 +223,7 @@ ZOOM_API(int) ZOOM_options_get_bool(ZOOM_options opt, const char *name, int defa) { const char *v = ZOOM_options_get(opt, name); - + if (!v) return defa; if (!strcmp(v, "1") || !strcmp(v, "T")) @@ -201,6 +252,7 @@ ZOOM_options_set_int(ZOOM_options opt, const char *name, int value) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab