2007.
[idzebra-moved-to-github.git] / util / res.c
index 7b30454..fda7330 100644 (file)
@@ -1,5 +1,5 @@
-/* $Id: res.c,v 1.52 2006-12-05 09:24:31 adam Exp $
-   Copyright (C) 1995-2006
+/* $Id: res.c,v 1.56 2007-01-15 15:10:26 adam Exp $
+   Copyright (C) 1995-2007
    Index Data ApS
 
 This file is part of the Zebra server.
@@ -344,6 +344,8 @@ void res_set(Res r, const char *name, const char *value)
     struct res_entry *re;
     assert(r);
 
+    if (!value)
+        return;
     for (re = r->first; re; re=re->next)
         if (re->value && !yaz_matchstr(re->name, name))
         {
@@ -554,6 +556,72 @@ void res_dump (Res r, int level)
        res_dump (r->over_res, level + 1);
     }
 }
+
+int res_check(Res r_i, Res r_v)
+{
+    struct res_entry *e_i;
+    int errors = 0;
+    
+    for (e_i = r_i->first; e_i; e_i = e_i->next)
+    {
+        struct res_entry *e_v;
+        for (e_v = r_v->first; e_v; e_v = e_v->next)
+        {
+            int prefix_allowed = 0;
+            int suffix_allowed = 0;
+            const char *name = e_i->name;
+            size_t name_len = strlen(e_i->name);
+            char namez[32];
+            const char *first_dot = 0;
+            const char *second_dot = 0;
+
+            if (strchr(e_v->value, 'p'))
+                prefix_allowed = 1;
+            if (strchr(e_v->value, 's'))
+                suffix_allowed = 1;
+            
+            first_dot = strchr(name, '.');
+            if (prefix_allowed && first_dot)
+            {
+                name = first_dot+1;
+                name_len = strlen(name);
+            }
+            second_dot = strchr(name, '.');
+            if (suffix_allowed && second_dot)
+            {
+                name_len = second_dot - name;
+            }
+            if (name_len < sizeof(namez)-1)
+            {
+                memcpy(namez, name, name_len);
+                namez[name_len] = '\0';
+                if (!yaz_matchstr(namez, e_v->name))
+                    break;
+            }
+            /* for case 'a.b' we have to check 'a' as well */
+            if (prefix_allowed && suffix_allowed && first_dot && !second_dot)
+            {
+                name = e_i->name;
+                name_len = first_dot - name;
+                if (name_len < sizeof(namez)-1)
+                {
+                    memcpy(namez, name, name_len);
+                    namez[name_len] = '\0';
+                    if (!yaz_matchstr(namez, e_v->name))
+                        break;
+                }
+            }
+        }
+        if (!e_v)
+        {
+            yaz_log(YLOG_WARN, "The following setting is unrecognized: %s",
+                    e_i->name);
+            errors++;
+        }
+    }
+    return errors;
+}
+
 /*
  * Local variables:
  * c-basic-offset: 4