PSI sics-cvs-psi-2006
This commit is contained in:
238
nxscript.c
238
nxscript.c
@@ -29,12 +29,12 @@
|
||||
#include "udpquieck.h"
|
||||
#include "nxdict.h"
|
||||
#include "nxscript.h"
|
||||
/*============== a personal data structure ============================*/
|
||||
typedef struct {
|
||||
pObjectDescriptor pDes;
|
||||
NXhandle fileHandle;
|
||||
NXdict dictHandle;
|
||||
} NXScript, *pNXScript;
|
||||
#include "sicsdata.h"
|
||||
|
||||
extern char *trim(char *str);
|
||||
|
||||
/* missing in nxdict.h: */
|
||||
NXstatus NXDdefget(NXdict handle, char *pKey, char *pBuffer, int iBufLen);
|
||||
/*------------------------------------------------------------------------*/
|
||||
char *makeFilename(SicsInterp *pSics, SConnection *pCon) {
|
||||
pSicsVariable pPath = NULL, pPref = NULL, pEnd = NULL;
|
||||
@@ -64,7 +64,7 @@ char *makeFilename(SicsInterp *pSics, SConnection *pCon) {
|
||||
/* find length */
|
||||
iLen = strlen(pPath->text) + 4; /* extra 4 for dir number */
|
||||
iLen += strlen(pPref->text);
|
||||
iLen += 9; /* for number + year */
|
||||
iLen += 10; /* for number + year */
|
||||
iLen += strlen(pEnd->text);
|
||||
iLen += 10; /* safety margin */
|
||||
|
||||
@@ -109,12 +109,23 @@ char *makeFilename(SicsInterp *pSics, SConnection *pCon) {
|
||||
sprintf(pNumText,"%4.4d",iYear);
|
||||
strcat(pRes,pNumText);
|
||||
strcat(pRes,"n");
|
||||
sprintf(pNumText,"%5.5d",iNum);
|
||||
sprintf(pNumText,"%6.6d",iNum);
|
||||
strcat(pRes,pNumText);
|
||||
strcat(pRes,pEnd->text);
|
||||
|
||||
return pRes;
|
||||
}
|
||||
/*---------------------------------------------------------------------*/
|
||||
void changeExtension(char *filename, char *newExtension){
|
||||
char *pPtr = NULL;
|
||||
|
||||
pPtr = strrchr(filename,(int)'.');
|
||||
assert(pPtr != NULL);
|
||||
|
||||
pPtr++;
|
||||
assert(strlen(pPtr) >= strlen(newExtension));
|
||||
strcpy(pPtr,newExtension);
|
||||
}
|
||||
/*======================== Action =======================================*/
|
||||
static int handleFileOperations(SConnection *pCon, pNXScript self,
|
||||
int argc, char *argv[]){
|
||||
@@ -149,13 +160,15 @@ static int handleFileOperations(SConnection *pCon, pNXScript self,
|
||||
} else if(strcmp(argv[1],"create5") == 0){
|
||||
access = NXACC_CREATE5;
|
||||
unlink(argv[2]); /* kill file for overwrite */
|
||||
} else if(strcmp(argv[1],"createxml") == 0){
|
||||
access = NXACC_CREATEXML;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
if(argc < 4){
|
||||
SCWrite(pCon,"ERROR: insufficient number of arguments for file operation",
|
||||
eError);
|
||||
return 1;
|
||||
return -1;
|
||||
}
|
||||
/*
|
||||
be considerate: close files left open
|
||||
@@ -175,11 +188,13 @@ static int handleFileOperations(SConnection *pCon, pNXScript self,
|
||||
if(status != NX_OK){
|
||||
sprintf(buffer,"ERROR: failed to open %s",argv[2]);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
return -1;
|
||||
}
|
||||
status = NXDinitfromfile(argv[3],&self->dictHandle);
|
||||
if(status != NX_OK){
|
||||
sprintf(buffer,"ERROR: failed to open dictionary %s",argv[3]);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
return -1;
|
||||
}
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
@@ -256,6 +271,7 @@ static void putCounter(SConnection *pCon, SicsInterp *pSics, pNXScript self,
|
||||
eError);
|
||||
return;
|
||||
}
|
||||
memset(dummy,0,80*sizeof(char));
|
||||
|
||||
/*
|
||||
find counter
|
||||
@@ -327,6 +343,36 @@ static void putCounter(SConnection *pCon, SicsInterp *pSics, pNXScript self,
|
||||
return;
|
||||
}
|
||||
/*----------------------------------------------------------------------*/
|
||||
static void putSicsData(SConnection *pCon, SicsInterp *pSics,
|
||||
pNXScript self, int argc, char *argv[]){
|
||||
|
||||
pSICSData data = NULL;
|
||||
int status;
|
||||
char buffer[256];
|
||||
|
||||
if(argc < 4){
|
||||
SCWrite(pCon,"ERROR: insufficient number of arguments to putSicsData",
|
||||
eError);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
find data
|
||||
*/
|
||||
data = (pSICSData)FindCommandData(pSics,argv[3],"SICSData");
|
||||
if(data == NULL){
|
||||
snprintf(buffer,255,"ERROR: sicsdata %s not found!", argv[3]);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
return;
|
||||
}
|
||||
|
||||
status = NXDputalias(self->fileHandle,self->dictHandle,argv[2],data->data);
|
||||
if(status != NX_OK){
|
||||
sprintf(buffer,"ERROR: failed to write sicsdata to %s", argv[2]);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------*/
|
||||
static void updateHMDim(NXScript *self, pHistMem mem){
|
||||
int iDim[MAXDIM];
|
||||
int i, rank, timeLength, status;
|
||||
@@ -566,9 +612,10 @@ static void putTimeBinning(SConnection *pCon, SicsInterp *pSics,
|
||||
pNXScript self,
|
||||
int argc, char *argv[]){
|
||||
pHistMem mem = NULL;
|
||||
int status, timeLength;
|
||||
int i, status, timeLength;
|
||||
char buffer[256], defString[512], dummy[40];
|
||||
const float *timeBin;
|
||||
float *timeCopy = NULL;
|
||||
|
||||
if(argc < 4){
|
||||
SCWrite(pCon,"ERROR: insufficient number of arguments to puttimebinning",
|
||||
@@ -601,10 +648,25 @@ static void putTimeBinning(SConnection *pCon, SicsInterp *pSics,
|
||||
sprintf(defString,"%s -dim {%d} ",buffer,timeLength);
|
||||
|
||||
/*
|
||||
write
|
||||
*/
|
||||
status = NXDputdef(self->fileHandle, self->dictHandle,
|
||||
defString,(void *)timeBin);
|
||||
Divide the time binning when appropriate and write
|
||||
*/
|
||||
if(self->timeDivisor != 1){
|
||||
timeCopy = (float *)malloc(timeLength*sizeof(float));
|
||||
if(timeCopy == NULL){
|
||||
SCWrite(pCon,"ERROR: out of memory writing time binning",eError);
|
||||
return;
|
||||
}
|
||||
for(i = 0; i < timeLength; i++){
|
||||
timeCopy[i] = timeBin[i]/self->timeDivisor;
|
||||
}
|
||||
status = NXDputdef(self->fileHandle, self->dictHandle,
|
||||
defString,(void *)timeCopy);
|
||||
free(timeCopy);
|
||||
} else {
|
||||
status = NXDputdef(self->fileHandle, self->dictHandle,
|
||||
defString,(void *)timeBin);
|
||||
}
|
||||
|
||||
if(status != NX_OK){
|
||||
sprintf(buffer,"ERROR: failed to write time binning");
|
||||
SCWrite(pCon,buffer,eError);
|
||||
@@ -635,7 +697,7 @@ static void putArray(SConnection *pCon, SicsInterp *pSics,
|
||||
get array length
|
||||
*/
|
||||
status = Tcl_GetInt(tcl,argv[4],&length);
|
||||
if(status = TCL_OK){
|
||||
if(status != TCL_OK){
|
||||
sprintf(buffer,"ERROR: failed to convert %s to integer",argv[4]);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
return;
|
||||
@@ -658,10 +720,10 @@ static void putArray(SConnection *pCon, SicsInterp *pSics,
|
||||
*/
|
||||
for(i = 0; i < length; i++){
|
||||
sprintf(num,"%d",i);
|
||||
varData = Tcl_GetVar2(tcl,argv[3],num,0);
|
||||
varData = (char *)Tcl_GetVar2(tcl,argv[3],num,0);
|
||||
if(varData != NULL){
|
||||
status = Tcl_GetDouble(tcl,varData,&dVal);
|
||||
if(status = TCL_OK){
|
||||
if(status != TCL_OK){
|
||||
sprintf(buffer,"ERROR: failed to convert %s to double",
|
||||
varData);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
@@ -698,6 +760,91 @@ static void putArray(SConnection *pCon, SicsInterp *pSics,
|
||||
SCSendOK(pCon);
|
||||
}
|
||||
/*----------------------------------------------------------------------*/
|
||||
static void putIntArray(SConnection *pCon, SicsInterp *pSics,
|
||||
pNXScript self,
|
||||
int argc, char *argv[]){
|
||||
int *data = NULL;
|
||||
int length, i, status;
|
||||
char num[20];
|
||||
char buffer[256], defString[512], *varData;
|
||||
Tcl_Interp *tcl = NULL;
|
||||
int iVal;
|
||||
|
||||
if(argc < 5){
|
||||
SCWrite(pCon,"ERROR: insufficient number of arguments to array",
|
||||
eError);
|
||||
return;
|
||||
}
|
||||
tcl = InterpGetTcl(pSics);
|
||||
assert(tcl != NULL);
|
||||
|
||||
/*
|
||||
get array length
|
||||
*/
|
||||
status = Tcl_GetInt(tcl,argv[4],&length);
|
||||
if(status != TCL_OK){
|
||||
sprintf(buffer,"ERROR: failed to convert %s to integer",argv[4]);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
allocate
|
||||
*/
|
||||
if(length > 0){
|
||||
data = (int *)malloc(length*sizeof(int));
|
||||
}
|
||||
if(data == NULL){
|
||||
SCWrite(pCon,"ERROR: out of memory or invalid length",eError);
|
||||
return;
|
||||
}
|
||||
memset(data,0,length*sizeof(int));
|
||||
|
||||
/*
|
||||
try getting data
|
||||
*/
|
||||
for(i = 0; i < length; i++){
|
||||
sprintf(num,"%d",i);
|
||||
varData = (char *)Tcl_GetVar2(tcl,argv[3],num,0);
|
||||
if(varData != NULL){
|
||||
status = Tcl_GetInt(tcl,varData,&iVal);
|
||||
if(status != TCL_OK){
|
||||
sprintf(buffer,"ERROR: failed to convert %s to int",
|
||||
varData);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
}
|
||||
data[i] = iVal;
|
||||
} else {
|
||||
snprintf(buffer,254,"WARNING: failed to find array element %d", i);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
build definition string
|
||||
*/
|
||||
status = NXDdefget(self->dictHandle,argv[2],buffer,254);
|
||||
if(!status){
|
||||
sprintf(buffer,"ERROR: alias %s for array not found",
|
||||
argv[2]);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
free(data);
|
||||
return;
|
||||
}
|
||||
snprintf(defString,511,"%s -dim {%d} ",buffer,length);
|
||||
|
||||
/*
|
||||
write it!
|
||||
*/
|
||||
status = NXDputdef(self->fileHandle,self->dictHandle,defString,data);
|
||||
if(status != NX_OK){
|
||||
sprintf(buffer,"ERROR: failed to write array");
|
||||
SCWrite(pCon,buffer,eError);
|
||||
}
|
||||
free(data);
|
||||
SCSendOK(pCon);
|
||||
}
|
||||
/*----------------------------------------------------------------------*/
|
||||
static void putGlobal(SConnection *pCon, SicsInterp *pSics,
|
||||
pNXScript self,
|
||||
int argc, char *argv[]){
|
||||
@@ -721,7 +868,7 @@ static void putGlobal(SConnection *pCon, SicsInterp *pSics,
|
||||
/*-----------------------------------------------------------------------*/
|
||||
static int handlePut(SConnection *pCon, SicsInterp *pSics, pNXScript self,
|
||||
int argc, char *argv[]){
|
||||
int status;
|
||||
int status, iVal;
|
||||
char buffer[1024], defString[1024], numBuf[25];
|
||||
double dVal;
|
||||
float fVal;
|
||||
@@ -749,14 +896,36 @@ static int handlePut(SConnection *pCon, SicsInterp *pSics, pNXScript self,
|
||||
SCWrite(pCon,buffer,eError);
|
||||
}
|
||||
return 1;
|
||||
} else if(strcmp(argv[1],"putint") == 0){
|
||||
if(argc < 4){
|
||||
SCWrite(pCon,"ERROR: insufficient number of arguments to putint",
|
||||
eError);
|
||||
return 1;
|
||||
}
|
||||
status = Tcl_GetInt(InterpGetTcl(pSics),argv[3],&iVal);
|
||||
if(status != TCL_OK){
|
||||
sprintf(buffer,"ERROR: failed to convert %s to int",
|
||||
argv[3]);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
return 1;
|
||||
}
|
||||
status = NXDputalias(self->fileHandle, self->dictHandle,
|
||||
argv[2],&iVal);
|
||||
if(status != NX_OK){
|
||||
sprintf(buffer,"ERROR: failed to write %d to alias %s",
|
||||
iVal, argv[2]);
|
||||
SCWrite(pCon,buffer,eError);
|
||||
}
|
||||
return 1;
|
||||
} else if (strcmp(argv[1],"puttext") == 0){
|
||||
/*====================*/
|
||||
if(argc < 4){
|
||||
SCWrite(pCon,"ERROR: insufficient number of arguments to putfloat",
|
||||
SCWrite(pCon,"ERROR: insufficient number of arguments to puttext",
|
||||
eError);
|
||||
return 1;
|
||||
}
|
||||
Arg2Text(argc-3,&argv[3],buffer,1023);
|
||||
trim(buffer);
|
||||
status = NXDdefget(self->dictHandle,argv[2],defString,1023);
|
||||
if(status != NX_OK){
|
||||
sprintf(buffer,"ERROR: alias %s not found in puttext",
|
||||
@@ -800,9 +969,15 @@ static int handlePut(SConnection *pCon, SicsInterp *pSics, pNXScript self,
|
||||
}else if(strcmp(argv[1],"putarray") == 0){
|
||||
/*================*/
|
||||
putArray(pCon,pSics,self,argc,argv);
|
||||
}else if(strcmp(argv[1],"putintarray") == 0){
|
||||
/*================*/
|
||||
putIntArray(pCon,pSics,self,argc,argv);
|
||||
}else if(strcmp(argv[1],"putglobal") == 0){
|
||||
/*===============*/
|
||||
putGlobal(pCon,pSics,self,argc,argv);
|
||||
}else if(strcmp(argv[1],"putsicsdata") == 0){
|
||||
/*===============*/
|
||||
putSicsData(pCon,pSics,self,argc,argv);
|
||||
} else {
|
||||
SCWrite(pCon,"ERROR: put command not recognised",eError);
|
||||
}
|
||||
@@ -813,6 +988,7 @@ static void makeLink(SConnection *pCon, SicsInterp *pSics,
|
||||
pNXScript self,
|
||||
int argc, char *argv[]){
|
||||
int status;
|
||||
char pBueffel[256];
|
||||
|
||||
if(argc < 4){
|
||||
SCWrite(pCon,"ERROR: insufficient number of arguments to makelink",
|
||||
@@ -823,7 +999,9 @@ static void makeLink(SConnection *pCon, SicsInterp *pSics,
|
||||
status = NXDaliaslink(self->fileHandle, self->dictHandle,
|
||||
argv[2],argv[3]);
|
||||
if(status != NX_OK){
|
||||
SCWrite(pCon,"ERROR: linking failed",eError);
|
||||
snprintf(pBueffel,255,"ERROR: linking %s against %s failed",
|
||||
argv[2], argv[3]);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -851,6 +1029,8 @@ int NXScriptAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[]){
|
||||
pNXScript self = (pNXScript)pData;
|
||||
char *pFile = NULL;
|
||||
int status;
|
||||
|
||||
/*
|
||||
preliminary checks
|
||||
*/
|
||||
@@ -874,9 +1054,24 @@ int NXScriptAction(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
SCWrite(pCon,"ERROR: failed to create filename",eError);
|
||||
return 0;
|
||||
}
|
||||
} else if(strcmp(argv[1],"divisor") == 0){
|
||||
if(argc < 3) {
|
||||
SCWrite(pCon,"ERROR: no diviso found",eError);
|
||||
return 1;
|
||||
}
|
||||
if(!SCMatchRights(pCon,usMugger)){
|
||||
return 1;
|
||||
}
|
||||
self->timeDivisor = atoi(argv[2]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(handleFileOperations(pCon,self,argc,argv)){
|
||||
|
||||
|
||||
status = handleFileOperations(pCon,self,argc,argv);
|
||||
if(status < 0){
|
||||
return 0;
|
||||
} else if(status == 1){
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -939,6 +1134,7 @@ int MakeNXScript(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
free(self);
|
||||
return 0;
|
||||
}
|
||||
self->timeDivisor = 1;
|
||||
|
||||
/*
|
||||
create with with a default name if none specified
|
||||
|
||||
Reference in New Issue
Block a user