Res.c now use handles. xmalloc defines xstrdup.
[idzebra-moved-to-github.git] / util / res.c
1 /*
2  * Copyright (C) 1994, Index Data I/S 
3  * All rights reserved.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: res.c,v $
7  * Revision 1.2  1994-08-18 08:23:26  adam
8  * Res.c now use handles. xmalloc defines xstrdup.
9  *
10  * Revision 1.1  1994/08/17  15:34:23  adam
11  * Initial version of resource manager.
12  *
13  */
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <util.h>
17
18 const char *alex_path (const char *name)
19 {
20     static char path[256];
21     char *alex_prefix;
22
23     if (!(alex_prefix = getenv ("ALEXPREFIX")))
24         alex_prefix = "./";
25     
26     if (*alex_prefix && alex_prefix[strlen(alex_prefix)-1] == '/')
27         sprintf (path, "%s%s", alex_prefix, name);
28     else
29         sprintf (path, "%s/%s", alex_prefix, name);
30     return path;
31 }
32
33 static void reread (Res r)
34 {
35     struct res_entry *resp;
36     char *line;
37     char *val_buf;
38     int val_size, val_max = 1024;
39     char path[256];
40     char fr_buf[1024];
41     FILE *fr;
42
43     r->init = 1;
44
45     val_buf = xmalloc (val_max);
46
47     strcpy (path, alex_path(r->name));
48
49     fr = fopen (path, "r");
50     if (!fr)
51     {
52         log (LOG_FATAL, "cannot open %s", path);
53         exit (1);
54     }
55     while (1)
56     {
57         line = fgets (fr_buf, 1023, fr);
58         if (!line)
59             break;
60         if (*line == '#')
61         {
62             int no = 0;
63
64             while (fr_buf[no] && fr_buf[no] != '\n')
65                 no++;
66             fr_buf[no] = '\0';
67
68             if (!r->first)
69                 resp = r->last = r->first = xmalloc (sizeof(*resp));
70             else
71             {
72                 resp = xmalloc (sizeof(*resp));
73                 r->last->next = resp;
74                 r->last = resp;
75             }
76             resp->next = NULL;
77             resp->name = xmalloc (no+1);
78             resp->value = NULL;
79             strcpy (resp->name, fr_buf);
80         }
81         else
82         {
83             int no = 0;
84             while (1)
85             {
86                 if (fr_buf[no] == 0 || fr_buf[no] == '\n' )
87                 {
88                     no = -1;
89                     break;
90                 }
91                 if (fr_buf[no] == ':')
92                     break;
93                 no++;
94             }
95             if (no < 0)
96                 continue;
97             fr_buf[no++] = '\0';
98             if (!r->first)
99                 resp = r->last = r->first = xmalloc (sizeof(*resp));
100             else
101             {
102                 resp = xmalloc (sizeof(*resp));
103                 r->last->next = resp;
104                 r->last = resp;
105             }
106             resp->next = NULL;
107             resp->name = xmalloc (no);
108             strcpy (resp->name, fr_buf);
109             
110             while (fr_buf[no] == ' ')
111                 no++;
112             val_size = 0;
113             while (1)
114             {
115                 if (fr_buf[no] == '\0' || fr_buf[no] == '\n')
116                 {
117                     val_buf[val_size++] = '\0';
118                     resp->value = xmalloc (val_size);
119                     strcpy (resp->value, val_buf);
120                     break;
121                 }
122                 else if (fr_buf[no] == '\\' && fr_buf[no+1] == '\n')
123                 {
124                     line = fgets (fr_buf, 1023, fr);
125                     if (!line)
126                     {
127                         resp->value = xmalloc (val_size);
128                         strcpy (resp->value, val_buf);
129                         break;
130                     }
131                     no = 0;
132                 }
133                 else
134                     val_buf[val_size] = fr_buf[no++];
135             }
136         }
137     }                
138     xfree (val_buf);
139     fclose (fr);
140 }
141
142 Res res_open (const char *name)
143 {
144     Res r = xmalloc (sizeof(*r));
145     r->init = 0;
146     r->name = xstrdup (name);
147     return r;
148 }
149
150 void res_close (Res r)
151 {
152     /* more to xfree... */
153     xfree (r);
154 }
155
156 const char *res_get (Res r, const char *name)
157 {
158     if (!r->init)
159         reread (r);
160     return NULL;
161 }
162
163 const char *res_put (Res r, const char *name, const char *value)
164 {
165     if (!r->init)
166         reread (r);
167     return NULL;
168 }
169     
170 int res_write (Res r)
171 {
172     if (!r->init)
173         reread (r);
174     return 0;
175 }
176
177
178