Computational routine
eng


mswitch

File content


#include "scicos_block4.h"
#include <math.h>
#include <memory.h>

#define max(a,b) ((a) >= (b) ? (a) : (b))
#define min(a,b) ((a) <= (b) ? (a) : (b))

void  mswitch(scicos_block *block,int flag)
{
  if ((flag==1)||(flag==6)){
    int i,j,nin,so,my,ny;
    int mu,nu;
    int *ipar;
    double *u1;
    void *uj;    
    void *y;
    j=0;
    y=GetOutPortPtrs(block,1);
    so=GetSizeOfOut(block,1);
    my=GetOutPortRows(block,1);
    ny=GetOutPortCols(block,1);
    u1=GetRealInPortPtrs(block,1);
    ipar=GetIparPtrs(block);
    nin=GetNin(block);
    i=*(ipar+1);
    if (i==0) {
      if (*u1>0) {
	j=(int)floor(*u1);
      }else{
	j=(int)ceil(*u1);
      }
    }else if (i==1) {
      if (*u1>0) {
	j=(int)floor(*u1+.5);
      }else{
	j=(int)ceil(*u1-.5);
      }
    }else if (i==2) {
      j=(int)ceil(*u1);
    }else if (i==3) {
      j=(int)floor(*u1);
    }
    j=j+1-*ipar;
    j=max(j,1);
    if (nin==2) {
      mu=GetInPortRows(block,2);
      nu=GetInPortCols(block,2);
      uj=GetInPortPtrs(block,2);
      j=min(j,mu*nu);
      memcpy(y,uj+(j-1)*my*ny*so,my*ny*so);
    } else{
      j=min(j,nin-1);
      uj=GetInPortPtrs(block,j+1);
      memcpy(y,uj,my*ny*so);
    }
  }
}