9 #include "database_API.h"
11 extern char *gen_info();
13 typedef struct variable
15 struct variable
*NEXT
;
28 chain_list
*ALL_DATABASE
;
30 void database_API_AtLoad_Initialize()// commentaire pour desactiver l'ajout de token
33 // printf("init database\n");
35 static database
*getdatabase(char *name
)
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
;
43 void dtb_Create(char *name
)
46 if (getdatabase(name
)!=NULL
) return;
47 dtb
=(database
*)mbkalloc(sizeof(database
));
49 dtb
->name
=strdup(name
);
51 ALL_DATABASE
=addchain(ALL_DATABASE
, dtb
);
54 static variable
*getentry(database
*dtb
, char *name
)
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
) ;
64 static void distroyentry(variable
*var
)
70 mbkfree((void *)var
->value
);
74 void dtb_RemoveEntry(char *dtbname
, char *name
)
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
) ;
82 delhtitem(dtb
->H
, namealloc(name
));
84 if (pred
==NULL
) dtb
->VAR
=v
->NEXT
;
85 else pred
->NEXT
=v
->NEXT
;
90 void dtb_Clean(char *name
)
94 if ((dtb
=getdatabase(name
))==NULL
) return;
95 for (v
=dtb
->VAR
; v
!=NULL
; v
=next
)
106 void dtb_SetInt(char *dtbname
, char *name
, int value
)
110 if ((dtb
=getdatabase(dtbname
))==NULL
) return;
111 if ((v
=getentry(dtb
, name
))==NULL
)
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
);
121 *(int *)&v
->value
=value
;
123 void dtb_SetDouble(char *dtbname
, char *name
, double value
)
127 if ((dtb
=getdatabase(dtbname
))==NULL
) return;
128 if ((v
=getentry(dtb
, name
))==NULL
)
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
);
138 v
->value
=(long)mbkalloc(sizeof(double));
139 *(double *)v
->value
=value
;
141 void dtb_SetLong(char *dtbname
, char *name
, long value
)
145 if ((dtb
=getdatabase(dtbname
))==NULL
) return;
146 if ((v
=getentry(dtb
, name
))==NULL
)
148 v
=(variable
*)mbkalloc(sizeof(variable
));
149 v
->NEXT
=dtb
->VAR
; dtb
->VAR
=v
;
150 addhtitem(dtb
->H
, namealloc(name
), (long)v
);
154 v
->name
=strdup(name
);
156 *(long *)&v
->value
=value
;
159 void dtb_SetString(char *dtbname
, char *name
, char *value
)
163 if ((dtb
=getdatabase(dtbname
))==NULL
) return;
164 if ((v
=getentry(dtb
, name
))==NULL
)
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
);
174 *(char **)&v
->value
=strdup(value
);
177 void dtb_SetChar(char *dtbname
, char *name
, char value
)
181 if ((dtb
=getdatabase(dtbname
))==NULL
) return;
182 if ((v
=getentry(dtb
, name
))==NULL
)
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
);
192 *(char *)&v
->value
=value
;
195 void dtb_Save(char *name
)
201 if ((dtb
=getdatabase(name
))==NULL
) return;
202 sprintf(nn
,".%s.dtb",dtb
->name
);
203 if ((f
=fopen(nn
, "wt"))==NULL
)
205 fprintf(stderr
,"%s: could not save database '%s' in file '%s'\n",gen_info(),dtb
->name
,nn
);
208 for (v
=dtb
->VAR
; v
!=NULL
; v
=v
->NEXT
)
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;
223 int dtb_Load(char *name
)
226 char nn
[200], var
[200];
231 if (getdatabase(name
)==NULL
) dtb_Create(name
);
232 sprintf(nn
,".%s.dtb",name
);
233 if ((f
=fopen(nn
, "rt"))==NULL
) return 1;
235 while (fscanf(f
,"%s",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
;
243 fscanf(f
,"%s",nn
); dtb_SetInt(name
, var
, atoi(nn
)); break;
245 fscanf(f
,"%s",nn
); dtb_SetLong(name
, var
, atol(nn
)); break;
247 fscanf(f
,"%s",nn
); dtb_SetDouble(name
, var
, atof(nn
)); break;
249 fscanf(f
,"%s",nn
); dtb_SetChar(name
, var
, nn
[0]); break;
251 while(fgetc(f
)!='"' && !feof(f
)) ;
252 if (feof(f
)) goto emergency_exit
;
254 while((nn
[i
++]=fgetc(f
))!='"' && !feof(f
)) ;
255 if (feof(f
)) goto emergency_exit
;
257 dtb_SetString(name
, var
, nn
); break;
266 double dtb_GetDouble(char *dtbname
, char *name
)
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
;
276 int dtb_GetInt(char *dtbname
, char *name
)
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
;
286 long dtb_GetLong(char *dtbname
, char *name
)
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
;
296 char dtb_GetChar(char *dtbname
, char *name
)
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
;
306 char *dtb_GetString(char *dtbname
, char *name
)
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
;