Computational routine
eng


genintc title

File content


/* genintc Scicos Random Integer Generator block
 * Type 4 simulation function ver 1.0 - scilab-3.0
 * 2 Mars 2008 - INRIA - Author : A.Layec
 */

/* REVISION HISTORY :
 * $Log$
 */

#include <stdlib.h>
#include <string.h>
#include "scicos_block4.h"

/*prototype*/
void genintc(scicos_block *block,int flag)
{
    /*Déclaration des variables*/
    void *y;
    void *oz;
    int ot;
    int no;
    int mo;
    int so;
    int seed;
    int *minv,*maxv;
    int *rz;
    int i;
    int rnd_nb,rnd_nbswitch;

    oz = GetOzPtrs(block,2);
    no = GetOzSize(block,2,1);
    mo = GetOzSize(block,2,2);

    minv = GetOparPtrs(block,1);
    maxv = GetOparPtrs(block,2);
    rz   = GetOparPtrs(block,3);

    /*Le flag 1 recopie le vecteur Z dans le vecteur Y*/
    if (flag==1||flag==6) {
      /*Récupération de l'adresse du port de sortie régulier*/
      y=(void *)block->outptr[0];

      so=GetSizeOfOz(block,2);

      memcpy(y,oz,mo*no*so);
    }

    /*Le flag 2 calcul les valeurs ou mots binaires dans Z*/
    else if(flag==2||flag==4) {

      /* init */
      if (flag==4) {
       /* set seed on flag 4 */
       seed=*((int *)GetOzPtrs(block,1));
       srand((unsigned int) seed);
      }

      /* get oz type */
      ot = GetOzType(block,2);

      switch (ot)
      {
       case SCSREAL_N : /*genintd_c(&no,&mo,minv,maxv,&rz,oz);*/
                        for(i=0;i<mo*no;i++) {
                          rnd_nb = rand();
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                *((double *) oz+i) = 1 + (int) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                *((double *) oz+i) = minv[i] + (int) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              *((double *) oz+i) = minv[i] + (int) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;

       case SCSCOMPLEX_N :
                        for(i=0;i<mo*no;i++) {
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                rnd_nb = rand();
                                *((double *) oz+i) = 1 + (int) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                                rnd_nb = rand();
                                *((double *) oz+mo*no+i) = 1 + (int) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                rnd_nb = rand();
                                *((double *) oz+i) = minv[i] + (int) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                                rnd_nb = rand();
                                *((double *) oz+mo*no+i) = minv[i] + (int) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              rnd_nb = rand();
                              *((double *) oz+i) = minv[i] + (int) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              rnd_nb = rand();
                              *((double *) oz+mo*no+i) = minv[i] + (int) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;

       case SCSINT32_N :
                        for(i=0;i<mo*no;i++) {
                          rnd_nb = rand();
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                *((long int *) oz+i) = 1 + (long int) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                *((long int *) oz+i) = minv[i] + (long int) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              *((long int *) oz+i) = minv[i] + (long int) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;

       case SCSINT16_N :
                        for(i=0;i<mo*no;i++) {
                          rnd_nb = rand();
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                *((short int *) oz+i) = 1 + (short int) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                *((short int *) oz+i) = minv[i] + (short int) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              *((short int *) oz+i) = minv[i] + (short int) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;

       case SCSINT8_N :
                        for(i=0;i<mo*no;i++) {
                          rnd_nb = rand();
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                *((char *) oz+i) = 1 + (char) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                *((char *) oz+i) = minv[i] + (char) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              *((char *) oz+i) = minv[i] + (char) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;

       case SCSUINT32_N :
                        for(i=0;i<mo*no;i++) {
                          rnd_nb = rand();
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                *((unsigned long int *) oz+i) = 1 + (unsigned long int) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                *((unsigned long int *) oz+i) = minv[i] + (unsigned long int) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              *((unsigned long int *) oz+i) = minv[i] + (unsigned long int) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;

       case SCSUINT16_N :
                        for(i=0;i<mo*no;i++) {
                          rnd_nb = rand();
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                *((unsigned short int *) oz+i) = 1 + (unsigned long int) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                *((unsigned short int *) oz+i) = minv[i] + (unsigned short int) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              *((unsigned short int *) oz+i) = minv[i] + (unsigned short int) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;

       case SCSUINT8_N :
                        for(i=0;i<mo*no;i++) {
                          rnd_nb = rand();
                          switch (rz[i])
                          {
                            case -2 :
                              rnd_nbswitch = rand();
                              if (rnd_nbswitch&1) {
                                *((unsigned char *) oz+i) = 1 + (unsigned char) ((double) rnd_nb * (maxv[i] - 1 + 1) / (RAND_MAX));
                              }
                              else {
                                *((unsigned char *) oz+i) = minv[i] + (unsigned char) ((double) rnd_nb * (-1 - minv[i] + 1) / (RAND_MAX));
                              }
                              break;
                            /* return to zero case */
                            default :
                              *((unsigned char *) oz+i) = minv[i] + (unsigned char) ((double) rnd_nb * (maxv[i] - minv[i] + 1) / (RAND_MAX));
                              break;
                          }
                        }
                        break;
      }
    }
}