2 * Copyright (C) 1994-2002, Index Data
4 * Sebastian Hammer, Adam Dickmeiss
6 * $Id: res.c,v 1.30 2002-04-04 20:50:37 adam Exp $
19 #include <yaz/yaz-util.h>
24 struct res_entry *next;
28 struct res_entry *first, *last;
34 static struct res_entry *add_entry (Res r)
36 struct res_entry *resp;
39 resp = r->last = r->first =
40 (struct res_entry *) xmalloc (sizeof(*resp));
43 resp = (struct res_entry *) xmalloc (sizeof(*resp));
51 static void reread (Res r)
53 struct res_entry *resp;
56 int val_size, val_max = 256;
63 val_buf = (char*) xmalloc (val_max);
65 fr = fopen (r->name, "r");
68 logf (LOG_WARN|LOG_ERRNO, "Cannot open %s", r->name);
73 line = fgets (fr_buf, sizeof(fr_buf)-1, fr);
80 while (fr_buf[no] && fr_buf[no] != '\n')
85 resp->name = (char*) xmalloc (no+1);
87 strcpy (resp->name, fr_buf);
94 if (fr_buf[no] == 0 || fr_buf[no] == '\n' )
99 if (strchr (": \t", fr_buf[no]))
106 resp = add_entry (r);
107 resp->name = (char*) xmalloc (no);
108 strcpy (resp->name, fr_buf);
110 while (strchr (" \t", fr_buf[no]))
115 if (fr_buf[no] == '\0' || strchr("\n\r\f", fr_buf[no]))
117 while (val_size > 0 &&
118 (val_buf[val_size-1] == ' ' ||
119 val_buf[val_size-1] == '\t'))
121 val_buf[val_size++] = '\0';
122 resp->value = (char*) xmalloc (val_size);
123 strcpy (resp->value, val_buf);
124 logf (LOG_DEBUG, "(name=%s,value=%s)",
125 resp->name, resp->value);
128 else if (fr_buf[no] == '\\' && strchr ("\n\r\f", fr_buf[no+1]))
130 line = fgets (fr_buf, sizeof(fr_buf)-1, fr);
133 resp->value = (char*) xmalloc (val_size);
134 strcpy (resp->value, val_buf);
141 val_buf[val_size++] = fr_buf[no++];
142 if (val_size+1 >= val_max)
146 nb = (char*) xmalloc (val_max+=1024);
147 memcpy (nb, val_buf, val_size);
159 Res res_open (const char *name, Res def_res)
163 if (access (name, 4))
165 if (access (name, R_OK))
168 logf (LOG_WARN|LOG_ERRNO, "Cannot access resource file `%s'", name);
171 r = (Res) xmalloc (sizeof(*r));
173 r->first = r->last = NULL;
174 r->name = xstrdup (name);
175 r->def_res = def_res;
179 void res_close (Res r)
185 struct res_entry *re, *re1;
186 for (re = r->first; re; re=re1)
200 char *res_get (Res r, const char *name)
202 struct res_entry *re;
208 for (re = r->first; re; re=re->next)
209 if (re->value && !yaz_matchstr (re->name, name))
212 return res_get (r->def_res, name);
215 char *res_get_def (Res r, const char *name, char *def)
219 if (!(t = res_get (r, name)))
221 logf (LOG_DEBUG, "CAUTION: Using default resource %s:%s", name, def);
228 int res_get_match (Res r, const char *name, const char *value, const char *s)
230 const char *cn = res_get (r, name);
234 if (cn && !yaz_matchstr (cn, value))
239 void res_put (Res r, const char *name, const char *value)
241 struct res_entry *re;
246 for (re = r->first; re; re=re->next)
247 if (re->value && !yaz_matchstr (re->name, name))
250 re->value = xstrdup (value);
254 re->name = xstrdup (name);
255 re->value = xstrdup (value);
258 int res_trav (Res r, const char *prefix, void *p,
259 void (*f)(void *p, const char *name, const char *value))
261 struct res_entry *re;
271 for (re = r->first; re; re=re->next)
273 if (l==0 || !memcmp (re->name, prefix, l))
275 (*f)(p, re->name, re->value);
279 return res_trav (r->def_res, prefix, p, f);
284 int res_write (Res r)
286 struct res_entry *re;
292 fr = fopen (r->name, "w");
295 logf (LOG_FATAL|LOG_ERRNO, "Cannot create %s", r->name);
299 for (re = r->first; re; re=re->next)
302 int lefts = strlen(re->name)+2;
305 fprintf (fr, "%s\n", re->name);
308 fprintf (fr, "%s: ", re->name);
309 while (lefts + strlen(re->value+no) > 78)
312 int ind = no+ 78-lefts;
315 if (re->value[ind] == ' ')
320 ind = no + 78 - lefts;
321 for (i = no; i != ind; i++)
322 putc (re->value[i], fr);
323 fprintf (fr, "\\\n");
327 fprintf (fr, "%s\n", re->value+no);