+int res_trav (Res r, const char *prefix, void *p,
+ void (*f)(void *p, const char *name, const char *value))
+{
+ struct res_entry *re;
+ int l = 0;
+ int no = 0;
+
+ if (!r)
+ return 0;
+ if (prefix)
+ l = strlen(prefix);
+ if (!r->init)
+ reread (r);
+ for (re = r->first; re; re=re->next)
+ if (re->value)
+ if (l==0 || !memcmp (re->name, prefix, l))
+ {
+ (*f)(p, re->name, re->value);
+ no++;
+ }
+ if (!no)
+ return res_trav (r->def_res, prefix, p, f);
+ return no;
+}
+
+
+int res_write (Res r)
+{
+ struct res_entry *re;
+ FILE *fr;
+
+ assert (r);
+ if (!r->init)
+ reread (r);
+ if (!r->name)
+ return 0; /* ok, this was not from a file */
+ fr = fopen (r->name, "w");
+ if (!fr)
+ {
+ yaz_log (YLOG_FATAL|YLOG_ERRNO, "Cannot create `%s'", r->name);
+ exit (1);
+ }
+
+ for (re = r->first; re; re=re->next)
+ {
+ int no = 0;
+ int lefts = strlen(re->name)+2;
+
+ if (!re->value)
+ fprintf (fr, "%s\n", re->name);
+ else
+ {
+ fprintf (fr, "%s: ", re->name);
+ while (lefts + strlen(re->value+no) > 78)
+ {
+ int i = 20;
+ int ind = no+ 78-lefts;
+ while (--i >= 0)
+ {
+ if (re->value[ind] == ' ')
+ break;
+ --ind;
+ }
+ if (i<0)
+ ind = no + 78 - lefts;
+ for (i = no; i != ind; i++)
+ putc (re->value[i], fr);
+ fprintf (fr, "\\\n");
+ no=ind;
+ lefts = 0;
+ }
+ fprintf (fr, "%s\n", re->value+no);
+ }
+ }
+ fclose (fr);
+ return 0;
+}