1*20986Slibs /* 2*20986Slibs char id_csfe[] = "@(#)c_sfe.c 1.1"; 3*20986Slibs * 4*20986Slibs * sequential formatted external I/O - common read & write routines 5*20986Slibs */ 6*20986Slibs 7*20986Slibs #include "fio.h" 8*20986Slibs 9*20986Slibs c_sfe(a,flag,mode,str) cilist *a; char *str; /* check */ 10*20986Slibs { unit *p; 11*20986Slibs int n; 12*20986Slibs 13*20986Slibs external=formatted=FORMATTED; 14*20986Slibs fmtbuf=a->cifmt; 15*20986Slibs lfname = NULL; 16*20986Slibs elist = NO; 17*20986Slibs errflag = a->cierr; 18*20986Slibs endflag = a->ciend; 19*20986Slibs lunit = a->ciunit; 20*20986Slibs if(not_legal(lunit)) err(errflag,F_ERUNIT,str); 21*20986Slibs curunit = p = &units[lunit]; 22*20986Slibs if(!p->ufd && (n=fk_open(flag,mode,FMT,(ftnint)lunit)) ) 23*20986Slibs err(errflag,n,str) 24*20986Slibs cf = curunit->ufd; 25*20986Slibs elist = YES; 26*20986Slibs lfname = curunit->ufnm; 27*20986Slibs if(!p->ufmt) err(errflag,F_ERNOFIO,str) 28*20986Slibs cursor=recpos=scale=reclen=0; 29*20986Slibs radix = 10; 30*20986Slibs signit = YES; 31*20986Slibs cblank = curunit->ublnk; 32*20986Slibs cplus = NO; 33*20986Slibs return(OK); 34*20986Slibs } 35*20986Slibs 36*20986Slibs x_tab() 37*20986Slibs { int n; 38*20986Slibs if(reclen < recpos) reclen = recpos; 39*20986Slibs if(curunit->useek) 40*20986Slibs { if((recpos+cursor) < 0) cursor = -recpos; /* to BOR */ 41*20986Slibs n = reclen - recpos; /* distance to eor, n>=0 */ 42*20986Slibs if((cursor-n) > 0) 43*20986Slibs { fseek(cf,(long)n,1); /* find current eor */ 44*20986Slibs recpos = reclen; 45*20986Slibs cursor -= n; 46*20986Slibs } 47*20986Slibs else 48*20986Slibs { fseek(cf,(long)cursor,1); /* do not pass go */ 49*20986Slibs recpos += cursor; 50*20986Slibs return(cursor=0); 51*20986Slibs } 52*20986Slibs } 53*20986Slibs else 54*20986Slibs if(cursor < 0) return(F_ERSEEK); /* can't go back */ 55*20986Slibs while(cursor--) 56*20986Slibs { if(reading) 57*20986Slibs { n = (*getn)(); 58*20986Slibs if(n=='\n') return(cursor=0); /* be tolerant */ 59*20986Slibs if(n==EOF) return(EOF); 60*20986Slibs } 61*20986Slibs else (*putn)(' '); /* fill in the empty record */ 62*20986Slibs } 63*20986Slibs return(cursor=0); 64*20986Slibs } 65