X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fres.c;h=5e4a73073d14a363e3a5cc226d5ebcdb4baed8b6;hb=ae5c8868f2bee81cebddf3251432eb47c3da3591;hp=7b304544d23292bfe99ce79af59f18e845821d1d;hpb=afbef0c68dc14c3c81b7f83dfd5f296bfcaefa59;p=idzebra-moved-to-github.git diff --git a/util/res.c b/util/res.c index 7b30454..5e4a730 100644 --- a/util/res.c +++ b/util/res.c @@ -1,4 +1,4 @@ -/* $Id: res.c,v 1.52 2006-12-05 09:24:31 adam Exp $ +/* $Id: res.c,v 1.54 2006-12-06 10:26:40 adam Exp $ Copyright (C) 1995-2006 Index Data ApS @@ -554,6 +554,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