/*--------------------------------------------------------------------------*/ void C2F(mget) (int *fd, double *res, int *n, char *type, int *ierr) { int nc, swap2; FILE *fa; nc = (int)strlen(type); *ierr = 0; if (nc == 0) { sciprint(_("%s: Wrong size for input argument #%d: Non-empty string expected.\n"), "mput", 4, type); *ierr = 2; return; } fa = GetFileOpenedInScilab(*fd); if (fa) { swap2 = GetSwapStatus(*fd); mget2(fa, swap2, res, *n, type, ierr); if (*ierr > 0) { sciprint(_("%s: Wrong value for input argument #%d: Format not recognized.\n"), "mget", 4); } } else { sciprint(_("%s: No input file associated to logical unit %d.\n"), "mget", *fd); *ierr = 3; } }
/*--------------------------------------------------------------------------*/ SCICOS_BLOCKS_IMPEXP void readau(int *flag, int *nevprt, double *t, double xd[], double x[], int *nx, double z[], int *nz, double tvec[], int *ntvec, double rpar[], int *nrpar, int ipar[], int *nipar, double *inptr[], int insz[], int *nin, double *outptr[], int outsz[], int *nout) /* ipar[1] = lfil : file name length ipar[2:4] = fmt : numbers type ascii code ipar[5] = void ipar[6] = n : buffer length in number of records ipar[7] = maxvoie : record size ipar[8] = swap ipar[9] = first : first record to read ipar[10:9+lfil] = character codes for file name */ { char str[100], type[4]; int job = 1, three = 3; FILE *fd = NULL; int n = 0, k = 0, kmax = 0, m = 0, i = 0, irep = 0, ierr = 0; double *buffer = NULL, *record = NULL; long offset ; double y = 0.; int quot = 0, rem = 0; double SCALE = 0.000030517578125; int ETAB[8]; int mu = 0; int sig = 0; int e = 0; int f = 0; ETAB[0] = 0; ETAB[1] = 132; ETAB[2] = 396; ETAB[3] = 924; ETAB[4] = 1980; ETAB[5] = 4092; ETAB[6] = 8316; ETAB[7] = 16764; --ipar; --z; fd = (FILE *)(long)z[3]; buffer = (z + 4); /* k : record counter within the buffer kmax : number of records in the buffer */ if (*flag == 1) { n = ipar[6]; k = (int)z[1]; /* copy current record to output */ record = buffer + (k - 1) * ipar[7]; for (i = 0; i < *nout; i++) { mu = (int) record[i]; mu = 255 - mu; if (mu > 127) { sig = 1; } else { sig = 0; } /* comment out for SUNOS SS 8/10/99 divt=div(mu,16); e=divt.quot-8*sig+1; f=divt.rem; */ quot = mu / 16; rem = mu - 16 * quot; e = quot - 8 * sig + 1; f = rem; y = ldexp((double)(f), (e + 2)); /* ff=(double)(e+2); y=((double) f) * pow(two, ff); */ e = ETAB[e - 1]; y = SCALE * (1 - 2 * sig) * (e + y); *outptr[i] = y; } if (*nevprt > 0) { /* discrete state */ kmax = (int) z[2]; if (k >= kmax && kmax == n) { /* read a new buffer */ m = ipar[6] * ipar[7]; for (i = 0; i < three; ++i) { type[i] = (char) ipar[i + 2]; } for (i = 2; i >= 0; i--) if (type[i] != ' ') { type[i + 1] = '\0'; break; } ierr = 0; mget2(fd, ipar[8], buffer, m, type, &ierr); if (ierr > 0) { scicos_print(_("Read error!\n")); fclose(fd); z[3] = 0.0; *flag = -1; return; } else if (ierr < 0) { /* EOF reached */ kmax = -(ierr + 1) / ipar[7]; } else { kmax = ipar[6]; } z[1] = 1.0; z[2] = kmax; } else if (k < kmax) { z[1] = z[1] + 1.0; } } } else if (*flag == 4) { for (i = 0; i < ipar[1]; ++i) { str[i] = (char) ipar[i + 10]; } str[ipar[1]] = '\0'; wcfopen(fd, str, "rb"); if (!fd ) { scicos_print(_("Could not open the file!\n")); *flag = -1; return; } z[3] = (long)fd; /* skip first records */ if (ipar[9] > 1) { for (i = 0; i < three; ++i) { type[i] = (char) ipar[i + 2]; } for (i = 2; i >= 0; i--) if (type[i] != ' ') { type[i + 1] = '\0'; break; } offset = (ipar[9] - 1) * ipar[7] * sizeof(char); irep = fseek(fd, offset, 0) ; if ( irep != 0 ) { scicos_print(_("Read error\n")); *flag = -1; fclose(fd); z[3] = 0.0; return; } } /* read first buffer */ m = ipar[6] * ipar[7]; for (i = 0; i < three; ++i) { type[i] = (char) ipar[i + 2]; } for (i = 2; i >= 0; i--) if (type[i] != ' ') { type[i + 1] = '\0'; break; } mget2(fd, ipar[8], buffer, m, type, &ierr); if (ierr > 0) { scicos_print(_("Read error!\n")); *flag = -1; fclose(fd); z[3] = 0.0; return; } else if (ierr < 0) { /* EOF reached */ kmax = -(ierr + 1) / ipar[7]; } else { kmax = ipar[6]; } z[1] = 1.0; z[2] = kmax; } else if (*flag == 5) { if (z[3] == 0) { return; } fclose(fd); z[3] = 0.0; } return; }
/*--------------------------------------------------------------------------*/ SCICOS_BLOCKS_IMPEXP void readc(int *flag, int *nevprt, double *t, double xd[], double x[], int *nx, double z[], int *nz, double tvec[], int *ntvec, double rpar[], int *nrpar, int ipar[], int *nipar, double *inptr[], int insz[], int *nin, double *outptr[], int outsz[], int *nout) /* ipar[1] = lfil : file name length ipar[2:4] = fmt : numbers type ascii code ipar[5] = is there a time record ipar[6] = n : buffer length in number of records ipar[7] = maxvoie : record size ipar[8] = swap ipar[9] = first : first record to read ipar[10:9+lfil] = character codes for file name ipar[10+lfil:9+lfil++ny+ievt] = reading mask */ { char str[100], type[4]; int job = 1, three = 3; FILE *fd = NULL; int n = 0, k = 0, ievt = 0, kmax = 0, m = 0, i = 0, irep = 0, ierr = 0; double *buffer = NULL, *record = NULL; int *mask = NULL; long offset ; --ipar; --z; fd = (FILE *)(long)z[3]; buffer = (z + 4); mask = ipar + 11 + ipar[1] - ipar[5]; /* k : record counter within the buffer kmax : number of records in the buffer */ if (*flag == 1) { n = ipar[6]; ievt = ipar[5]; k = (int)z[1]; /* copy current record to output */ record = buffer + (k - 1) * ipar[7] - 1; for (i = 0; i < outsz[0]; i++) { *(outptr[0] + i) = record[mask[ievt + i]]; } if (*nevprt > 0) { /* discrete state */ kmax = (int)z[2]; if (k >= kmax && kmax == n) { /* read a new buffer */ m = ipar[6] * ipar[7]; for (i = 0; i < three; ++i) { type[i] = (char) ipar[i + 2]; } for (i = 2; i >= 0; i--) if (type[i] != ' ') { type[i + 1] = '\0'; break; } ierr = 0; mget2(fd, ipar[8], buffer, m, type, &ierr); if (ierr > 0) { scicos_print(_("Read error!\n")); fclose(fd); z[3] = 0.0; *flag = -1; return; } else if (ierr < 0) { /* EOF reached */ kmax = -(ierr + 1) / ipar[7]; } else { kmax = ipar[6]; } z[1] = 1.0; z[2] = kmax; } else if (k < kmax) { z[1] = z[1] + 1.0; } } } else if (*flag == 3) { ievt = ipar[5]; n = ipar[6]; k = (int)z[1]; kmax = (int) z[2]; if (k > kmax && kmax < n) { if (ievt) { tvec[0] = *t - 1.0; } else { tvec[0] = *t * (1.0 + 0.0000000001); } } else { record = buffer + (k - 1) * ipar[7] - 1; if (ievt) { tvec[0] = record[mask[0]]; } } } else if (*flag == 4) { for (i = 0; i < ipar[1]; ++i) { str[i] = (char) ipar[i + 10]; } str[ipar[1]] = '\0'; wcfopen(fd, str, "rb"); if (!fd ) { scicos_print(_("Could not open the file!\n")); *flag = -1; return; } z[3] = (long)fd; /* skip first records */ if (ipar[9] > 1) { for (i = 0; i < three; ++i) { type[i] = (char) ipar[i + 2]; } for (i = 2; i >= 0; i--) if (type[i] != ' ') { type[i + 1] = '\0'; break; } offset = (ipar[9] - 1) * ipar[7] * worldsize(type); irep = fseek(fd, offset, 0) ; if ( irep != 0 ) { scicos_print(_("Read error\n")); *flag = -1; fclose(fd); z[3] = 0.0; return; } } /* read first buffer */ m = ipar[6] * ipar[7]; for (i = 0; i < three; ++i) { type[i] = (char) ipar[i + 2]; } for (i = 2; i >= 0; i--) if (type[i] != ' ') { type[i + 1] = '\0'; break; } mget2(fd, ipar[8], buffer, m, type, &ierr); if (ierr > 0) { scicos_print(_("Read error!\n")); *flag = -1; fclose(fd); z[3] = 0.0; return; } else if (ierr < 0) { /* EOF reached */ kmax = -(ierr + 1) / ipar[7]; } else { kmax = ipar[6]; } z[1] = 1.0; z[2] = kmax; } else if (*flag == 5) { if (z[3] == 0) { return; } fclose(fd); z[3] = 0.0; } return; }