Development of resource manager. Only missing is res_write.
[idzebra-moved-to-github.git] / util / res.c
index 781aae6..a5c6c13 100644 (file)
@@ -4,7 +4,10 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: res.c,v $
- * Revision 1.2  1994-08-18 08:23:26  adam
+ * Revision 1.3  1994-08-18 09:43:51  adam
+ * Development of resource manager. Only missing is res_write.
+ *
+ * Revision 1.2  1994/08/18  08:23:26  adam
  * Res.c now use handles. xmalloc defines xstrdup.
  *
  * Revision 1.1  1994/08/17  15:34:23  adam
@@ -13,6 +16,7 @@
  */
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <util.h>
 
 const char *alex_path (const char *name)
@@ -49,7 +53,7 @@ static void reread (Res r)
     fr = fopen (path, "r");
     if (!fr)
     {
-        log (LOG_FATAL, "cannot open %s", path);
+        log (LOG_FATAL|LOG_ERRNO, "cannot open %s", path);
         exit (1);
     }
     while (1)
@@ -117,6 +121,8 @@ static void reread (Res r)
                     val_buf[val_size++] = '\0';
                     resp->value = xmalloc (val_size);
                     strcpy (resp->value, val_buf);
+                    log (LOG_DEBUG, "(name=%s,value=%s)",
+                         resp->name, resp->value);
                     break;
                 }
                 else if (fr_buf[no] == '\\' && fr_buf[no+1] == '\n')
@@ -131,7 +137,7 @@ static void reread (Res r)
                     no = 0;
                 }
                 else
-                    val_buf[val_size] = fr_buf[no++];
+                    val_buf[val_size++] = fr_buf[no++];
             }
         }
     }                
@@ -149,24 +155,77 @@ Res res_open (const char *name)
 
 void res_close (Res r)
 {
-    /* more to xfree... */
+    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);
 }
 
 const char *res_get (Res r, const char *name)
 {
+    struct res_entry *re;
     if (!r->init)
         reread (r);
+    
+    for (re = r->first; re; re=re->next)
+        if (re->value && !strcmp (re->name, name))
+            return re->value;
     return NULL;
 }
 
-const char *res_put (Res r, const char *name, const char *value)
+void res_put (Res r, const char *name, const char *value)
 {
+    struct res_entry *re;
     if (!r->init)
         reread (r);
-    return NULL;
+
+    for (re = r->first; re; re=re->next)
+        if (re->value && !strcmp (re->name, name))
+        {
+            xfree (re->value);
+            re->value = xstrdup (value);
+            return;
+        }
+    if (!r->first)
+        re = r->last = r->first = xmalloc (sizeof(*re));
+    else
+    {
+        re = xmalloc (sizeof(*re));
+        r->last->next = re;
+        r->last = re;
+    }
+    re->next = NULL;
+    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;
+
+    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)
 {
     if (!r->init)