Development of resource manager. Only missing is res_write.
authorAdam Dickmeiss <adam@indexdata.dk>
Thu, 18 Aug 1994 09:43:49 +0000 (09:43 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Thu, 18 Aug 1994 09:43:49 +0000 (09:43 +0000)
util/Makefile
util/res-test.c [new file with mode: 0644]
util/res.c

index be7abea..89e5dd8 100644 (file)
@@ -1,7 +1,7 @@
 # Copyright (C) 1994, Index Data I/S 
 # All rights reserved.
 # Sebastian Hammer, Adam Dickmeiss
-# $Id: Makefile,v 1.5 1994-08-18 08:21:08 quinn Exp $
+# $Id: Makefile,v 1.6 1994-08-18 09:43:49 adam Exp $
 
 SHELL=/bin/sh
 INCLUDE=-I../include
@@ -14,8 +14,11 @@ CPP=cc -E
 
 all: $(LIB)
 
-$(TPROG): $(TPROG).o $(LIB) 
-       $(CC) -o $(TPROG) $(TPROG).o $(LIB)
+opt-test: opt-test.o $(LIB) 
+       $(CC) -o opt-test opt-test.o $(LIB)
+
+res-test: res-test.o $(LIB)
+       $(CC) -o res-test res-test.o $(LIB)
 
 $(LIB): $(PO)
        rm -f $(LIB)
@@ -26,7 +29,7 @@ $(LIB): $(PO)
        $(CC) -c $(DEFS) $(CFLAGS) $<
 
 clean:
-       rm -f *.[oa] $(TPROG) core mon.out gmon.out errlist
+       rm -f *.[oa] opt-test core mon.out gmon.out errlist
 
 dep depend:
        $(CPP) $(INCLUDE) -M *.c >.depend
diff --git a/util/res-test.c b/util/res-test.c
new file mode 100644 (file)
index 0000000..315defd
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 1994, Index Data I/S 
+ * All rights reserved.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log: res-test.c,v $
+ * Revision 1.1  1994-08-18 09:43:51  adam
+ * Development of resource manager. Only missing is res_write.
+ *
+ */
+
+#include <stdio.h>
+#include <util.h>
+
+static void res_print (const char *name, const char *value)
+{
+    printf ("%s=%s\n", name, value);
+}
+
+int main(int argc, char **argv)
+{
+    char *arg;
+    char *resfile = NULL;
+    int ret;
+    int verboselevel = LOG_DEFAULT_LEVEL;
+    char *prog = *argv;
+    Res res;
+
+
+    while ((ret = options ("v", argv, argc, &arg)) != -2)
+    {
+        if (ret == 0)
+            resfile = arg;
+        else if (ret == 'v')
+            verboselevel = LOG_ALL;
+    }
+    log_init (verboselevel, prog, NULL);
+
+    if (!resfile)
+    {
+        log (LOG_FATAL, "Now resource file given.");
+        exit (1);
+    }
+    res = res_open (resfile);
+    res_trav (res, "p", res_print);
+    res_close (res);
+    return 0;
+}
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)