Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / api / database / database.c
1
2 #include <string.h>
3 #include <stdlib.h>
4
5 #include AVT_H
6 #include API_H
7 #include MUT_H
8
9 #include "database_API.h"
10
11 extern char *gen_info();
12
13 typedef struct variable
14 {
15 struct variable *NEXT;
16 char *name;
17 char type;
18 long value;
19 } variable;
20
21 typedef struct
22 {
23 char *name;
24 ht *H;
25 variable *VAR;
26 } database;
27
28 chain_list *ALL_DATABASE;
29
30 void database_API_AtLoad_Initialize()// commentaire pour desactiver l'ajout de token
31 {
32 ALL_DATABASE=NULL;
33 // printf("init database\n");
34 }
35 static database *getdatabase(char *name)
36 {
37 chain_list *cl;
38 for (cl=ALL_DATABASE; cl!=NULL && strcmp(((database *)cl->DATA)->name, name)!=0; cl=cl->NEXT) ;
39 if (cl==NULL) return NULL;
40 return (database *)cl->DATA;
41 }
42
43 void dtb_Create(char *name)
44 {
45 database *dtb;
46 if (getdatabase(name)!=NULL) return;
47 dtb=(database *)mbkalloc(sizeof(database));
48 dtb->VAR=NULL;
49 dtb->name=strdup(name);
50 dtb->H=addht(128);
51 ALL_DATABASE=addchain(ALL_DATABASE, dtb);
52 }
53
54 static variable *getentry(database *dtb, char *name)
55 {
56 variable *v;
57 long l;
58 l=gethtitem(dtb->H, namealloc(name));
59 if (l!=EMPTYHT) return (variable *)l;
60 for (v=dtb->VAR; v!=NULL && strcmp(v->name,name)!=0; v=v->NEXT) ;
61 return v;
62 }
63
64 static void distroyentry(variable *var)
65 {
66 switch(var->type)
67 {
68 case 's':
69 case 'd':
70 mbkfree((void *)var->value);
71 }
72 }
73
74 void dtb_RemoveEntry(char *dtbname, char *name)
75 {
76 database *dtb;
77 variable *v, *pred;
78 if ((dtb=getdatabase(dtbname))==NULL) return;
79 for (pred=NULL, v=dtb->VAR; v!=NULL && strcmp(v->name, name)!=0; pred=v, v=v->NEXT) ;
80 if (v==NULL) return;
81
82 delhtitem(dtb->H, namealloc(name));
83 distroyentry(v);
84 if (pred==NULL) dtb->VAR=v->NEXT;
85 else pred->NEXT=v->NEXT;
86 mbkfree(v->name);
87 mbkfree(v);
88 }
89
90 void dtb_Clean(char *name)
91 {
92 database *dtb;
93 variable *v, *next;
94 if ((dtb=getdatabase(name))==NULL) return;
95 for (v=dtb->VAR; v!=NULL; v=next)
96 {
97 next=v->NEXT;
98 distroyentry(v);
99 mbkfree(v);
100 }
101 dtb->VAR=NULL;
102 delht(dtb->H);
103 dtb->H=addht(128);
104 }
105
106 void dtb_SetInt(char *dtbname, char *name, int value)
107 {
108 variable *v;
109 database *dtb;
110 if ((dtb=getdatabase(dtbname))==NULL) return;
111 if ((v=getentry(dtb, name))==NULL)
112 {
113 v=(variable *)mbkalloc(sizeof(variable));
114 v->NEXT=dtb->VAR; dtb->VAR=v;
115 v->name=strdup(name);
116 addhtitem(dtb->H, namealloc(name), (long)v);
117 }
118 else
119 distroyentry(v);
120 v->type='i';
121 *(int *)&v->value=value;
122 }
123 void dtb_SetDouble(char *dtbname, char *name, double value)
124 {
125 variable *v;
126 database *dtb;
127 if ((dtb=getdatabase(dtbname))==NULL) return;
128 if ((v=getentry(dtb, name))==NULL)
129 {
130 v=(variable *)mbkalloc(sizeof(variable));
131 v->NEXT=dtb->VAR; dtb->VAR=v;
132 v->name=strdup(name);
133 addhtitem(dtb->H, namealloc(name), (long)v);
134 }
135 else
136 distroyentry(v);
137 v->type='d';
138 v->value=(long)mbkalloc(sizeof(double));
139 *(double *)v->value=value;
140 }
141 void dtb_SetLong(char *dtbname, char *name, long value)
142 {
143 variable *v;
144 database *dtb;
145 if ((dtb=getdatabase(dtbname))==NULL) return;
146 if ((v=getentry(dtb, name))==NULL)
147 {
148 v=(variable *)mbkalloc(sizeof(variable));
149 v->NEXT=dtb->VAR; dtb->VAR=v;
150 addhtitem(dtb->H, namealloc(name), (long)v);
151 }
152 else
153 distroyentry(v);
154 v->name=strdup(name);
155 v->type='l';
156 *(long *)&v->value=value;
157 }
158
159 void dtb_SetString(char *dtbname, char *name, char *value)
160 {
161 variable *v;
162 database *dtb;
163 if ((dtb=getdatabase(dtbname))==NULL) return;
164 if ((v=getentry(dtb, name))==NULL)
165 {
166 v=(variable *)mbkalloc(sizeof(variable));
167 v->NEXT=dtb->VAR; dtb->VAR=v;
168 v->name=strdup(name);
169 addhtitem(dtb->H, namealloc(name), (long)v);
170 }
171 else
172 distroyentry(v);
173 v->type='s';
174 *(char **)&v->value=strdup(value);
175 }
176
177 void dtb_SetChar(char *dtbname, char *name, char value)
178 {
179 variable *v;
180 database *dtb;
181 if ((dtb=getdatabase(dtbname))==NULL) return;
182 if ((v=getentry(dtb, name))==NULL)
183 {
184 v=(variable *)mbkalloc(sizeof(variable));
185 v->NEXT=dtb->VAR; dtb->VAR=v;
186 v->name=strdup(name);
187 addhtitem(dtb->H, namealloc(name), (long)v);
188 }
189 else
190 distroyentry(v);
191 v->type='c';
192 *(char *)&v->value=value;
193 }
194
195 void dtb_Save(char *name)
196 {
197 database *dtb;
198 variable *v;
199 FILE *f;
200 char nn[200];
201 if ((dtb=getdatabase(name))==NULL) return;
202 sprintf(nn,".%s.dtb",dtb->name);
203 if ((f=fopen(nn, "wt"))==NULL)
204 {
205 fprintf(stderr,"%s: could not save database '%s' in file '%s'\n",gen_info(),dtb->name,nn);
206 return;
207 }
208 for (v=dtb->VAR; v!=NULL; v=v->NEXT)
209 {
210 switch(v->type)
211 {
212 case 'i' : fprintf(f, "%c %-10s = %d\n", v->type, v->name, *(int *)v->value); break;
213 case 'l' : fprintf(f, "%c %-10s = %ld\n", v->type, v->name, *(long *)v->value); break;
214 case 'd' : fprintf(f, "%c %-10s = %e\n", v->type, v->name, *(double *)v->value); break;
215 case 'c' : fprintf(f, "%c %-10s = '%c'\n", v->type, v->name, *(char *)v->value); break;
216 case 's' : fprintf(f, "%c %-10s = \"%s\"\n", v->type, v->name, (char *)v->value); break;
217 }
218 }
219 fclose(f);
220 }
221
222
223 int dtb_Load(char *name)
224 {
225 FILE *f;
226 char nn[200], var[200];
227 char type;
228 int i, ret=1;
229
230 // dtb_Clean(name);
231 if (getdatabase(name)==NULL) dtb_Create(name);
232 sprintf(nn,".%s.dtb",name);
233 if ((f=fopen(nn, "rt"))==NULL) return 1;
234
235 while (fscanf(f,"%s",nn)>0)
236 {
237 type=nn[0];
238 if (fscanf(f,"%s",var)<=0) goto emergency_exit;
239 if (fscanf(f,"%s",nn)<=0 || strcmp(nn,"=")!=0) goto emergency_exit;
240 switch(type)
241 {
242 case 'i' :
243 fscanf(f,"%s",nn); dtb_SetInt(name, var, atoi(nn)); break;
244 case 'l' :
245 fscanf(f,"%s",nn); dtb_SetLong(name, var, atol(nn)); break;
246 case 'd' :
247 fscanf(f,"%s",nn); dtb_SetDouble(name, var, atof(nn)); break;
248 case 'c' :
249 fscanf(f,"%s",nn); dtb_SetChar(name, var, nn[0]); break;
250 case 's' :
251 while(fgetc(f)!='"' && !feof(f)) ;
252 if (feof(f)) goto emergency_exit;
253 i=0;
254 while((nn[i++]=fgetc(f))!='"' && !feof(f)) ;
255 if (feof(f)) goto emergency_exit;
256 nn[i-1]='\0';
257 dtb_SetString(name, var, nn); break;
258 }
259 }
260 ret=0;
261 emergency_exit:
262 fclose(f);
263 return ret;
264 }
265
266 double dtb_GetDouble(char *dtbname, char *name)
267 {
268 variable *v;
269 database *dtb;
270 if ((dtb=getdatabase(dtbname))==NULL) return 0.0;
271 if ((v=getentry(dtb, name))==NULL) return 0.0;
272 if (v->type!='d') return 0.0;
273 return *(double *)v->value;
274 }
275
276 int dtb_GetInt(char *dtbname, char *name)
277 {
278 variable *v;
279 database *dtb;
280 if ((dtb=getdatabase(dtbname))==NULL) return 0;
281 if ((v=getentry(dtb, name))==NULL) return 0;
282 if (v->type!='i') return 0;
283 return *(int *)&v->value;
284 }
285
286 long dtb_GetLong(char *dtbname, char *name)
287 {
288 variable *v;
289 database *dtb;
290 if ((dtb=getdatabase(dtbname))==NULL) return 0;
291 if ((v=getentry(dtb, name))==NULL) return 0;
292 if (v->type!='l') return 0;
293 return *(long *)&v->value;
294 }
295
296 char dtb_GetChar(char *dtbname, char *name)
297 {
298 variable *v;
299 database *dtb;
300 if ((dtb=getdatabase(dtbname))==NULL) return ' ';
301 if ((v=getentry(dtb, name))==NULL) return ' ';
302 if (v->type!='c') return ' ';
303 return *(char *)&v->value;
304 }
305
306 char *dtb_GetString(char *dtbname, char *name)
307 {
308 variable *v;
309 database *dtb;
310 if ((dtb=getdatabase(dtbname))==NULL) return NULL;
311 if ((v=getentry(dtb, name))==NULL) return NULL;
312 if (v->type!='s') return NULL;
313 return (char *)v->value;
314 }