man pages
[yaz-moved-to-github.git] / zoom / zoom-opt.c
index ddb5a89..19d1e49 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: zoom-opt.c,v 1.1 2001-10-23 21:00:20 adam Exp $
+ * $Id: zoom-opt.c,v 1.7 2002-06-04 08:33:49 adam Exp $
  *
  * ZOOM layer for C, options handling
  */
@@ -9,36 +9,50 @@
 
 #include "zoom-p.h"
 
-Z3950_options Z3950_options_create (void)
+ZOOM_API(ZOOM_options)
+ZOOM_options_create_with_parent (ZOOM_options parent)
 {
-    return Z3950_options_create_with_parent (0);
+    return ZOOM_options_create_with_parent2(parent, 0);
 }
 
-Z3950_options Z3950_options_create_with_parent (Z3950_options parent)
+ZOOM_API(ZOOM_options)
+ZOOM_options_create (void)
 {
-    Z3950_options opt = xmalloc (sizeof(*opt));
+    return ZOOM_options_create_with_parent (0);
+}
+
+
+ZOOM_API(ZOOM_options)
+ZOOM_options_create_with_parent2 (ZOOM_options parent1, ZOOM_options parent2)
+{
+    ZOOM_options opt = (ZOOM_options) xmalloc (sizeof(*opt));
 
     opt->refcount = 1;
     opt->callback_func = 0;
     opt->callback_handle = 0;
     opt->entries = 0;
-    opt->parent= parent;
-    if (parent)
-       (parent->refcount)++;
+    opt->parent1= parent1;
+    if (parent1)
+       (parent1->refcount)++;
+    opt->parent2= parent2;
+    if (parent2)
+       (parent2->refcount)++;
     return opt;
 }
 
-void Z3950_options_addref (Z3950_options opt)
+
+void ZOOM_options_addref (ZOOM_options opt)
 {
     (opt->refcount)++;
 }
 
-Z3950_options_callback Z3950_options_set_callback (
-    Z3950_options opt,
-    Z3950_options_callback callback_func,
+ZOOM_API(ZOOM_options_callback)
+ZOOM_options_set_callback (
+    ZOOM_options opt,
+    ZOOM_options_callback callback_func,
     void *callback_handle)
 {
-    Z3950_options_callback callback_old;
+    ZOOM_options_callback callback_old;
 
     assert (opt);
     callback_old = opt->callback_func;
@@ -47,20 +61,22 @@ Z3950_options_callback Z3950_options_set_callback (
     return callback_old;
 }
 
-void Z3950_options_destroy (Z3950_options opt)
+ZOOM_API(void)
+ZOOM_options_destroy (ZOOM_options opt)
 {
     if (!opt)
        return;
     (opt->refcount)--;
     if (opt->refcount == 0)
     {
-       struct Z3950_options_entry *e;
+       struct ZOOM_options_entry *e;
        
-       Z3950_options_destroy (opt->parent);
+       ZOOM_options_destroy (opt->parent1);
+       ZOOM_options_destroy (opt->parent2);
        e = opt->entries;
        while (e)
        {
-           struct Z3950_options_entry *e0 = e;
+           struct ZOOM_options_entry *e0 = e;
            xfree (e->name);
            xfree (e->value);
            e = e->next;
@@ -70,9 +86,11 @@ void Z3950_options_destroy (Z3950_options opt)
     }
 }
 
-void Z3950_options_set (Z3950_options opt, const char *name, const char *value)
+ZOOM_API(void)
+ZOOM_options_setl (ZOOM_options opt, const char *name, const char *value,
+                   int len)
 {
-    struct Z3950_options_entry **e;
+    struct ZOOM_options_entry **e;
 
     e = &opt->entries;
     while (*e)
@@ -80,18 +98,37 @@ void Z3950_options_set (Z3950_options opt, const char *name, const char *value)
        if (!strcmp((*e)->name, name))
        {
            xfree ((*e)->value);
-           (*e)->value = xstrdup(value);
+            (*e)->value = 0;
+            if (value)
+            {
+                (*e)->value = xmalloc (len+1);
+                memcpy ((*e)->value, value, len);
+                (*e)->value[len] = '\0';
+            }
            return;
        }
        e = &(*e)->next;
     }
-    *e = xmalloc (sizeof(**e));
+    *e = (struct ZOOM_options_entry *) xmalloc (sizeof(**e));
     (*e)->name = xstrdup (name);
-    (*e)->value = xstrdup (value);
+    (*e)->value = 0;
+    if (value)
+    {
+        (*e)->value = xmalloc (len+1);
+        memcpy ((*e)->value, value, len);
+        (*e)->value[len] = '\0';
+    }
     (*e)->next = 0;
 }
 
-const char *Z3950_options_get (Z3950_options opt, const char *name)
+ZOOM_API(void)
+ZOOM_options_set (ZOOM_options opt, const char *name, const char *value)
+{
+    ZOOM_options_setl (opt, name, value, value ? strlen(value): 0);
+}
+
+ZOOM_API(const char *)
+ZOOM_options_get (ZOOM_options opt, const char *name)
 {
     const char *v = 0;
     if (!opt)
@@ -100,7 +137,7 @@ const char *Z3950_options_get (Z3950_options opt, const char *name)
        v = (*opt->callback_func)(opt->callback_handle, name);
     if (!v)
     {
-       struct Z3950_options_entry *e;
+       struct ZOOM_options_entry *e;
        for (e = opt->entries; e; e = e->next)
            if (!strcmp(e->name, name))
            {
@@ -109,13 +146,16 @@ const char *Z3950_options_get (Z3950_options opt, const char *name)
            }
     }
     if (!v)
-       return Z3950_options_get(opt->parent, name);
+       v = ZOOM_options_get(opt->parent1, name);
+    if (!v)
+       v = ZOOM_options_get(opt->parent2, name);
     return v;
 }
 
-int Z3950_options_get_bool (Z3950_options opt, const char *name, int defa)
+ZOOM_API(int)
+ZOOM_options_get_bool (ZOOM_options opt, const char *name, int defa)
 {
-    const char *v = Z3950_options_get (opt, name);
+    const char *v = ZOOM_options_get (opt, name);
 
     if (!v)
        return defa;
@@ -124,11 +164,21 @@ int Z3950_options_get_bool (Z3950_options opt, const char *name, int defa)
     return 0;
 }
 
-int Z3950_options_get_int (Z3950_options opt, const char *name, int defa)
+ZOOM_API(int)
+ZOOM_options_get_int (ZOOM_options opt, const char *name, int defa)
 {
-    const char *v = Z3950_options_get (opt, name);
+    const char *v = ZOOM_options_get (opt, name);
 
     if (!v || !*v)
        return defa;
     return atoi(v);
 }
+
+ZOOM_API(void)
+ZOOM_options_set_int(ZOOM_options opt, const char *name, int value)
+{
+    char s[40];
+
+    sprintf (s, "%d", value);
+    ZOOM_options_set (opt, name, s);
+}