From ceeaeb9e63dfb8d03a084bbbc71e382d63251089 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Thu, 18 Aug 1994 09:43:49 +0000 Subject: [PATCH] Development of resource manager. Only missing is res_write. --- util/Makefile | 11 ++++++--- util/res-test.c | 48 ++++++++++++++++++++++++++++++++++++ util/res.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 121 insertions(+), 11 deletions(-) create mode 100644 util/res-test.c diff --git a/util/Makefile b/util/Makefile index be7abea..89e5dd8 100644 --- a/util/Makefile +++ b/util/Makefile @@ -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 index 0000000..315defd --- /dev/null +++ b/util/res-test.c @@ -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 +#include + +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; +} diff --git a/util/res.c b/util/res.c index 781aae6..a5c6c13 100644 --- a/util/res.c +++ b/util/res.c @@ -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 #include +#include #include 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) -- 1.7.10.4