tows_c
# include "scicos_block4.h"
# include "../machine.h"
#include "../stack-c.h"
#include <stdio.h>
#include <string.h>
#if WIN32
#define NULL 0
#endif
extern int C2F(cvstr) __PARAMS((integer *,integer *,char *,integer *,unsigned long int));
extern int C2F(mputnc)();
extern int C2F(namstr)();
extern void C2F(mopen)();
extern int C2F(cluni0) __PARAMS((char *name, char *nams, integer *ln, long int name_len,
long int nams_len));
extern void C2F(mclose) __PARAMS((integer *fd, double *res));
extern void sciprint __PARAMS((char *fmt,...));
static int id[nsiz];
static char fmtd[3]={'d','l','\000'};
static char fmti[3]={'i','l','\000'};
static char fmtl[3]={'l','l','\000'};
static char fmts[3]={'s','l','\000'};
static char fmtc[3]={'c','l','\000'};
static char fmtul[3]={'u','l','\000'};
static char fmtus[3]={'u','s','\000'};
static char fmtuc[3]={'u','c','\000'};
#ifdef hppa
#undef FILENAME_MAX
#define FILENAME_MAX 4096
#endif
/* work struct for that block */
typedef struct {
int cnt;
void *work;
void *workt;
} towork_struct ;
void tows_c(scicos_block *block,int flag)
/* Copyright INRIA */
/* Put a typed vector in a scilab file.
* Independant platform.
*
* Author A.Layec - initial rev. 18/09/07
*/
{
/* for mopen */
int fd;
char *status;
int swap = 1;
double res;
int out_n;
long int lout;
char filename[FILENAME_MAX];
/* for name of file */
char str[100];
/* generic pointer */
SCSREAL_COP *u_d,*u_cd,*ptr_d;
SCSINT8_COP *u_c,*ptr_c;
SCSUINT8_COP *u_uc, *ptr_uc;
SCSINT16_COP *u_s,*ptr_s;
SCSUINT16_COP *u_us,*ptr_us;
SCSINT_COP *ptr_i;
SCSINT32_COP *u_l,*ptr_l;
SCSUINT32_COP *u_ul,*ptr_ul;
/* the struct ptr of that block */
towork_struct *ptr;
/* */
int nu,ut;
int nz;
double t;
/* local */
int i,j,k;
int ierr;
/* for path of TMPDIR/workspace */
char env[256];
char sep[2];
#ifdef _MSC_VER
sep[0]='\\';
#else
sep[0]='/';
#endif
sep[1]='\0';
/* retrieve param of that block */
nu=GetInPortRows(block,1); /* number of rows of inputs*/
ut=GetInType(block,1); /* input type */
nz=block->ipar[0]; /* buffer size */
if (flag==4) { /* init */
/* begin campaign of allocations */
if((*(block->work)=(towork_struct*) scicos_malloc(sizeof(towork_struct)))==NULL) {
set_block_error(-16);
return;
}
ptr = *(block->work);
/*
* t
*/
if((ptr->workt=(void *) scicos_malloc(6*sizeof(int)+4*sizeof(int)+ \
nz*sizeof(double)))==NULL) {
set_block_error(-16);
scicos_free(ptr);
*(block->work) = NULL;
return;
}
ptr_i = (int*) ptr->workt;
ptr_i[6] = 1;
ptr_i[7] = nz;
ptr_i[8] = 1;
ptr_i[9] = 0;
ptr_d = (SCSREAL_COP *) &(ptr_i[10]);
for (i=0;i<nz;i++) {
ptr_d[i]=-1;
}
C2F(namstr)(id,(i=29,&i),(j=1,&j),(k=0,&k));
ptr_i = (int*) ptr->workt;
ptr_i[0]=id[0];
ptr_i[1]=id[1];
ptr_i[2]=id[2];
ptr_i[3]=id[3];
ptr_i[4]=id[4];
ptr_i[5]=id[5];
/*
* x
*/
switch (ut)
{
case SCSREAL_N :
if((ptr->work=(void *) scicos_malloc(6*sizeof(int)+4*sizeof(int)+ \
nz*nu*sizeof(double)))==NULL) {
set_block_error(-16);
scicos_free(ptr->workt);
scicos_free(ptr);
*(block->work) = NULL;
return;
}
ptr_i = (int*) ptr->work;
ptr_i[6] = 1;
ptr_i[7] = nz;
ptr_i[8] = nu;
ptr_i[9] = 0;
ptr_d = (SCSREAL_COP *) &(ptr_i[10]);
for (i=0;i<nu*nz;i++) {
ptr_d[i]=0.;
}
break;
case SCSCOMPLEX_N :
if((ptr->work=(void *) scicos_malloc(6*sizeof(int)+4*sizeof(int)+ \
2*nz*nu*sizeof(double)))==NULL) {
set_block_error(-16);
scicos_free(ptr->workt);
scicos_free(ptr);
*(block->work) = NULL;
return;
}
ptr_i = (int*) ptr->work;
ptr_i[6] = 1;
ptr_i[7] = nz;
ptr_i[8] = nu;
ptr_i[9] = 1;
ptr_d = (SCSREAL_COP *) &(ptr_i[10]);
for (i=0;i<2*nu*nz;i++) {
ptr_d[i]=0.;
}
break;
case SCSINT8_N :
if((ptr->work=(void *) scicos_malloc(6*sizeof(int)+4*sizeof(int)+ \
nz*nu*sizeof(char)))==NULL) {
set_block_error(-16);
scicos_free(ptr->workt);
scicos_free(ptr);
*(block->work) = NULL;
return;
}
ptr_i = (int*) ptr->work;
ptr_i[6] = 8;
ptr_i[7] = nz;
ptr_i[8] = nu;
ptr_i[9] = 1;
ptr_c = (SCSINT8_COP *) &(ptr_i[10]);
for (i=0;i<nu*nz;i++) {
ptr_c[i]=0;
}
break;
case SCSINT16_N :
if((ptr->work=(void *) scicos_malloc(6*sizeof(int)+4*sizeof(int)+ \
nz*nu*sizeof(short)))==NULL) {
set_block_error(-16);
scicos_free(ptr->workt);
scicos_free(ptr);
*(block->work) = NULL;
return;
}
ptr_i = (int*) ptr->work;
ptr_i[6] = 8;
ptr_i[7] = nz;
ptr_i[8] = nu;
ptr_i[9] = 2;
ptr_s = (SCSINT16_COP *) &(ptr_i[10]);
for (i=0;i<nu*nz;i++) {
ptr_s[i]=0;
}
break;
case SCSINT32_N :
if((ptr->work=(void *) scicos_malloc(6*sizeof(int)+4*sizeof(int)+ \
nz*nu*sizeof(long)))==NULL) {
set_block_error(-16);
scicos_free(ptr->workt);
scicos_free(ptr);
*(block->work) = NULL;
return;
}
ptr_i = (int*) ptr->work;
ptr_i[6] = 8;
ptr_i[7] = nz;
ptr_i[8] = nu;
ptr_i[9] = 4;
ptr_l = (SCSINT32_COP *) &(ptr_i[10]);
for (i=0;i<nu*nz;i++) {
ptr_l[i]=0;
}
break;
case SCSUINT8_N :
if((ptr->work=(void *) scicos_malloc(6*sizeof(int)+4*sizeof(int)+ \
nz*nu*sizeof(unsigned char)))==NULL) {
set_block_error(-16);
scicos_free(ptr->workt);
scicos_free(ptr);
*(block->work) = NULL;
return;
}
ptr_i = (int*) ptr->work;
ptr_i[6] = 8;
ptr_i[7] = nz;
ptr_i[8] = nu;
ptr_i[9] = 11;
ptr_uc = (SCSUINT8_COP *) &(ptr_i[10]);
for (i=0;i<nu*nz;i++) {
ptr_uc[i]=0;
}
break;
case SCSUINT16_N :
if((ptr->work=(void *) scicos_malloc(6*sizeof(int)+4*sizeof(int)+ \
nz*nu*sizeof(unsigned short)))==NULL) {
set_block_error(-16);
scicos_free(ptr->workt);
scicos_free(ptr);
*(block->work) = NULL;
return;
}
ptr_i = (int*) ptr->work;
ptr_i[6] = 8;
ptr_i[7] = nz;
ptr_i[8] = nu;
ptr_i[9] = 12;
ptr_us = (SCSUINT16_COP *) &(ptr_i[10]);
for (i=0;i<nu*nz;i++) {
ptr_us[i]=0;
}
break;
case SCSUINT32_N :
if((ptr->work=(void *) scicos_malloc(6*sizeof(int)+4*sizeof(int)+ \
nz*nu*sizeof(unsigned long)))==NULL) {
set_block_error(-16);
scicos_free(ptr->workt);
scicos_free(ptr);
*(block->work) = NULL;
return;
}
ptr_i = (int*) ptr->work;
ptr_i[6] = 8;
ptr_i[7] = nz;
ptr_i[8] = nu;
ptr_i[9] = 14;
ptr_ul = (SCSUINT32_COP *) &(ptr_i[10]);
for (i=0;i<nu*nz;i++) {
ptr_ul[i]=0;
}
break;
default : /* Add a message here */
break;
}
C2F(namstr)(id,(i=33,&i),(j=1,&j),(k=0,&k));
ptr_i = (int*) ptr->work;
ptr_i[0]=id[0];
ptr_i[1]=id[1];
ptr_i[2]=id[2];
ptr_i[3]=id[3];
ptr_i[4]=id[4];
ptr_i[5]=id[5];
/*
* cnt
*/
ptr->cnt=0;
}
else if (flag==5) { /* finish */
ptr = *(block->work);
if (ptr!=NULL) {
/* */
C2F(cvstr)(&(block->ipar[1]),&(block->ipar[2]),str,(j=1,&j), \
(unsigned long)strlen(str));
str[block->ipar[1]] = '\0';
/* retrieve path of TMPDIR/workspace */
strcpy(env,getenv("TMPDIR"));
strcat(env,sep);
strcat(env,"Workspace");
strcat(env,sep);
strcat(env,str);
/* open tmp file */
status = "w";
lout=FILENAME_MAX;
C2F(cluni0)(env, filename, &out_n,1,lout);
C2F(mopen)(&fd,env,status,&swap,&res,&ierr);
/* a check must be done here on ierr */
/* write x */
ptr_i = (int*) ptr->work;
C2F(mputnc) (&fd, &ptr_i[0], (j=nsiz,&j), fmti, &ierr); /* write sci id */
C2F(mputnc) (&fd, &ptr_i[6], (j=1,&j), fmti, &ierr); /* write sci type */
C2F(mputnc) (&fd, &ptr_i[7], (j=3,&j), fmti, &ierr); /* write sci header */
/* write data */
switch (ut) {
case SCSREAL_N :
C2F(mputnc) (&fd, &ptr_i[10], (j=ptr_i[7]*ptr_i[8],&j), fmtd, &ierr);
break;
case SCSCOMPLEX_N :
C2F(mputnc) (&fd, &ptr_i[10], (j=2*ptr_i[7]*ptr_i[8],&j), fmtd, &ierr);
break;
case SCSINT8_N :
C2F(mputnc) (&fd, &ptr_i[10], (j=ptr_i[7]*ptr_i[8],&j), fmtc, &ierr);
break;
case SCSINT16_N :
C2F(mputnc) (&fd, &ptr_i[10], (j=ptr_i[7]*ptr_i[8],&j), fmts, &ierr);
break;
case SCSINT32_N :
C2F(mputnc) (&fd, &ptr_i[10], (j=ptr_i[7]*ptr_i[8],&j), fmtl, &ierr);
break;
case SCSUINT8_N :
C2F(mputnc) (&fd, &ptr_i[10], (j=ptr_i[7]*ptr_i[8],&j), fmtuc, &ierr);
break;
case SCSUINT16_N :
C2F(mputnc) (&fd, &ptr_i[10], (j=ptr_i[7]*ptr_i[8],&j), fmtus, &ierr);
break;
case SCSUINT32_N :
C2F(mputnc) (&fd, &ptr_i[10], (j=ptr_i[7]*ptr_i[8],&j), fmtul, &ierr);
break;
default : /* Add a message here */
break;
}
/* a check must be done here */
/* write t */
ptr_i = (int*) ptr->workt;
C2F(mputnc) (&fd, &ptr_i[0], (j=nsiz,&j), fmti, &ierr);
C2F(mputnc) (&fd, &ptr_i[6], (j=1,&j), fmti, &ierr);
C2F(mputnc) (&fd, &ptr_i[7], (j=3,&j), fmti, &ierr);
C2F(mputnc) (&fd, &ptr_i[10], (j=ptr_i[7],&j), fmtd, &ierr);
/* a check must be done here on ierr */
/* close tmp file */
C2F(mclose)(&fd,&res);
/* free */
scicos_free(ptr->work);
scicos_free(ptr->workt);
scicos_free(ptr);
}
}
else if (flag==2) { /* update state */
ptr = *(block->work);
ptr_i = (int*) ptr->work;
/* check */
if ((nz!=ptr_i[7]) || (nu!=ptr_i[8])) {
sciprint("Size of buffer or input size have changed!\n");
set_block_error(-1);
return;
}
/*
*store
*/
/* x */
switch (ut)
{
case SCSREAL_N :
u_d = GetRealInPortPtrs(block,1);
ptr_d = (SCSREAL_COP *) &(ptr_i[10]);
for (i=0;i<nu;i++) {
ptr_d[ptr->cnt+i*nz]=u_d[i];
}
break;
case SCSCOMPLEX_N :
u_d = GetRealInPortPtrs(block,1);
u_cd = GetImagInPortPtrs(block,1);
ptr_d = (SCSREAL_COP *) &(ptr_i[10]);
for (i=0;i<nu;i++) {
ptr_d[ptr->cnt+i*nz]=u_d[i];
ptr_d[nz*nu+ptr->cnt+i*nz]=u_cd[i];
}
break;
case SCSINT8_N :
u_c = Getint8InPortPtrs(block,1);
ptr_c = (SCSINT8_COP *) &(ptr_i[10]);
for (i=0;i<nu;i++) {
ptr_c[ptr->cnt+i*nz]=u_c[i];
}
break;
case SCSINT16_N :
u_s = Getint16InPortPtrs(block,1);
ptr_s = (SCSINT16_COP *) &(ptr_i[10]);
for (i=0;i<nu;i++) {
ptr_s[ptr->cnt*nu+i*nz]=u_s[i];
}
break;
case SCSINT32_N :
u_l = Getint32InPortPtrs(block,1);
ptr_l = (SCSINT32_COP *) &(ptr_i[10]);
for (i=0;i<nu;i++) {
ptr_l[ptr->cnt+i*nz]=u_l[i];
}
break;
case SCSUINT8_N :
u_uc = Getuint8InPortPtrs(block,1);
ptr_uc = (SCSUINT8_COP *) &(ptr_i[10]);
for (i=0;i<nu;i++) {
ptr_uc[ptr->cnt+i*nz]=u_uc[i];
}
break;
case SCSUINT16_N :
u_us = Getuint16InPortPtrs(block,1);
ptr_us = (SCSUINT16_COP *) &(ptr_i[10]);
for (i=0;i<nu;i++) {
ptr_us[ptr->cnt+i*nz]=u_us[i];
}
break;
case SCSUINT32_N :
u_ul = Getuint32InPortPtrs(block,1);
ptr_ul = (SCSUINT32_COP *) &(ptr_i[10]);
for (i=0;i<nu;i++) {
ptr_ul[ptr->cnt+i*nz]=u_ul[i];
}
break;
default : /* Add a message here */
break;
}
/* t */
ptr_i = (int*) ptr->workt;
t=get_scicos_time();
ptr_d = (SCSREAL_COP *) &(ptr_i[10]);
ptr_d[ptr->cnt]=t;
/*
* update cnt
*/
ptr->cnt++;
if (ptr->cnt==nz) ptr->cnt=0;
}
}