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:
53
sicsobj.c
53
sicsobj.c
@ -37,63 +37,63 @@ 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;
|
||||
hdbValue v;
|
||||
pDynString data = NULL;
|
||||
char *cmd;
|
||||
char *str, *value;
|
||||
|
||||
cmd = GetHdbProp(node, "creationCmd");
|
||||
if (cmd != NULL) {
|
||||
GetHdbPath(node, path, sizeof path);
|
||||
fprintf(fd, cmd, prefix, path);
|
||||
fprintf(fd, "\n");
|
||||
fprintf(fd, "%s\n", cmd);
|
||||
}
|
||||
if (GetHdbProperty(node, "__save", val, 20) == 1) {
|
||||
GetHipadabaPar(node, &v, NULL);
|
||||
data = formatValue(v, node);
|
||||
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);
|
||||
free(str);
|
||||
}
|
||||
ReleaseHdbValue(&v);
|
||||
}
|
||||
child = node->child;
|
||||
while (child != NULL) {
|
||||
snprintf(newprefix, 1024, "%s/%s", prefix, child->name);
|
||||
saveSICSNode(child, newprefix, fd);
|
||||
/* the separator is blank for the first subnode and slash further down */
|
||||
snprintf(p, sizeof p, "%s%c%s", prefix, separator, child->name);
|
||||
saveSICSNode(child, p, '/', fd);
|
||||
child = child->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int SaveSICSOBJ(void *data, char *name, FILE * fd)
|
||||
{
|
||||
pSICSOBJ self = (pSICSOBJ) data;
|
||||
char prefix[1024];
|
||||
char path[MAX_HDB_PATH];
|
||||
pHdb node;
|
||||
char *cmd;
|
||||
|
||||
if (self != NULL && self->objectNode != NULL) {
|
||||
node = self->objectNode->child;
|
||||
cmd = GetHdbProp(self->objectNode, "creationCmd");
|
||||
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;
|
||||
}
|
||||
saveSICSNode(self->objectNode, name, ' ', fd);
|
||||
fprintf(fd, "\n"); /* make a blank line between objects for prettiness */
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void KillSICSOBJfromNode(void *userData)
|
||||
{
|
||||
@ -557,6 +557,7 @@ pSICSOBJ SetupSICSOBJ(SConnection * pCon, SicsInterp * pSics, void *pData,
|
||||
if (strcasecmp(argv[0], "DynSicsObj") == 0) {
|
||||
/* make object dynamic by defining a creation command */
|
||||
SetDescriptorKey(pNew->pDes, "creationCommand", "0");
|
||||
SCparChange(pCon);
|
||||
}
|
||||
|
||||
SetHdbProperty(pNew->objectNode, "sicsdev", argv[1]);
|
||||
|
Reference in New Issue
Block a user