SaveSICSNode fulfills at the first time all of the 3 following requirements:
1) save the value af the topmost node 2) use hupdate instead of a set command for nodes marked with __save=update 3) save kids of nodes not saved
This commit is contained in:
59
sicsobj.c
59
sicsobj.c
@ -37,35 +37,48 @@ void DefaultFree(void *data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static void saveSICSNode(pHdb node, char *prefix, FILE * fd)
|
static void saveSICSNode(pHdb node, char *prefix, char separator, FILE * fd)
|
||||||
{
|
{
|
||||||
char newprefix[1024], val[20];
|
/*
|
||||||
char path[MAX_HDB_PATH];
|
nodes with the property __save are saved
|
||||||
|
special case:
|
||||||
|
__save=update: a hupdate command is used instead of a set command
|
||||||
|
*/
|
||||||
|
char val[20];
|
||||||
|
char p[MAX_HDB_PATH];
|
||||||
pHdb child;
|
pHdb child;
|
||||||
hdbValue v;
|
hdbValue v;
|
||||||
pDynString data = NULL;
|
pDynString data = NULL;
|
||||||
char *cmd;
|
char *cmd;
|
||||||
|
char *str, *value;
|
||||||
|
|
||||||
cmd = GetHdbProp(node, "creationCmd");
|
cmd = GetHdbProp(node, "creationCmd");
|
||||||
if (cmd != NULL) {
|
if (cmd != NULL) {
|
||||||
GetHdbPath(node, path, sizeof path);
|
fprintf(fd, "%s\n", cmd);
|
||||||
fprintf(fd, cmd, prefix, path);
|
|
||||||
fprintf(fd, "\n");
|
|
||||||
}
|
}
|
||||||
if (GetHdbProperty(node, "__save", val, 20) == 1) {
|
if (GetHdbProperty(node, "__save", val, 20) == 1) {
|
||||||
GetHipadabaPar(node, &v, NULL);
|
GetHipadabaPar(node, &v, NULL);
|
||||||
data = formatValue(v, node);
|
data = formatValue(v, node);
|
||||||
if (data != NULL) {
|
if (data != NULL) {
|
||||||
fprintf(fd, "%s %s\n", prefix, GetCharArray(data));
|
value = GetCharArray(data);
|
||||||
|
str = Arg2Tcl(1, &value, NULL, 0);
|
||||||
|
if (strcasecmp(val, "update") == 0) {
|
||||||
|
GetHdbPath(node, p, sizeof p);
|
||||||
|
fprintf(fd, "hupdate %s %s\n", p, str);
|
||||||
|
} else {
|
||||||
|
fprintf(fd, "%s %s\n", prefix, str);
|
||||||
|
}
|
||||||
DeleteDynString(data);
|
DeleteDynString(data);
|
||||||
|
free(str);
|
||||||
}
|
}
|
||||||
ReleaseHdbValue(&v);
|
ReleaseHdbValue(&v);
|
||||||
child = node->child;
|
}
|
||||||
while (child != NULL) {
|
child = node->child;
|
||||||
snprintf(newprefix, 1024, "%s/%s", prefix, child->name);
|
while (child != NULL) {
|
||||||
saveSICSNode(child, newprefix, fd);
|
/* the separator is blank for the first subnode and slash further down */
|
||||||
child = child->next;
|
snprintf(p, sizeof p, "%s%c%s", prefix, separator, child->name);
|
||||||
}
|
saveSICSNode(child, p, '/', fd);
|
||||||
|
child = child->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,27 +86,14 @@ static void saveSICSNode(pHdb node, char *prefix, FILE * fd)
|
|||||||
int SaveSICSOBJ(void *data, char *name, FILE * fd)
|
int SaveSICSOBJ(void *data, char *name, FILE * fd)
|
||||||
{
|
{
|
||||||
pSICSOBJ self = (pSICSOBJ) data;
|
pSICSOBJ self = (pSICSOBJ) data;
|
||||||
char prefix[1024];
|
|
||||||
char path[MAX_HDB_PATH];
|
|
||||||
pHdb node;
|
|
||||||
char *cmd;
|
|
||||||
|
|
||||||
if (self != NULL && self->objectNode != NULL) {
|
if (self != NULL && self->objectNode != NULL) {
|
||||||
node = self->objectNode->child;
|
saveSICSNode(self->objectNode, name, ' ', fd);
|
||||||
cmd = GetHdbProp(self->objectNode, "creationCmd");
|
fprintf(fd, "\n"); /* make a blank line between objects for prettiness */
|
||||||
if (cmd != NULL) {
|
|
||||||
GetHdbPath(self->objectNode, path, sizeof path);
|
|
||||||
fprintf(fd, cmd, name, path);
|
|
||||||
fprintf(fd, "\n");
|
|
||||||
}
|
|
||||||
while (node != NULL) {
|
|
||||||
snprintf(prefix, 1024, "%s %s", name, node->name);
|
|
||||||
saveSICSNode(node, prefix, fd);
|
|
||||||
node = node->next;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static void KillSICSOBJfromNode(void *userData)
|
static void KillSICSOBJfromNode(void *userData)
|
||||||
{
|
{
|
||||||
@ -557,6 +557,7 @@ pSICSOBJ SetupSICSOBJ(SConnection * pCon, SicsInterp * pSics, void *pData,
|
|||||||
if (strcasecmp(argv[0], "DynSicsObj") == 0) {
|
if (strcasecmp(argv[0], "DynSicsObj") == 0) {
|
||||||
/* make object dynamic by defining a creation command */
|
/* make object dynamic by defining a creation command */
|
||||||
SetDescriptorKey(pNew->pDes, "creationCommand", "0");
|
SetDescriptorKey(pNew->pDes, "creationCommand", "0");
|
||||||
|
SCparChange(pCon);
|
||||||
}
|
}
|
||||||
|
|
||||||
SetHdbProperty(pNew->objectNode, "sicsdev", argv[1]);
|
SetHdbProperty(pNew->objectNode, "sicsdev", argv[1]);
|
||||||
|
Reference in New Issue
Block a user