X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fres.c;h=fda733055772c3b5db8e9630c79071d3ea6fcd59;hb=27a6d4f7f7425896345ab5a2bfdf35a96c97416e;hp=7b304544d23292bfe99ce79af59f18e845821d1d;hpb=afbef0c68dc14c3c81b7f83dfd5f296bfcaefa59;p=idzebra-moved-to-github.git diff --git a/util/res.c b/util/res.c index 7b30454..fda7330 100644 --- a/util/res.c +++ b/util/res.c @@ -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