- removed functions with void *data in the interface
- added GetHdbProp
This commit is contained in:
270
hipadaba.c
270
hipadaba.c
@@ -20,6 +20,7 @@ static char get[] = {"get"};
|
||||
static char update[] = {"update"};
|
||||
static char treeChange[] = {"treeChange"};
|
||||
static char dataSearch[] = {"dataSearch"};
|
||||
static char killNode[] = {"killNode"};
|
||||
/*------------------------------------------------------------------------*/
|
||||
pHdbDataMessage GetHdbSetMessage(pHdbMessage toTest){
|
||||
if(toTest->type == set){
|
||||
@@ -55,6 +56,13 @@ pHdbDataSearch GetHdbDataSearchMessage(pHdbMessage toTest){
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
pHdbMessage GetHdbKillNodeMessage(pHdbMessage toTest){
|
||||
if(toTest->type == killNode){
|
||||
return toTest;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
/*================== internal functions ===================================*/
|
||||
void DeleteCallbackChain(pHdbCallback root){
|
||||
pHdbCallback current = NULL, thisEntry;
|
||||
@@ -106,26 +114,18 @@ void DeleteNodeData(pHdb node){
|
||||
free(node);
|
||||
}
|
||||
/*------------------------------------------------------------------------*/
|
||||
static pHdbCallback CleanCallbackChain(pHdbCallback chain){
|
||||
pHdbCallback head = chain;
|
||||
pHdbCallback current = chain;
|
||||
static pHdbCallback CleanCallbackChain(pHdbCallback head){
|
||||
pHdbCallback current = head;
|
||||
pHdbCallback next;
|
||||
pHdbCallback *ptr2last = &head;
|
||||
|
||||
while(current != NULL){
|
||||
if(current->killFlag == 1){
|
||||
next = current->next;
|
||||
if(current == head){
|
||||
head = next;
|
||||
}
|
||||
/*
|
||||
* unlink
|
||||
*/
|
||||
if(next != NULL){
|
||||
next->previous = current->previous;
|
||||
}
|
||||
if(current->previous != NULL){
|
||||
current->previous->next = next;
|
||||
}
|
||||
*ptr2last = next;
|
||||
/*
|
||||
* delete
|
||||
*/
|
||||
@@ -138,6 +138,7 @@ static pHdbCallback CleanCallbackChain(pHdbCallback chain){
|
||||
*/
|
||||
current = next;
|
||||
} else {
|
||||
ptr2last = ¤t->next;
|
||||
current = current->next;
|
||||
}
|
||||
}
|
||||
@@ -209,19 +210,6 @@ int CountHdbChildren(pHdb node){
|
||||
}
|
||||
return count;
|
||||
}
|
||||
/*-----------------------------------------------------------------------*/
|
||||
static void RemoveCallbackNode(pHdbCallback victim){
|
||||
if(victim->previous != NULL) {
|
||||
victim->previous->next = victim->next;
|
||||
}
|
||||
if(victim->next != NULL){
|
||||
victim->next->previous = victim->previous;
|
||||
}
|
||||
if(victim->killFunc != NULL){
|
||||
victim->killFunc(victim->userData);
|
||||
}
|
||||
free(victim);
|
||||
}
|
||||
/*----------------------------------------------------------------------*/
|
||||
char *hdbTrim(char *str)
|
||||
{
|
||||
@@ -297,6 +285,7 @@ hdbValue makeHdbValue(int datatype, int length){
|
||||
|
||||
memset(&val,0,sizeof(hdbValue));
|
||||
val.dataType = datatype;
|
||||
val.doNotFree = 0;
|
||||
|
||||
switch(datatype){
|
||||
case HIPINTAR:
|
||||
@@ -322,63 +311,6 @@ hdbValue makeHdbValue(int datatype, int length){
|
||||
}
|
||||
return val;
|
||||
}
|
||||
/*------------------------------------------------------------------------*/
|
||||
hdbValue makeHdbData(int datatype, int length, void *data){
|
||||
hdbValue val;
|
||||
|
||||
memset(&val,0,sizeof(hdbValue));
|
||||
val.dataType = datatype;
|
||||
|
||||
switch(datatype){
|
||||
case HIPINT:
|
||||
if(data != NULL){
|
||||
memcpy(&val.v.intValue,data,sizeof(int));
|
||||
}
|
||||
break;
|
||||
case HIPFLOAT:
|
||||
if(data != NULL){
|
||||
memcpy(&val.v.doubleValue,data,sizeof(double));
|
||||
}
|
||||
break;
|
||||
case HIPINTAR:
|
||||
case HIPINTVARAR:
|
||||
val.arrayLength = length;
|
||||
val.v.intArray = malloc(length*sizeof(int));
|
||||
if(val.v.intArray != NULL){
|
||||
memset(val.v.intArray,0,length*sizeof(int));
|
||||
}
|
||||
if(data != NULL){
|
||||
memcpy(val.v.intArray,data,length*sizeof(int));
|
||||
}
|
||||
break;
|
||||
case HIPFLOATAR:
|
||||
case HIPFLOATVARAR:
|
||||
val.arrayLength = length;
|
||||
val.v.floatArray = malloc(length*sizeof(double));
|
||||
if(val.v.floatArray != NULL){
|
||||
memset(val.v.floatArray,0,length*sizeof(double));
|
||||
}
|
||||
if(data != NULL){
|
||||
memcpy(val.v.floatArray,data,length*sizeof(double));
|
||||
}
|
||||
break;
|
||||
case HIPTEXT:
|
||||
if(data != NULL){
|
||||
val.v.text = strdup((char *)data);
|
||||
} else {
|
||||
val.v.text = strdup("UNKNOWN");
|
||||
}
|
||||
val.arrayLength = strlen(val.v.text);
|
||||
break;
|
||||
case HIPOBJ:
|
||||
val.v.obj = data;
|
||||
break;
|
||||
case HIPFUNC:
|
||||
val.v.obj = data;
|
||||
break;
|
||||
}
|
||||
return val;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
hdbValue MakeHdbInt(int initValue){
|
||||
hdbValue result;
|
||||
@@ -402,7 +334,7 @@ hdbValue MakeHdbText(char *initText){
|
||||
hdbValue result;
|
||||
|
||||
result.dataType = HIPTEXT;
|
||||
result.v.text = strdup(initText);
|
||||
result.v.text = initText; /* no strdup here ! */
|
||||
result.arrayLength = strlen(initText);
|
||||
return result;
|
||||
}
|
||||
@@ -425,6 +357,22 @@ hdbValue MakeHdbFloatArray(int length, double *data){
|
||||
return result;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
hdbValue MakeHdbFunc(voidFunc *func){
|
||||
hdbValue result;
|
||||
|
||||
result.dataType = HIPFUNC;
|
||||
result.v.func = func;
|
||||
return result;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
hdbValue MakeHdbObj(void *obj){
|
||||
hdbValue result;
|
||||
|
||||
result.dataType = HIPOBJ;
|
||||
result.v.obj = obj;
|
||||
return result;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
void ReleaseHdbValue(hdbValue *v){
|
||||
|
||||
if(v->doNotFree == 1){
|
||||
@@ -516,13 +464,19 @@ int compareHdbValue(hdbValue v1, hdbValue v2){
|
||||
return 1;
|
||||
break;
|
||||
case HIPOBJ:
|
||||
case HIPFUNC:
|
||||
if(v2.v.obj == v1.v.obj) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case HIPFUNC:
|
||||
if(v2.v.func == v1.v.func) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
@@ -561,9 +515,11 @@ int getHdbValueLength(hdbValue v){
|
||||
length = strlen(v.v.text);
|
||||
break;
|
||||
case HIPOBJ:
|
||||
case HIPFUNC:
|
||||
length = sizeof(void *);
|
||||
break;
|
||||
case HIPFUNC:
|
||||
length = sizeof(voidFunc *);
|
||||
break;
|
||||
}
|
||||
return length;
|
||||
}
|
||||
@@ -639,11 +595,15 @@ void AddHipadabaChild(pHdb parent, pHdb child, void *callData){
|
||||
/*--------------------------------------------------------------------------*/
|
||||
void DeleteHipadabaNode(pHdb node, void *callData){
|
||||
pHdb current = NULL, tmp = NULL;
|
||||
hdbMessage killNodeMsg;
|
||||
|
||||
if(node == NULL){
|
||||
return;
|
||||
}
|
||||
|
||||
killNodeMsg.type = killNode;
|
||||
InvokeCallbackChain(node, &killNodeMsg);
|
||||
|
||||
RemoveHdbNodeFromParent(node, callData);
|
||||
|
||||
DeleteNodeData(node);
|
||||
@@ -765,35 +725,28 @@ void AppendHipadabaCallback(pHdb node, pHdbCallback newCB){
|
||||
|
||||
assert(node);
|
||||
current = node->callBackChain;
|
||||
newCB->next = NULL;
|
||||
if(current == NULL){
|
||||
node->callBackChain = newCB;
|
||||
return;
|
||||
}
|
||||
if(current != NULL){
|
||||
while(current->next != NULL){
|
||||
current = (pHdbCallback)current->next;
|
||||
}
|
||||
current->next= newCB;
|
||||
newCB->previous = current;
|
||||
while(current->next != NULL){
|
||||
current = (pHdbCallback)current->next;
|
||||
}
|
||||
current->next = newCB;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void PrependHipadabaCallback(pHdb node,pHdbCallback newCB){
|
||||
assert(node != NULL);
|
||||
|
||||
newCB->next = node->callBackChain;
|
||||
if(node->callBackChain != NULL){
|
||||
node->callBackChain->previous = newCB;
|
||||
}
|
||||
node->callBackChain = newCB;
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void *FindHdbCallbackData(pHdb node, hdbCallbackFunction func,
|
||||
void *userPtr){
|
||||
void *FindHdbCallbackData(pHdb node, void *userPtr){
|
||||
hdbDataSearch dsm;
|
||||
|
||||
dsm.type = dataSearch;
|
||||
dsm.testFunc = func;
|
||||
dsm.testPtr = userPtr;
|
||||
dsm.result = NULL;
|
||||
|
||||
@@ -887,9 +840,11 @@ int copyHdbValue(hdbValue *source, hdbValue *target){
|
||||
}
|
||||
break;
|
||||
case HIPOBJ:
|
||||
case HIPFUNC:
|
||||
target->v.obj = source->v.obj;
|
||||
break;
|
||||
case HIPFUNC:
|
||||
target->v.func = source->v.func;
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
* unknown data type
|
||||
@@ -903,21 +858,16 @@ int copyHdbValue(hdbValue *source, hdbValue *target){
|
||||
static int SendDataMessage(pHdb node, char *type,
|
||||
hdbValue v, void *callData){
|
||||
hdbDataMessage dataMes;
|
||||
|
||||
if(strstr(type,"set") != NULL){
|
||||
dataMes.type = set;
|
||||
} else if(strstr(type,"get") != NULL){
|
||||
dataMes.type = get;
|
||||
} else if(strstr(type,"update") != NULL){
|
||||
dataMes.type = update;
|
||||
}
|
||||
|
||||
assert(type == set || type == get || type == update);
|
||||
dataMes.type = type;
|
||||
dataMes.v = &v;
|
||||
dataMes.callData = callData;
|
||||
return InvokeCallbackChain(node, (pHdbMessage)&dataMes);
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int SetHipadabaPar(pHdb node, hdbValue v, void *callData){
|
||||
return SendDataMessage(node, set, v,callData);
|
||||
return SendDataMessage(node, set, v,callData);
|
||||
}
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
int UpdateHipadabaPar(pHdb node, hdbValue v, void *callData){
|
||||
@@ -939,6 +889,7 @@ int GetHipadabaPar(pHdb node, hdbValue *v, void *callData){
|
||||
int status;
|
||||
|
||||
v->dataType = node->value.dataType;
|
||||
v->doNotFree = 0;
|
||||
v->v.text = NULL; /* this sets all pointers in the union to NULL */
|
||||
|
||||
status = SendDataMessage(node, get, *v,callData);
|
||||
@@ -960,103 +911,6 @@ static int calcDataLength(pHdb node, int testLength){
|
||||
}
|
||||
return length;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int SetHdbPar(pHdb node, int dataType, void *data, int length,
|
||||
void *callData){
|
||||
int status;
|
||||
hdbValue v;
|
||||
|
||||
if(node->value.dataType == HIPNONE){
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(dataType != node->value.dataType){
|
||||
return HDBTYPEMISMATCH;
|
||||
}
|
||||
if(length != calcDataLength(node,length)){
|
||||
return HDBLENGTHMISMATCH;
|
||||
}
|
||||
|
||||
v = makeHdbData(dataType, length, data);
|
||||
status = SetHipadabaPar(node, v, callData);
|
||||
ReleaseHdbValue(&v);
|
||||
return status;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int UpdateHdbPar(pHdb node, int dataType, void *data, int length,
|
||||
void *callData){
|
||||
int status;
|
||||
hdbValue v;
|
||||
|
||||
if(node->value.dataType == HIPNONE){
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(dataType != node->value.dataType){
|
||||
return HDBTYPEMISMATCH;
|
||||
}
|
||||
if(length != calcDataLength(node,length)){
|
||||
return HDBLENGTHMISMATCH;
|
||||
}
|
||||
|
||||
v = makeHdbData(dataType,length,data);
|
||||
status = UpdateHipadabaPar(node,v,callData);
|
||||
ReleaseHdbValue(&v);
|
||||
return status;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
int GetHdbPar(pHdb node, int dataType, void *data, int length,
|
||||
void *callData){
|
||||
int status, toCopy;
|
||||
hdbValue v;
|
||||
|
||||
if(dataType != node->value.dataType){
|
||||
return HDBTYPEMISMATCH;
|
||||
}
|
||||
|
||||
if(length != calcDataLength(node,length)){
|
||||
return HDBLENGTHMISMATCH;
|
||||
}
|
||||
|
||||
status = GetHipadabaPar(node, &v, callData);
|
||||
if(status != 1 ){
|
||||
return status;
|
||||
}
|
||||
switch(dataType){
|
||||
case HIPNONE:
|
||||
break;
|
||||
case HIPINT:
|
||||
memcpy(data,&node->value.v.intValue,sizeof(int));
|
||||
break;
|
||||
case HIPFLOAT:
|
||||
memcpy(data,&node->value.v.doubleValue,sizeof(double));
|
||||
break;
|
||||
case HIPINTAR:
|
||||
case HIPINTVARAR:
|
||||
memcpy(data,node->value.v.intArray,
|
||||
node->value.arrayLength*sizeof(int));
|
||||
break;
|
||||
case HIPTEXT:
|
||||
toCopy = strlen(node->value.v.text);
|
||||
if(toCopy > length){
|
||||
toCopy = length;
|
||||
}
|
||||
memcpy(data,&node->value.v.text, toCopy);
|
||||
break;
|
||||
case HIPFLOATAR:
|
||||
case HIPFLOATVARAR:
|
||||
memcpy(data,node->value.v.floatArray,
|
||||
node->value.arrayLength*sizeof(double));
|
||||
break;
|
||||
case HIPOBJ:
|
||||
memcpy(data,&node->value.v.obj,sizeof(void *));
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/*============================= Property Functions ==========================*/
|
||||
void SetHdbProperty(pHdb node, char *key, char *value){
|
||||
if(node != NULL && key != NULL && node->properties != NULL){
|
||||
@@ -1076,6 +930,14 @@ int GetHdbProperty(pHdb node, char *key, char *value, int len){
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
char *GetHdbProp(pHdb node, char *key){
|
||||
if(node != NULL && node->properties != NULL){
|
||||
return StringDictGetShort(node->properties,key);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void InitHdbPropertySearch(pHdb node){
|
||||
if(node != NULL && node->properties != NULL){
|
||||
StringDictKillScan(node->properties);
|
||||
|
||||
Reference in New Issue
Block a user