diff --git a/sicsobj.c b/sicsobj.c index b0f5db56..a6f4ecf7 100644 --- a/sicsobj.c +++ b/sicsobj.c @@ -20,8 +20,9 @@ static void DefaultKill(void *data){ return; } /*---------------------------------------------------------------------------*/ -pSICSOBJ MakeSICSOBJ(char *name, char *class){ +pSICSOBJ MakeSICSOBJv(char *name, char *class, int type, int priv){ pSICSOBJ pNew = NULL; + hdbValue val; pNew = (pSICSOBJ)malloc(sizeof(SICSOBJ)); if(pNew == NULL){ @@ -29,7 +30,13 @@ pSICSOBJ MakeSICSOBJ(char *name, char *class){ } memset(pNew,0,sizeof(SICSOBJ)); pNew->pDes = CreateDescriptor(class); - pNew->objectNode = MakeHipadabaNode(name, HIPNONE, 1); + if (type == HIPNONE) { + pNew->objectNode = MakeHipadabaNode(name, HIPNONE, 1); + } else { + val = makeHdbValue(type,0); + pNew->objectNode = MakeSICSHdbPar(name, priv, val); + ReleaseHdbValue(&val); + } if(pNew->pDes == NULL || pNew->objectNode == NULL){ free(pNew); return(NULL); @@ -39,6 +46,10 @@ pSICSOBJ MakeSICSOBJ(char *name, char *class){ return pNew; } /*---------------------------------------------------------------------------*/ +pSICSOBJ MakeSICSOBJ(char *name, char *class){ + return MakeSICSOBJv(name, class, HIPNONE, 0); +} +/*---------------------------------------------------------------------------*/ void KillSICSOBJ(void *data){ pSICSOBJ self = (pSICSOBJ)data; if(self == NULL){ @@ -126,7 +137,7 @@ static int ScriptObjFunc(pSICSOBJ obj, SConnection *pCon, pHdb commandNode, Tcl_DStringInit(&com); Tcl_DStringAppend(&com,value,strlen(value)); for(i = 0; i < nCount; i++){ - val = formatValue(par[i]->value); + val = formatValue(par[i]->value, par[i]); if(val != NULL){ Tcl_DStringAppend(&com," ", 1); pPtr = GetCharArray(val); @@ -209,12 +220,15 @@ int InvokeSICSOBJ(SConnection *pCon, SicsInterp *pSics, void *pData, SCWrite(pCon,"ERROR: Nothing to process",eError); return -1; } - parNode = GetHipadabaNode(self->objectNode,argv[1]); + if (argc == 1) { + parNode = self->objectNode; + } else { + parNode = GetHipadabaNode(self->objectNode,argv[1]); + } if(parNode != NULL && parNode->value.dataType == HIPFUNC){ status = invokeOBJFunction(self, parNode, pCon, argc-2, &argv[2]); } else { - strncpy(buffer,argv[0],130); - strcat(buffer," "); + snprintf(buffer, sizeof buffer, "%s ", argv[0]); status = ProcessSICSHdbPar(self->objectNode,pCon, buffer, argc-1,&argv[1]); } diff --git a/sicsobj.h b/sicsobj.h index 66889c8b..92bd4607 100644 --- a/sicsobj.h +++ b/sicsobj.h @@ -26,6 +26,7 @@ typedef int (*SICSOBJFunc)(pSICSOBJ self, SConnection *pCon, pHdb commandNode, pHdb par[], int nPar); /*======================= Live & Death =================================*/ pSICSOBJ MakeSICSOBJ(char *name, char *class); +pSICSOBJ MakeSICSOBJv(char *name, char *class, int type, int priv); void KillSICSOBJ(void *data); /** * This creates a new SICS object and installs it in the interpreter. It returns