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 89 unsigned int datasize)
98 assert(n->data.dataBin);
99 memmove(n->data.dataBin, data, datasize);
111 n->data.dataInt=data;
137 rv=snprintf(numbuffer,
sizeof(numbuffer)-1,
"%d", v);
138 if (rv>=
sizeof(numbuffer)) {
140 numbuffer[
sizeof(numbuffer)-1]=0;
154 n->data.dataPtr=data;
170 n->children=GWEN_DB_Node_List_new();
186 n->children=GWEN_DB_Node_List_new();
199 assert(parent->children!=
NULL);
200 GWEN_DB_Node_List_Add(n, parent->children);
225 assert(parent->children!=
NULL);
226 GWEN_DB_Node_List_Insert(n, parent->children);
255 GWEN_DB_Node_List_Del(n);
284 GWEN_DB_Node_List_free(n->children);
291 if (n->data.dataName) {
292 int l=strlen(n->data.dataName);
294 memset(n->data.dataName, 0, l);
300 if (n->data.dataChar) {
301 int l=strlen(n->data.dataChar);
303 memset(n->data.dataChar, 0, l);
308 if (n->data.dataBin && n->dataSize) {
309 memset(n->data.dataBin, 0, n->dataSize);
314 n->data.dataPtr=
NULL;
388 cn=GWEN_DB_Node_List_First(n->children);
399 cn=GWEN_DB_Node_List_Next(cn);
437 nn=GWEN_DB_Node_List_First(n->children);
441 nn=GWEN_DB_Node_List_Next(nn);
455 n=GWEN_DB_Node_List_Next(n);
459 n=GWEN_DB_Node_List_Next(n);
476 nn=GWEN_DB_Node_List_First(n->children);
480 nn=GWEN_DB_Node_List_Next(nn);
494 n=GWEN_DB_Node_List_Next(n);
498 n=GWEN_DB_Node_List_Next(n);
515 nn=GWEN_DB_Node_List_First(n->children);
521 nn=GWEN_DB_Node_List_Next(nn);
537 n=GWEN_DB_Node_List_Next(n);
543 n=GWEN_DB_Node_List_Next(n);
572 return n->data.dataChar;
603 return n->data.dataInt;
607 if (sscanf(p,
"%d", &res)!=1) {
632 return n->data.dataBin;
653 nn=GWEN_DB_Node_List_First(n->children);
656 if (strcasecmp(nn->data.dataName, name)==0) {
663 nn=GWEN_DB_Node_List_Next(nn);
687 nn=GWEN_DB_Node_List_First(n->children);
690 if (strcasecmp(nn->data.dataName, name)==0) {
697 nn=GWEN_DB_Node_List_Next(nn);
739 "Unconditionally creating variable \"%s\"", entry);
749 "Unconditionally creating group \"%s\"", entry);
776 "Variable \"%s\" does not exist", entry);
780 "Group \"%s\" does not exist", entry);
792 "Variable \"%s\" not found, creating", entry);
801 "Group \"%s\" not found, creating", entry);
843 GWEN_DB_Node_List_Clear(n->children);
867 assert(nn->children);
868 nn=GWEN_DB_Node_List_First(nn->children);
876 nn=GWEN_DB_Node_List_Next(nn);
968 "Value for \"%s\" not found, returning default value",
975 "Bad type for path \"%s\", returning default value",
979 return nn->data.dataChar;
1016 "Added char value \"%s\" to variable \"%s\"", val, path);
1053 "Added char value \"%s\" to variable \"%s\"", val, path);
1084 assert(nv->data.dataChar);
1086 res=strcasecmp(nv->data.dataChar, val)==0;
1088 res=strcmp(nv->data.dataChar, val)==0;
1091 "Value \"%s\" of var \"%s\" already exists",
1101 "Added char value \"%s\" to variable \"%s\"", val, path);
1130 assert(nv->data.dataChar);
1132 res=strcasecmp(nv->data.dataChar, val)==0;
1134 res=strcmp(nv->data.dataChar, val)==0;
1137 "Value \"%s\" of var \"%s\" already exists",
1163 "Value[%d] for \"%s\" not found, returning default value",
1170 return nn->data.dataInt;
1172 p=nn->data.dataChar;
1174 if (sscanf(p,
"%d", &res)!=1) {
1176 "String [%s] in node is not an int value", p);
1228 unsigned int defValSize,
1229 unsigned int *returnValueSize)
1233 assert(returnValueSize);
1237 "Value for \"%s\" not found, returning default value",
1239 *returnValueSize=defValSize;
1245 "Bad type for path \"%s\", returning default value",
1247 *returnValueSize=defValSize;
1250 *returnValueSize=nn->dataSize;
1251 return nn->data.dataBin;
1260 unsigned int valSize)
1303 "Value for \"%s\" not found, returning default value",
1310 "Bad type for path \"%s\", returning default value",
1314 return nn->data.dataPtr;
1402 return n->data.dataName;
1412 for (i=0; i<insert; i++)
1413 fprintf(stderr,
" ");
1418 fprintf(stderr,
"Group : \"%s\"\n", n->data.dataName);
1421 fprintf(stderr,
"Var : \"%s\"\n", n->data.dataName);
1424 fprintf(stderr,
"Value : \"%s\" (char)\n", n->data.dataChar);
1427 fprintf(stderr,
"Value : %d (int)\n", n->data.dataInt);
1435 buffer, (n->dataSize*2)+1)==0) {
1436 fprintf(stderr,
"Value : %d bytes (bin)\n", n->dataSize);
1439 fprintf(stderr,
"Value : %s (bin)\n", buffer);
1445 fprintf(stderr,
"Value : %p (ptr)\n", n->data.dataPtr);
1448 fprintf(stderr,
"[unknown node type %d]\n", n->typ);
1455 cn=GWEN_DB_Node_List_First(n->children);
1458 cn=GWEN_DB_Node_List_Next(cn);
1463 fprintf(stderr,
"[no node]\n");
1529 nn=GWEN_DB_Node_List_First(nn->children);
1534 nn=GWEN_DB_Node_List_Next(nn);
1664 res=(*func)(iter, user_data);
1677 unsigned int *a = user_data;
1686 unsigned int res = 0;
1705 res=(*func)(iter, user_data);
1718 unsigned int res = 0;
1737 res=(*func)(iter, user_data);
1750 unsigned int res = 0;
1760 return n->nodeFlags;
1784 flags=((flags^newflags)&(mask))^flags;
1802 flags=((flags^newflags)&(mask))^flags;
1805 cn=GWEN_DB_Node_List_First(n->children);
1808 cn=GWEN_DB_Node_List_Next(cn);
1836 nn=GWEN_DB_Node_List_First(n->children);
1841 nn=GWEN_DB_Node_List_Next(nn);
1880 nn=GWEN_DB_Node_List_First(n->children);
1885 nn=GWEN_DB_Node_List_Next(nn);
1922 return n->data.dataName;
1953 while (*p && *p!=
')')
1964 const char *valueString;
1975 rawName=(
char *) malloc(len+1);
1977 memmove(rawName, pStart, len);
2032 while (*p && *p!=
'#') {
2041 else if (*p==
'\\') {
2043 if (tolower(p[1])==
'n') {
2047 else if (tolower(p[1])==
't') {
2051 else if (tolower(p[1])==
'\\') {
2083 while (*p && *p!=
'[')
2091 name=(
char *) malloc(len+1);
2093 memmove(name, pStart, len);
2100 while(*p && *p!=
']' && isdigit(*p)) {
2112 *pVariableName=name;
int GWEN_DB_ReplaceVars(GWEN_DB_NODE *db, const char *s, GWEN_BUFFER *dbuf)
GWEN_DB_NODE * GWEN_DB_GetValue(GWEN_DB_NODE *n, const char *path, int idx)
#define GWEN_DB_FLAGS_OVERWRITE_VARS
void GWEN_DB_ModifyBranchFlagsUp(GWEN_DB_NODE *n, uint32_t newflags, uint32_t mask)
void GWEN_DB_Dump(GWEN_DB_NODE *n, int insert)
void * GWEN_DB_Groups_Foreach(GWEN_DB_NODE *node, GWEN_DB_NODES_CB func, void *user_data)
struct GWEN_DB_NODE GWEN_DB_NODE
#define GWEN_DB_FLAGS_INSERT
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
#define GWEN_ERROR_INVALID
void GWEN_DB_ClearNode(GWEN_DB_NODE *n)
char * GWEN_Memory_strdup(const char *s)
GWEN_DB_NODE * GWEN_DB_ValuePtr_new(void *data)
uint32_t GWEN_DB_GetNodeFlags(const GWEN_DB_NODE *n)
#define GWEN_FREE_OBJECT(varname)
void GWEN_Memory_dealloc(void *p)
#define GWEN_PATH_FLAGS_CREATE_GROUP
#define DBG_VERBOUS(dbg_logger, format, args...)
GWEN_DB_NODE * GWEN_DB_GetNextValue(GWEN_DB_NODE *n)
void *(* GWEN_DB_NODES_CB)(GWEN_DB_NODE *node, void *user_data)
void GWEN_DB_GroupRename(GWEN_DB_NODE *n, const char *newname)
void GWEN_DB_Node_Append_UnDirty(GWEN_DB_NODE *parent, GWEN_DB_NODE *n)
unsigned int GWEN_DB_Groups_Count(const GWEN_DB_NODE *node)
#define DBG_WARN(dbg_logger, format, args...)
void GWEN_DB_ModifyBranchFlagsDown(GWEN_DB_NODE *n, uint32_t newflags, uint32_t mask)
int GWEN_DB_ValueExists(GWEN_DB_NODE *n, const char *path, unsigned int i)
int GWEN_DB_SetPtrValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, void *val)
int GWEN_DB_SetCharValueFromInt(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
GWEN_DB_NODE * GWEN_DB_ValueBin_new(const void *data, unsigned int datasize)
#define GWEN_PATH_FLAGS_LAST
GWEN_DB_NODE * GWEN_DB_Node_dup(const GWEN_DB_NODE *n)
int GWEN_DB_InsertGroup(GWEN_DB_NODE *n, GWEN_DB_NODE *nn)
GWEN_DB_NODE * GWEN_DB_GetNode(GWEN_DB_NODE *n, const char *path, uint32_t flags)
#define GWEN_ERROR_BAD_DATA
int GWEN_DB_AddGroup(GWEN_DB_NODE *n, GWEN_DB_NODE *nn)
#define GWEN_PATH_FLAGS_NAMEMUSTNOTEXIST
GWEN_DB_NODE * GWEN_DB_GetFirstVar(GWEN_DB_NODE *n)
GWEN_DB_NODE_TYPE GWEN_DB_GetVariableType(GWEN_DB_NODE *n, const char *p)
int GWEN_DB_IsVariable(const GWEN_DB_NODE *n)
int GWEN_DB_SetBinValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const void *val, unsigned int valSize)
void GWEN_DB_Node_free(GWEN_DB_NODE *n)
void GWEN_DB_VariableRename(GWEN_DB_NODE *n, const char *newname)
#define GWEN_NEW_OBJECT(typ, varname)
void GWEN_DB_Node_Unlink_UnDirty(GWEN_DB_NODE *n)
static int _splitVariableNameInNameAndIndex(const char *s, char **pVariableName)
#define DBG_DEBUG(dbg_logger, format, args...)
const char * GWEN_DB_GroupName(GWEN_DB_NODE *n)
GWEN_DB_NODE * GWEN_DB_ValueChar_newFromInt(int v)
void GWEN_DB_Node_Append(GWEN_DB_NODE *parent, GWEN_DB_NODE *n)
int GWEN_DB_DeleteGroup(GWEN_DB_NODE *n, const char *path)
#define GWEN_DB_FLAGS_OVERWRITE_GROUPS
#define GWEN_PATH_FLAGS_VARIABLE
#define GWEN_DB_NODE_FLAGS_SAFE
void * GWEN_Memory_malloc(size_t wsize)
const void * GWEN_DB_GetBinValue(GWEN_DB_NODE *n, const char *path, int idx, const void *defVal, unsigned int defValSize, unsigned int *returnValueSize)
void GWEN_DB_Node_InsertUnDirty(GWEN_DB_NODE *parent, GWEN_DB_NODE *n)
GWEN_DB_NODE * GWEN_DB_GetNextGroup(GWEN_DB_NODE *n)
void * GWEN_DB_GetPtrValue(GWEN_DB_NODE *n, const char *path, int idx, void *defVal)
const void * GWEN_DB_GetBinValueFromNode(const GWEN_DB_NODE *n, unsigned int *size)
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
GWEN_DB_NODE * GWEN_DB_Group_dup(const GWEN_DB_NODE *n)
const char * GWEN_DB_VariableName(GWEN_DB_NODE *n)
int GWEN_DB_IsValue(const GWEN_DB_NODE *n)
int GWEN_DB_VariableExists(GWEN_DB_NODE *n, const char *path)
GWEN_DB_NODE * GWEN_DB_FindNextVar(GWEN_DB_NODE *n, const char *name)
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
GWEN_DB_NODE * GWEN_DB_ValueChar_new(const char *data)
GWEN_DB_NODE * GWEN_DB_FindGroup(GWEN_DB_NODE *n, const char *name, int idx)
int GWEN_DB_DeleteVar(GWEN_DB_NODE *n, const char *path)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
GWEN_DB_NODE * GWEN_DB_Node_new(GWEN_DB_NODE_TYPE t)
#define GWEN_DB_NODE_FLAGS_DIRTY
int GWEN_Text_NumToString(int num, char *buffer, unsigned int bufsize, int fillchar)
#define GWEN_PATH_FLAGS_PATHCREATE
#define GWEN_PATH_FLAGS_CREATE_VAR
#define GWEN_PATH_FLAGS_PATHMUSTNOTEXIST
#define DBG_ERROR(dbg_logger, format, args...)
void GWEN_DB_Node_Unlink(GWEN_DB_NODE *n)
GWEN_DB_NODE * GWEN_DB_FindFirstVar(GWEN_DB_NODE *n, const char *name)
char * GWEN_Text_ToHex(const char *src, unsigned l, char *buffer, unsigned int maxsize)
int GWEN_Text_ComparePattern(const char *w, const char *p, int sensecase)
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
unsigned int GWEN_DB_Variables_Count(const GWEN_DB_NODE *node)
void * GWEN_DB_HandlePath(const char *entry, void *data, int idx, uint32_t flags)
GWEN_DB_NODE * GWEN_DB_GetFirstValue(GWEN_DB_NODE *n)
#define GWEN_PATH_FLAGS_PATHMUSTEXIST
GWEN_DB_NODE_TYPE GWEN_DB_GetValueTypeByPath(GWEN_DB_NODE *n, const char *path, unsigned int i)
int GWEN_DB_IsGroup(const GWEN_DB_NODE *n)
#define DBG_INFO(dbg_logger, format, args...)
int GWEN_DB_AddCharValue(GWEN_DB_NODE *n, const char *path, const char *val, int senseCase, int check)
GWEN_DB_NODE * GWEN_DB_GetNextVar(GWEN_DB_NODE *n)
GWEN_DB_NODE * GWEN_DB_FindVar(GWEN_DB_NODE *n, const char *name, int idx)
void GWEN_DB_UnlinkGroup(GWEN_DB_NODE *n)
void * GWEN_DB_count_cb(GWEN_UNUSED GWEN_DB_NODE *node, void *user_data)
#define GWEN_LIST_INIT(t, element)
int GWEN_DB_GetIntValue(GWEN_DB_NODE *n, const char *path, int idx, int defVal)
GWEN_DB_NODE * GWEN_DB_GetParentGroup(GWEN_DB_NODE *n)
GWEN_DB_NODE * GWEN_DB_FindFirstGroup(GWEN_DB_NODE *n, const char *name)
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
GWEN_DB_NODE * GWEN_DB_GetFirstGroup(GWEN_DB_NODE *n)
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
#define GWEN_LIST_FUNCTIONS(t, pr)
void * GWEN_Path_HandleWithIdx(const char *path, void *data, uint32_t flags, GWEN_PATHIDXHANDLERPTR elementFunction)
int GWEN_DB_GetIntValueFromNode(const GWEN_DB_NODE *n)
int GWEN_DB_RemoveCharValue(GWEN_DB_NODE *n, const char *path, const char *val, int senseCase)
void * GWEN_DB_Variables_Foreach(GWEN_DB_NODE *node, GWEN_DB_NODES_CB func, void *user_data)
int GWEN_DB_ClearGroup(GWEN_DB_NODE *n, const char *path)
int GWEN_DB_AddGroupChildren(GWEN_DB_NODE *n, GWEN_DB_NODE *nn)
#define GWEN_PATH_FLAGS_NAMEMUSTEXIST
int GWEN_DB_SetCharValueInNode(GWEN_DB_NODE *n, const char *s)
GWEN_DB_NODE * GWEN_DB_FindNextGroup(GWEN_DB_NODE *n, const char *name)
#define GWEN_LIST_FINI(t, element)
void * GWEN_DB_Values_Foreach(GWEN_DB_NODE *node, GWEN_DB_NODES_CB func, void *user_data)
GWEN_DB_NODE * GWEN_DB_ValueInt_new(int data)
void GWEN_DB_SetNodeFlags(GWEN_DB_NODE *n, uint32_t flags)
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
#define GWEN_DB_FLAGS_DEFAULT
void GWEN_DB_Node_Insert(GWEN_DB_NODE *parent, GWEN_DB_NODE *n)
GWEN_DB_NODE_TYPE GWEN_DB_GetValueType(GWEN_DB_NODE *n)
GWEN_DB_NODE * GWEN_DB_Var_new(const char *name)
unsigned int GWEN_DB_Values_Count(const GWEN_DB_NODE *node)
const char * GWEN_DB_GetCharValueFromNode(const GWEN_DB_NODE *n)