#include <stdio.h> #include <string.h> #include "../machine.h" extern int C2F(cvstr) __PARAMS((integer *,integer *,char *,integer *,unsigned long int)); extern void sciprint __PARAMS((char *fmt,...)); extern void mget2 __PARAMS((FILE *fa, integer swap, double *res, integer n, char *type, integer *ierr)); int worldsize(type) char type[4]; { char c; int wsz=0; c=type[0]; if (c=='u') c=type[1]; switch ( c ) { case 'l' : wsz=sizeof(long); break; case 's' : wsz=sizeof(short); break; case 'c' : wsz=sizeof(char); break; case 'd' : wsz=sizeof(double); break; case 'f' : wsz=sizeof(float); break; } return wsz; } void readc(flag,nevprt,t,xd,x,nx,z,nz,tvec,ntvec,rpar,nrpar, ipar,nipar,inptr,insz,nin,outptr,outsz,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 */ integer *flag,*nevprt,*nx,*nz,*ntvec,*nrpar,ipar[],*nipar; integer insz[],*nin,outsz[],*nout; double x[],xd[],z[],tvec[],rpar[]; double *inptr[],*outptr[],*t; { char str[100],type[4]; int job = 1,three=3; FILE *fd; int n, k, ievt, kmax,/* no,*//* lfil,*/ m, i, irep,/* nm,*/ ierr; double *buffer,*record; int *mask; 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]; F2C(cvstr)(&three,&(ipar[2]),type,&job, (unsigned long)strlen(type)); 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) { sciprint("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) { F2C(cvstr)(&(ipar[1]),&(ipar[10]),str,&job,(unsigned long)strlen(str)); str[ipar[1]] = '\0'; fd = fopen(str,"rb"); if (!fd ) { sciprint("Could not open the file!\n"); *flag = -1; return; } z[3]=(long)fd; /* skip first records */ if (ipar[9]>1) { F2C(cvstr)(&three,&(ipar[2]),type,&job,(unsigned long)strlen(type)); 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 ) { sciprint("Read error\r\n"); *flag = -1; fclose(fd); z[3] = 0.0; return; } } /* read first buffer */ m=ipar[6]*ipar[7]; F2C(cvstr)(&three,&(ipar[2]),type,&job,(unsigned long)strlen(type)); 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) { sciprint("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; }