2 * Copyright (C) 1994, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.3 1994-08-18 09:43:51 adam
8 * Development of resource manager. Only missing is res_write.
10 * Revision 1.2 1994/08/18 08:23:26 adam
11 * Res.c now use handles. xmalloc defines xstrdup.
13 * Revision 1.1 1994/08/17 15:34:23 adam
14 * Initial version of resource manager.
22 const char *alex_path (const char *name)
24 static char path[256];
27 if (!(alex_prefix = getenv ("ALEXPREFIX")))
30 if (*alex_prefix && alex_prefix[strlen(alex_prefix)-1] == '/')
31 sprintf (path, "%s%s", alex_prefix, name);
33 sprintf (path, "%s/%s", alex_prefix, name);
37 static void reread (Res r)
39 struct res_entry *resp;
42 int val_size, val_max = 1024;
49 val_buf = xmalloc (val_max);
51 strcpy (path, alex_path(r->name));
53 fr = fopen (path, "r");
56 log (LOG_FATAL|LOG_ERRNO, "cannot open %s", path);
61 line = fgets (fr_buf, 1023, fr);
68 while (fr_buf[no] && fr_buf[no] != '\n')
73 resp = r->last = r->first = xmalloc (sizeof(*resp));
76 resp = xmalloc (sizeof(*resp));
81 resp->name = xmalloc (no+1);
83 strcpy (resp->name, fr_buf);
90 if (fr_buf[no] == 0 || fr_buf[no] == '\n' )
95 if (fr_buf[no] == ':')
103 resp = r->last = r->first = xmalloc (sizeof(*resp));
106 resp = xmalloc (sizeof(*resp));
107 r->last->next = resp;
111 resp->name = xmalloc (no);
112 strcpy (resp->name, fr_buf);
114 while (fr_buf[no] == ' ')
119 if (fr_buf[no] == '\0' || fr_buf[no] == '\n')
121 val_buf[val_size++] = '\0';
122 resp->value = xmalloc (val_size);
123 strcpy (resp->value, val_buf);
124 log (LOG_DEBUG, "(name=%s,value=%s)",
125 resp->name, resp->value);
128 else if (fr_buf[no] == '\\' && fr_buf[no+1] == '\n')
130 line = fgets (fr_buf, 1023, fr);
133 resp->value = xmalloc (val_size);
134 strcpy (resp->value, val_buf);
140 val_buf[val_size++] = fr_buf[no++];
148 Res res_open (const char *name)
150 Res r = xmalloc (sizeof(*r));
152 r->name = xstrdup (name);
156 void res_close (Res r)
160 struct res_entry *re, *re1;
161 for (re = r->first; re; re=re1)
174 const char *res_get (Res r, const char *name)
176 struct res_entry *re;
180 for (re = r->first; re; re=re->next)
181 if (re->value && !strcmp (re->name, name))
186 void res_put (Res r, const char *name, const char *value)
188 struct res_entry *re;
192 for (re = r->first; re; re=re->next)
193 if (re->value && !strcmp (re->name, name))
196 re->value = xstrdup (value);
200 re = r->last = r->first = xmalloc (sizeof(*re));
203 re = xmalloc (sizeof(*re));
208 re->name = xstrdup (name);
209 re->value = xstrdup (value);
212 void res_trav (Res r, const char *prefix,
213 void (*f)(const char *name, const char *value))
215 struct res_entry *re;
222 for (re = r->first; re; re=re->next)
224 if (l==0 || !memcmp (re->name, prefix, l))
225 (*f)(re->name, re->value);
229 int res_write (Res r)