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>
61#define GWEN_DB_NODE_FLAGS_MASK_INTERNAL 0xf0000000
62#define GWEN_DB_NODE_FLAGS_GROUP 0x80000000
102 unsigned int datasize)
109 n->dataSize=datasize;
111 assert(n->data.dataBin);
112 memmove(n->data.dataBin, data, datasize);
124 n->data.dataInt=data;
150 rv=snprintf(numbuffer,
sizeof(numbuffer)-1,
"%d", v);
151 if (rv>=(
int)
sizeof(numbuffer)) {
153 numbuffer[
sizeof(numbuffer)-1]=0;
167 n->data.dataPtr=data;
183 n->children=GWEN_DB_Node_List_new();
199 n->children=GWEN_DB_Node_List_new();
212 assert(parent->children!=
NULL);
213 GWEN_DB_Node_List_Add(n, parent->children);
238 assert(parent->children!=
NULL);
239 GWEN_DB_Node_List_Insert(n, parent->children);
268 GWEN_DB_Node_List_Del(n);
297 GWEN_DB_Node_List_free(n->children);
304 if (n->data.dataName) {
305 int l=strlen(n->data.dataName);
307 memset(n->data.dataName, 0, l);
313 if (n->data.dataChar) {
314 int l=strlen(n->data.dataChar);
316 memset(n->data.dataChar, 0, l);
321 if (n->data.dataBin && n->dataSize) {
322 memset(n->data.dataBin, 0, n->dataSize);
327 n->data.dataPtr=
NULL;
401 cn=GWEN_DB_Node_List_First(n->children);
412 cn=GWEN_DB_Node_List_Next(cn);
450 nn=GWEN_DB_Node_List_First(n->children);
454 nn=GWEN_DB_Node_List_Next(nn);
468 n=GWEN_DB_Node_List_Next(n);
472 n=GWEN_DB_Node_List_Next(n);
489 nn=GWEN_DB_Node_List_First(n->children);
493 nn=GWEN_DB_Node_List_Next(nn);
507 n=GWEN_DB_Node_List_Next(n);
511 n=GWEN_DB_Node_List_Next(n);
528 nn=GWEN_DB_Node_List_First(n->children);
534 nn=GWEN_DB_Node_List_Next(nn);
550 n=GWEN_DB_Node_List_Next(n);
556 n=GWEN_DB_Node_List_Next(n);
585 return n->data.dataChar;
616 return n->data.dataInt;
620 if (sscanf(p,
"%d", &res)!=1) {
645 return n->data.dataBin;
666 nn=GWEN_DB_Node_List_First(n->children);
669 if (strcasecmp(nn->data.dataName, name)==0) {
676 nn=GWEN_DB_Node_List_Next(nn);
700 nn=GWEN_DB_Node_List_First(n->children);
703 if (strcasecmp(nn->data.dataName, name)==0) {
710 nn=GWEN_DB_Node_List_Next(nn);
752 "Unconditionally creating variable \"%s\"", entry);
762 "Unconditionally creating group \"%s\"", entry);
789 "Variable \"%s\" does not exist", entry);
793 "Group \"%s\" does not exist", entry);
805 "Variable \"%s\" not found, creating", entry);
814 "Group \"%s\" not found, creating", entry);
856 GWEN_DB_Node_List_Clear(n->children);
880 assert(nn->children);
881 nn=GWEN_DB_Node_List_First(nn->children);
889 nn=GWEN_DB_Node_List_Next(nn);
981 "Value for \"%s\" not found, returning default value",
988 "Bad type for path \"%s\", returning default value",
992 return nn->data.dataChar;
1029 "Added char value \"%s\" to variable \"%s\"", val, path);
1066 "Added char value \"%s\" to variable \"%s\"", val, path);
1097 assert(nv->data.dataChar);
1099 res=strcasecmp(nv->data.dataChar, val)==0;
1101 res=strcmp(nv->data.dataChar, val)==0;
1104 "Value \"%s\" of var \"%s\" already exists",
1114 "Added char value \"%s\" to variable \"%s\"", val, path);
1143 assert(nv->data.dataChar);
1145 res=strcasecmp(nv->data.dataChar, val)==0;
1147 res=strcmp(nv->data.dataChar, val)==0;
1150 "Value \"%s\" of var \"%s\" already exists",
1176 "Value[%d] for \"%s\" not found, returning default value",
1183 return nn->data.dataInt;
1185 p=nn->data.dataChar;
1187 if (sscanf(p,
"%d", &res)!=1) {
1189 "String [%s] in node [%s] is not an int value", p, path);
1241 unsigned int defValSize,
1242 unsigned int *returnValueSize)
1246 assert(returnValueSize);
1250 "Value for \"%s\" not found, returning default value",
1252 *returnValueSize=defValSize;
1258 "Bad type for path \"%s\", returning default value",
1260 *returnValueSize=defValSize;
1263 *returnValueSize=nn->dataSize;
1264 return nn->data.dataBin;
1273 unsigned int valSize)
1316 "Value for \"%s\" not found, returning default value",
1323 "Bad type for path \"%s\", returning default value",
1327 return nn->data.dataPtr;
1415 return n->data.dataName;
1425 for (i=0; i<insert; i++)
1426 fprintf(stderr,
" ");
1431 fprintf(stderr,
"Group : \"%s\"\n", n->data.dataName);
1434 fprintf(stderr,
"Var : \"%s\"\n", n->data.dataName);
1437 fprintf(stderr,
"Value : \"%s\" (char)\n", n->data.dataChar);
1440 fprintf(stderr,
"Value : %d (int)\n", n->data.dataInt);
1448 buffer, (n->dataSize*2)+1)==0) {
1449 fprintf(stderr,
"Value : %d bytes (bin)\n", n->dataSize);
1452 fprintf(stderr,
"Value : %s (bin)\n", buffer);
1458 fprintf(stderr,
"Value : %p (ptr)\n", n->data.dataPtr);
1461 fprintf(stderr,
"[unknown node type %d]\n", n->typ);
1468 cn=GWEN_DB_Node_List_First(n->children);
1471 cn=GWEN_DB_Node_List_Next(cn);
1476 fprintf(stderr,
"[no node]\n");
1542 nn=GWEN_DB_Node_List_First(nn->children);
1547 nn=GWEN_DB_Node_List_Next(nn);
1677 res=(*func)(iter, user_data);
1690 unsigned int *a = user_data;
1699 unsigned int res = 0;
1718 res=(*func)(iter, user_data);
1731 unsigned int res = 0;
1750 res=(*func)(iter, user_data);
1763 unsigned int res = 0;
1773 return n->nodeFlags;
1797 flags=((flags^newflags)&(mask))^flags;
1815 flags=((flags^newflags)&(mask))^flags;
1818 cn=GWEN_DB_Node_List_First(n->children);
1821 cn=GWEN_DB_Node_List_Next(cn);
1849 nn=GWEN_DB_Node_List_First(n->children);
1854 nn=GWEN_DB_Node_List_Next(nn);
1893 nn=GWEN_DB_Node_List_First(n->children);
1898 nn=GWEN_DB_Node_List_Next(nn);
1935 return n->data.dataName;
2009 const char *valueString;
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
int GWEN_DB_ValueExists(GWEN_DB_NODE *n, const char *path, unsigned int i)
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
int GWEN_DB_SetPtrValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, void *val)
int GWEN_DB_ClearGroup(GWEN_DB_NODE *n, const char *path)
int GWEN_DB_DeleteVar(GWEN_DB_NODE *n, const char *path)
GWEN_DB_NODE * GWEN_DB_FindFirstVar(GWEN_DB_NODE *n, const char *name)
int GWEN_DB_VariableExists(GWEN_DB_NODE *n, const char *path)
GWEN_DB_NODE * GWEN_DB_Var_new(const char *name)
void GWEN_DB_VariableRename(GWEN_DB_NODE *n, const char *newname)
unsigned int GWEN_DB_Groups_Count(const GWEN_DB_NODE *node)
GWEN_DB_NODE * GWEN_DB_GetNextVar(GWEN_DB_NODE *n)
int GWEN_DB_SetCharValueInNode(GWEN_DB_NODE *n, const char *s)
void * GWEN_DB_GetPtrValue(GWEN_DB_NODE *n, const char *path, int idx, void *defVal)
void * GWEN_DB_Groups_Foreach(GWEN_DB_NODE *node, GWEN_DB_NODES_CB func, void *user_data)
GWEN_DB_NODE * GWEN_DB_FindNextGroup(GWEN_DB_NODE *n, const char *name)
int GWEN_DB_IsValue(const GWEN_DB_NODE *n)
GWEN_DB_NODE * GWEN_DB_GetValue(GWEN_DB_NODE *n, const char *path, int idx)
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
GWEN_DB_NODE * GWEN_DB_ValueChar_newFromInt(int v)
const char * GWEN_DB_GetCharValueFromNode(const GWEN_DB_NODE *n)
GWEN_DB_NODE * GWEN_DB_FindGroup(GWEN_DB_NODE *n, const char *name, int idx)
GWEN_DB_NODE_TYPE GWEN_DB_GetValueType(GWEN_DB_NODE *n)
void GWEN_DB_Node_InsertUnDirty(GWEN_DB_NODE *parent, GWEN_DB_NODE *n)
unsigned int GWEN_DB_Values_Count(const GWEN_DB_NODE *node)
int GWEN_DB_AddGroupChildren(GWEN_DB_NODE *n, GWEN_DB_NODE *nn)
void * GWEN_DB_Variables_Foreach(GWEN_DB_NODE *node, GWEN_DB_NODES_CB func, void *user_data)
int GWEN_DB_AddCharValue(GWEN_DB_NODE *n, const char *path, const char *val, int senseCase, int check)
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
GWEN_DB_NODE * GWEN_DB_GetNode(GWEN_DB_NODE *n, const char *path, uint32_t flags)
void * GWEN_DB_Values_Foreach(GWEN_DB_NODE *node, GWEN_DB_NODES_CB func, void *user_data)
GWEN_DB_NODE * GWEN_DB_FindVar(GWEN_DB_NODE *n, const char *name, int idx)
uint32_t GWEN_DB_GetNodeFlags(const GWEN_DB_NODE *n)
const char * GWEN_DB_GroupName(GWEN_DB_NODE *n)
int GWEN_DB_IsGroup(const GWEN_DB_NODE *n)
GWEN_DB_NODE * GWEN_DB_ValueInt_new(int data)
int GWEN_DB_InsertGroup(GWEN_DB_NODE *n, GWEN_DB_NODE *nn)
GWEN_DB_NODE * GWEN_DB_FindNextVar(GWEN_DB_NODE *n, const char *name)
int GWEN_DB_AddGroup(GWEN_DB_NODE *n, GWEN_DB_NODE *nn)
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
int GWEN_DB_SetCharValueFromInt(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
void GWEN_DB_ModifyBranchFlagsUp(GWEN_DB_NODE *n, uint32_t newflags, uint32_t mask)
void GWEN_DB_Node_Append(GWEN_DB_NODE *parent, GWEN_DB_NODE *n)
const void * GWEN_DB_GetBinValueFromNode(const GWEN_DB_NODE *n, unsigned int *size)
GWEN_DB_NODE * GWEN_DB_ValuePtr_new(void *data)
GWEN_DB_NODE * GWEN_DB_GetFirstGroup(GWEN_DB_NODE *n)
int GWEN_DB_DeleteGroup(GWEN_DB_NODE *n, const char *path)
void * GWEN_DB_count_cb(GWEN_UNUSED GWEN_DB_NODE *node, void *user_data)
GWEN_DB_NODE * GWEN_DB_FindFirstGroup(GWEN_DB_NODE *n, const char *name)
GWEN_DB_NODE * GWEN_DB_ValueChar_new(const char *data)
GWEN_DB_NODE * GWEN_DB_GetFirstVar(GWEN_DB_NODE *n)
int GWEN_DB_WriteVarValueToBuffer(GWEN_DB_NODE *db, const char *name, int index, GWEN_BUFFER *dstBuf)
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
GWEN_DB_NODE * GWEN_DB_GetParentGroup(GWEN_DB_NODE *n)
static int _writeVarValueToBuffer(GWEN_DB_NODE *db, const char *name, int index, GWEN_BUFFER *dstBuf)
void GWEN_DB_ClearNode(GWEN_DB_NODE *n)
GWEN_DB_NODE * GWEN_DB_ValueBin_new(const void *data, unsigned int datasize)
GWEN_DB_NODE * GWEN_DB_Node_new(GWEN_DB_NODE_TYPE t)
GWEN_DB_NODE_TYPE GWEN_DB_GetVariableType(GWEN_DB_NODE *n, const char *p)
int GWEN_DB_SetBinValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const void *val, unsigned int valSize)
GWEN_DB_NODE_TYPE GWEN_DB_GetValueTypeByPath(GWEN_DB_NODE *n, const char *path, unsigned int i)
void GWEN_DB_Node_Unlink(GWEN_DB_NODE *n)
GWEN_DB_NODE * GWEN_DB_Group_dup(const GWEN_DB_NODE *n)
void GWEN_DB_Node_Unlink_UnDirty(GWEN_DB_NODE *n)
const char * GWEN_DB_VariableName(GWEN_DB_NODE *n)
void GWEN_DB_Node_Insert(GWEN_DB_NODE *parent, GWEN_DB_NODE *n)
void GWEN_DB_SetNodeFlags(GWEN_DB_NODE *n, uint32_t flags)
void GWEN_DB_Node_Append_UnDirty(GWEN_DB_NODE *parent, GWEN_DB_NODE *n)
GWEN_DB_NODE * GWEN_DB_GetNextGroup(GWEN_DB_NODE *n)
const void * GWEN_DB_GetBinValue(GWEN_DB_NODE *n, const char *path, int idx, const void *defVal, unsigned int defValSize, unsigned int *returnValueSize)
GWEN_DB_NODE * GWEN_DB_GetNextValue(GWEN_DB_NODE *n)
void GWEN_DB_ModifyBranchFlagsDown(GWEN_DB_NODE *n, uint32_t newflags, uint32_t mask)
void * GWEN_DB_HandlePath(const char *entry, void *data, int idx, uint32_t flags)
void GWEN_DB_Node_free(GWEN_DB_NODE *n)
GWEN_DB_NODE * GWEN_DB_Node_dup(const GWEN_DB_NODE *n)
int GWEN_DB_ReplaceVars(GWEN_DB_NODE *db, const char *s, GWEN_BUFFER *dbuf)
unsigned int GWEN_DB_Variables_Count(const GWEN_DB_NODE *node)
void GWEN_DB_GroupRename(GWEN_DB_NODE *n, const char *newname)
int GWEN_DB_RemoveCharValue(GWEN_DB_NODE *n, const char *path, const char *val, int senseCase)
void GWEN_DB_Dump(GWEN_DB_NODE *n, int insert)
GWEN_DB_NODE * GWEN_DB_GetFirstValue(GWEN_DB_NODE *n)
int GWEN_DB_GetIntValue(GWEN_DB_NODE *n, const char *path, int idx, int defVal)
int GWEN_DB_IsVariable(const GWEN_DB_NODE *n)
void GWEN_DB_UnlinkGroup(GWEN_DB_NODE *n)
int GWEN_DB_GetIntValueFromNode(const GWEN_DB_NODE *n)
static int GWENHYWFAR_CB _replaceVarsCb(void *cbPtr, const char *name, int index, int maxLen, GWEN_BUFFER *dstBuf)
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
#define GWEN_DB_NODE_FLAGS_DIRTY
void *(* GWEN_DB_NODES_CB)(GWEN_DB_NODE *node, void *user_data)
#define GWEN_DB_FLAGS_INSERT
#define GWEN_DB_FLAGS_OVERWRITE_GROUPS
@ GWEN_DB_NodeType_ValueInt
@ GWEN_DB_NodeType_ValueChar
@ GWEN_DB_NodeType_ValuePtr
@ GWEN_DB_NodeType_ValueLast
@ GWEN_DB_NodeType_Unknown
@ GWEN_DB_NodeType_ValueBin
#define GWEN_DB_FLAGS_DEFAULT
#define GWEN_DB_FLAGS_OVERWRITE_VARS
#define GWEN_DB_NODE_FLAGS_SAFE
struct GWEN_DB_NODE GWEN_DB_NODE
#define DBG_DEBUG(dbg_logger, format, args...)
#define DBG_WARN(dbg_logger, format, args...)
#define DBG_VERBOUS(dbg_logger, format, args...)
#define DBG_INFO(dbg_logger, format, args...)
#define DBG_ERROR(dbg_logger, format, args...)
#define GWEN_ERROR_INVALID
#define GWEN_ERROR_NO_DATA
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
#define GWEN_LIST_FINI(t, element)
#define GWEN_LIST_FUNCTIONS(t, pr)
#define GWEN_LIST_INIT(t, element)
char * GWEN_Memory_strdup(const char *s)
void * GWEN_Memory_malloc(size_t wsize)
void GWEN_Memory_dealloc(void *p)
#define GWEN_FREE_OBJECT(varname)
#define GWEN_NEW_OBJECT(typ, varname)
void * GWEN_Path_HandleWithIdx(const char *path, void *data, uint32_t flags, GWEN_PATHIDXHANDLERPTR elementFunction)
#define GWEN_PATH_FLAGS_CREATE_GROUP
#define GWEN_PATH_FLAGS_PATHMUSTEXIST
#define GWEN_PATH_FLAGS_PATHCREATE
#define GWEN_PATH_FLAGS_NAMEMUSTNOTEXIST
#define GWEN_PATH_FLAGS_CREATE_VAR
#define GWEN_PATH_FLAGS_LAST
#define GWEN_PATH_FLAGS_PATHMUSTNOTEXIST
#define GWEN_PATH_FLAGS_VARIABLE
#define GWEN_PATH_FLAGS_NAMEMUSTEXIST
int GWEN_Text_ReplaceVars(const char *s, GWEN_BUFFER *dbuf, GWEN_TEXT_REPLACE_VARS_CB fn, void *ptr)
int GWEN_Text_ComparePattern(const char *w, const char *p, int sensecase)
char * GWEN_Text_ToHex(const char *src, unsigned l, char *buffer, unsigned int maxsize)
int GWEN_Text_NumToString(int num, char *buffer, unsigned int bufsize, int fillchar)