+ char *t;
+
+ if (!(t = res_get (r, name)))
+ {
+ logf (LOG_DEBUG, "CAUTION: Using default resource %s:%s", name, def);
+ return def;
+ }
+ else
+ return t;
+}
+
+void res_put (Res r, const char *name, const char *value)
+{
+ struct res_entry *re;
+ assert (r);
+ if (!r->init)
+ reread (r);
+
+ for (re = r->first; re; re=re->next)
+ if (re->value && !strcmp (re->name, name))
+ {
+ xfree (re->value);
+ re->value = xstrdup (value);
+ return;
+ }
+ re = add_entry (r);
+ re->name = xstrdup (name);
+ re->value = xstrdup (value);
+}
+
+void res_trav (Res r, const char *prefix,
+ void (*f)(const char *name, const char *value))
+{
+ struct res_entry *re;
+ int l = 0;
+
+ assert (r);
+ 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)(re->name, re->value);
+}
+
+
+int res_write (Res r)
+{
+ struct res_entry *re;
+ char path[256];
+ FILE *fr;
+
+ assert (r);
+ if (!r->init)
+ reread (r);
+ strcpy (path, alex_path(r->name));
+
+ fr = fopen (path, "w");
+ if (!fr)
+ {
+ logf (LOG_FATAL|LOG_ERRNO, "Cannot create %s", path);
+ 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);