+Res res_open (const char *name, Res def_res)
+{
+ Res r;
+
+ if (name)
+ {
+#ifdef WIN32
+ if (access (name, 4))
+#else
+ if (access (name, R_OK))
+#endif
+ {
+ logf (LOG_WARN|LOG_ERRNO, "Cannot open `%s'", name);
+ return 0;
+ }
+ }
+ r = (Res) xmalloc (sizeof(*r));
+ r->init = 0;
+ r->first = r->last = NULL;
+ if (name)
+ r->name = xstrdup (name);
+ else
+ r->name=0;
+ r->def_res = def_res;
+ return r;
+}
+
+void res_close (Res r)
+{
+ if (!r)
+ return;
+ if (r->init)
+ {
+ struct res_entry *re, *re1;
+ for (re = r->first; re; re=re1)
+ {
+ if (re->name)
+ xfree (re->name);
+ if (re->value)
+ xfree (re->value);
+ re1 = re->next;
+ xfree (re);
+ }
+ }
+ xfree (r->name);
+ xfree (r);
+}
+
+char *res_get (Res r, const char *name)
+{
+ struct res_entry *re;
+
+ if (!r)
+ return 0;
+ if (!r->init)
+ reread (r);
+ for (re = r->first; re; re=re->next)
+ if (re->value && !yaz_matchstr (re->name, name))
+ return re->value;
+
+ return res_get (r->def_res, name);
+}
+
+char *res_get_def (Res r, const char *name, char *def)
+{
+ char *t;
+
+ if (!(t = res_get (r, name)))
+ {
+ logf (LOG_DEBUG, "CAUTION: Using default resource %s:%s", name, def);
+ return def;
+ }
+ else
+ return t;
+}