From db963166df131bb345ffb00146e355f82a941d45 Mon Sep 17 00:00:00 2001 From: zolliker Date: Fri, 7 Jun 2013 06:38:17 +0000 Subject: [PATCH] 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 --- sicsobj.c | 61 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/sicsobj.c b/sicsobj.c index 2201504b..f3d43668 100644 --- a/sicsobj.c +++ b/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; 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); - child = child->next; - } + } + child = node->child; + while (child != NULL) { + /* 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; } } @@ -73,27 +86,14 @@ static void saveSICSNode(pHdb node, char *prefix, FILE * fd) 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]);