30 #define DISABLE_DEBUGLOG
33 #include <gwenhywfar/misc.h>
34 #include <gwenhywfar/debug.h>
35 #include <gwenhywfar/path.h>
36 #include <gwenhywfar/text.h>
37 #include <gwenhywfar/dbio.h>
38 #include <gwenhywfar/fslock.h>
39 #include <gwenhywfar/fastbuffer.h>
40 #include <gwenhywfar/syncio_file.h>
41 #include <gwenhywfar/syncio_memory.h>
49 #include <sys/types.h>
50 #ifdef HAVE_SYS_STAT_H
51 # include <sys/stat.h>
61 #define GWEN_DB_NODE_FLAGS_MASK_INTERNAL 0xf0000000
62 #define GWEN_DB_NODE_FLAGS_GROUP 0x80000000
82 unsigned int datasize){
90 assert(n->data.dataBin);
91 memmove(n->data.dataBin, data, datasize);
102 n->data.dataInt=data;
125 n->data.dataPtr=data;
140 n->children=GWEN_DB_Node_List_new();
155 n->children=GWEN_DB_Node_List_new();
167 assert(parent->children!=
NULL);
168 GWEN_DB_Node_List_Add(n, parent->children);
191 assert(parent->children!=
NULL);
192 GWEN_DB_Node_List_Insert(n, parent->children);
219 GWEN_DB_Node_List_Del(n);
246 GWEN_DB_Node_List_free(n->children);
253 if (n->data.dataName) {
254 int l=strlen(n->data.dataName);
256 memset(n->data.dataName, 0, l);
262 if (n->data.dataChar) {
263 int l=strlen(n->data.dataChar);
265 memset(n->data.dataChar, 0, l);
270 if (n->data.dataBin && n->dataSize) {
271 memset(n->data.dataBin, 0, n->dataSize);
276 n->data.dataPtr=
NULL;
349 cn=GWEN_DB_Node_List_First(n->children);
360 cn=GWEN_DB_Node_List_Next(cn);
395 nn=GWEN_DB_Node_List_First(n->children);
399 nn=GWEN_DB_Node_List_Next(nn);
412 n=GWEN_DB_Node_List_Next(n);
416 n=GWEN_DB_Node_List_Next(n);
432 nn=GWEN_DB_Node_List_First(n->children);
436 nn=GWEN_DB_Node_List_Next(nn);
449 n=GWEN_DB_Node_List_Next(n);
453 n=GWEN_DB_Node_List_Next(n);
469 nn=GWEN_DB_Node_List_First(n->children);
475 nn=GWEN_DB_Node_List_Next(nn);
490 n=GWEN_DB_Node_List_Next(n);
496 n=GWEN_DB_Node_List_Next(n);
523 return n->data.dataChar;
552 return n->data.dataInt;
556 if (sscanf(p,
"%d", &res)!=1) {
580 return n->data.dataBin;
600 nn=GWEN_DB_Node_List_First(n->children);
603 if (strcasecmp(nn->data.dataName, name)==0) {
610 nn=GWEN_DB_Node_List_Next(nn);
633 nn=GWEN_DB_Node_List_First(n->children);
636 if (strcasecmp(nn->data.dataName, name)==0) {
643 nn=GWEN_DB_Node_List_Next(nn);
669 (!(flags & GWEN_PATH_FLAGS_VARIABLE) &&
682 if (flags & GWEN_PATH_FLAGS_VARIABLE) {
684 "Unconditionally creating variable \"%s\"", entry);
694 "Unconditionally creating group \"%s\"", entry);
705 if (flags & GWEN_PATH_FLAGS_VARIABLE) {
715 (!(flags & GWEN_PATH_FLAGS_LAST) &&
719 if (flags & GWEN_PATH_FLAGS_VARIABLE) {
721 "Variable \"%s\" does not exist", entry);
725 "Group \"%s\" does not exist", entry);
735 if (flags & GWEN_PATH_FLAGS_VARIABLE) {
737 "Variable \"%s\" not found, creating", entry);
746 "Group \"%s\" not found, creating", entry);
757 ((flags & GWEN_PATH_FLAGS_LAST) &&
759 (!(flags & GWEN_PATH_FLAGS_LAST) &&
786 GWEN_DB_Node_List_Clear(n->children);
809 assert(nn->children);
810 nn=GWEN_DB_Node_List_First(nn->children);
818 nn=GWEN_DB_Node_List_Next(nn);
906 "Value for \"%s\" not found, returning default value",
913 "Bad type for path \"%s\", returning default value",
917 return nn->data.dataChar;
953 "Added char value \"%s\" to variable \"%s\"", val, path);
983 assert(nv->data.dataChar);
985 res=strcasecmp(nv->data.dataChar, val)==0;
987 res=strcmp(nv->data.dataChar, val)==0;
990 "Value \"%s\" of var \"%s\" already exists",
1000 "Added char value \"%s\" to variable \"%s\"", val, path);
1028 assert(nv->data.dataChar);
1030 res=strcasecmp(nv->data.dataChar, val)==0;
1032 res=strcmp(nv->data.dataChar, val)==0;
1035 "Value \"%s\" of var \"%s\" already exists",
1060 "Value[%d] for \"%s\" not found, returning default value",
1067 return nn->data.dataInt;
1069 p=nn->data.dataChar;
1071 if (sscanf(p,
"%d", &res)!=1) {
1073 "String [%s] in node is not an int value", p);
1124 unsigned int defValSize,
1125 unsigned int *returnValueSize){
1128 assert(returnValueSize);
1132 "Value for \"%s\" not found, returning default value",
1134 *returnValueSize=defValSize;
1140 "Bad type for path \"%s\", returning default value",
1142 *returnValueSize=defValSize;
1145 *returnValueSize=nn->dataSize;
1146 return nn->data.dataBin;
1155 unsigned int valSize){
1196 "Value for \"%s\" not found, returning default value",
1203 "Bad type for path \"%s\", returning default value",
1207 return nn->data.dataPtr;
1292 return n->data.dataName;
1301 for (i=0; i<insert; i++)
1302 fprintf(stderr,
" ");
1307 fprintf(stderr,
"Group : \"%s\"\n", n->data.dataName);
1310 fprintf(stderr,
"Var : \"%s\"\n", n->data.dataName);
1313 fprintf(stderr,
"Value : \"%s\" (char)\n", n->data.dataChar);
1316 fprintf(stderr,
"Value : %d (int)\n", n->data.dataInt);
1324 buffer, (n->dataSize*2)+1)==0) {
1325 fprintf(stderr,
"Value : %d bytes (bin)\n", n->dataSize);
1328 fprintf(stderr,
"Value : %s (bin)\n", buffer);
1334 fprintf(stderr,
"Value : %p (ptr)\n", n->data.dataPtr);
1337 fprintf(stderr,
"[unknown node type %d]\n", n->typ);
1344 cn=GWEN_DB_Node_List_First(n->children);
1347 cn=GWEN_DB_Node_List_Next(cn);
1352 fprintf(stderr,
"[no node]\n");
1415 nn=GWEN_DB_Node_List_First(nn->children);
1420 nn=GWEN_DB_Node_List_Next(nn);
1540 res=(*func)(iter, user_data);
1552 unsigned int *a = user_data;
1560 unsigned int res = 0;
1578 res=(*func)(iter, user_data);
1590 unsigned int res = 0;
1608 res=(*func)(iter, user_data);
1620 unsigned int res = 0;
1629 return n->nodeFlags;
1651 flags=((flags^newflags)&(mask))^flags;
1668 flags=((flags^newflags)&(mask))^flags;
1671 cn=GWEN_DB_Node_List_First(n->children);
1674 cn=GWEN_DB_Node_List_Next(cn);
1700 nn=GWEN_DB_Node_List_First(n->children);
1705 nn=GWEN_DB_Node_List_Next(nn);
1742 nn=GWEN_DB_Node_List_First(n->children);
1747 nn=GWEN_DB_Node_List_Next(nn);
1782 return n->data.dataName;