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:
zolliker
2013-06-07 06:38:17 +00:00
parent 565f96b5ca
commit db963166df

View File

@ -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; 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; child = node->child;
while (child != NULL) { while (child != NULL) {
snprintf(newprefix, 1024, "%s/%s", prefix, child->name); /* the separator is blank for the first subnode and slash further down */
saveSICSNode(child, newprefix, fd); snprintf(p, sizeof p, "%s%c%s", prefix, separator, child->name);
saveSICSNode(child, p, '/', fd);
child = child->next; child = child->next;
} }
} }
}
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
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]);