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