+ fclose(fr);
+ return ZEBRA_OK;
+}
+
+ZEBRA_RES res_get_int(Res r, const char *name, int *val)
+{
+ const char *cp = res_get(r, name);
+ if (cp)
+ {
+ if (sscanf(cp, "%d", val) == 1)
+ return ZEBRA_OK;
+ yaz_log(YLOG_WARN, "Expected integer for resource %s", name);
+ }
+ return ZEBRA_FAIL;
+}
+
+/* == pop ================================================================= */
+Res res_add_over (Res p, Res t)
+{
+ if ((!p) || (!t))
+ return (0);
+
+ while (p->over_res)
+ p = p->over_res;
+
+ p->over_res = t;
+ return (p);
+}
+
+void res_remove_over (Res r)
+{
+ if (!r)
+ return;
+ r->over_res = 0;
+}
+
+void res_close_over (Res r)
+{
+ if (!r)
+ return;
+ if (r->over_res)
+ res_close(r->over_res);
+ r->over_res = 0;
+}
+
+void res_add (Res r, const char *name, const char *value)
+{
+ struct res_entry *re;
+ assert(r);
+ assert(name);
+ assert(value);
+ yaz_log (YLOG_RES, "res_add res=%p, name=%s, value=%s", r, name, value);
+ re = add_entry (r);
+ re->name = xstrdup (name);
+ re->value = xstrdup_env (value);