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);
309 cn=GWEN_DB_Node_List_First(n->children);
320 cn=GWEN_DB_Node_List_Next(cn);
355 nn=GWEN_DB_Node_List_First(n->children);
359 nn=GWEN_DB_Node_List_Next(nn);
372 n=GWEN_DB_Node_List_Next(n);
376 n=GWEN_DB_Node_List_Next(n);
392 nn=GWEN_DB_Node_List_First(n->children);
396 nn=GWEN_DB_Node_List_Next(nn);
409 n=GWEN_DB_Node_List_Next(n);
413 n=GWEN_DB_Node_List_Next(n);
429 nn=GWEN_DB_Node_List_First(n->children);
435 nn=GWEN_DB_Node_List_Next(nn);
450 n=GWEN_DB_Node_List_Next(n);
456 n=GWEN_DB_Node_List_Next(n);
483 return n->data.dataChar;
512 return n->data.dataInt;
516 if (sscanf(p,
"%d", &res)!=1) {
540 return n->data.dataBin;
560 nn=GWEN_DB_Node_List_First(n->children);
563 if (strcasecmp(nn->data.dataName, name)==0) {
570 nn=GWEN_DB_Node_List_Next(nn);
593 nn=GWEN_DB_Node_List_First(n->children);
596 if (strcasecmp(nn->data.dataName, name)==0) {
603 nn=GWEN_DB_Node_List_Next(nn);
629 (!(flags & GWEN_PATH_FLAGS_VARIABLE) &&
642 if (flags & GWEN_PATH_FLAGS_VARIABLE) {
644 "Unconditionally creating variable \"%s\"", entry);
654 "Unconditionally creating group \"%s\"", entry);
665 if (flags & GWEN_PATH_FLAGS_VARIABLE) {
675 (!(flags & GWEN_PATH_FLAGS_LAST) &&
679 if (flags & GWEN_PATH_FLAGS_VARIABLE) {
681 "Variable \"%s\" does not exist", entry);
685 "Group \"%s\" does not exist", entry);
695 if (flags & GWEN_PATH_FLAGS_VARIABLE) {
697 "Variable \"%s\" not found, creating", entry);
706 "Group \"%s\" not found, creating", entry);
717 ((flags & GWEN_PATH_FLAGS_LAST) &&
719 (!(flags & GWEN_PATH_FLAGS_LAST) &&
746 GWEN_DB_Node_List_Clear(n->children);
769 assert(nn->children);
770 nn=GWEN_DB_Node_List_First(nn->children);
778 nn=GWEN_DB_Node_List_Next(nn);
866 "Value for \"%s\" not found, returning default value",
873 "Bad type for path \"%s\", returning default value",
877 return nn->data.dataChar;
913 "Added char value \"%s\" to variable \"%s\"", val, path);
943 assert(nv->data.dataChar);
945 res=strcasecmp(nv->data.dataChar, val)==0;
947 res=strcmp(nv->data.dataChar, val)==0;
950 "Value \"%s\" of var \"%s\" already exists",
960 "Added char value \"%s\" to variable \"%s\"", val, path);
988 assert(nv->data.dataChar);
990 res=strcasecmp(nv->data.dataChar, val)==0;
992 res=strcmp(nv->data.dataChar, val)==0;
995 "Value \"%s\" of var \"%s\" already exists",
1020 "Value[%d] for \"%s\" not found, returning default value",
1027 return nn->data.dataInt;
1029 p=nn->data.dataChar;
1031 if (sscanf(p,
"%d", &res)!=1) {
1033 "String [%s] in node is not an int value", p);
1084 unsigned int defValSize,
1085 unsigned int *returnValueSize){
1088 assert(returnValueSize);
1092 "Value for \"%s\" not found, returning default value",
1094 *returnValueSize=defValSize;
1100 "Bad type for path \"%s\", returning default value",
1102 *returnValueSize=defValSize;
1105 *returnValueSize=nn->dataSize;
1106 return nn->data.dataBin;
1115 unsigned int valSize){
1156 "Value for \"%s\" not found, returning default value",
1163 "Bad type for path \"%s\", returning default value",
1167 return nn->data.dataPtr;
1252 return n->data.dataName;
1261 for (i=0; i<insert; i++)
1262 fprintf(stderr,
" ");
1267 fprintf(stderr,
"Group : \"%s\"\n", n->data.dataName);
1270 fprintf(stderr,
"Var : \"%s\"\n", n->data.dataName);
1273 fprintf(stderr,
"Value : \"%s\" (char)\n", n->data.dataChar);
1276 fprintf(stderr,
"Value : %d (int)\n", n->data.dataInt);
1284 buffer, (n->dataSize*2)+1)==0) {
1285 fprintf(stderr,
"Value : %d bytes (bin)\n", n->dataSize);
1288 fprintf(stderr,
"Value : %s (bin)\n", buffer);
1294 fprintf(stderr,
"Value : %p (ptr)\n", n->data.dataPtr);
1297 fprintf(stderr,
"[unknown node type %d]\n", n->typ);
1304 cn=GWEN_DB_Node_List_First(n->children);
1307 cn=GWEN_DB_Node_List_Next(cn);
1312 fprintf(stderr,
"[no node]\n");
1375 nn=GWEN_DB_Node_List_First(nn->children);
1380 nn=GWEN_DB_Node_List_Next(nn);
1500 res=(*func)(iter, user_data);
1512 unsigned int *a = user_data;
1520 unsigned int res = 0;
1538 res=(*func)(iter, user_data);
1550 unsigned int res = 0;
1568 res=(*func)(iter, user_data);
1580 unsigned int res = 0;
1589 return n->nodeFlags;
1611 flags=((flags^newflags)&(mask))^flags;
1628 flags=((flags^newflags)&(mask))^flags;
1631 cn=GWEN_DB_Node_List_First(n->children);
1634 cn=GWEN_DB_Node_List_Next(cn);
1660 nn=GWEN_DB_Node_List_First(n->children);
1665 nn=GWEN_DB_Node_List_Next(nn);
1702 nn=GWEN_DB_Node_List_First(n->children);
1707 nn=GWEN_DB_Node_List_Next(nn);
1742 return n->data.dataName;