1 /* 2 char id_backspace[] = "@(#)backspace.c 1.4"; 3 * 4 * Backspace records 5 */ 6 7 #include "fio.h" 8 9 char *bksp = "backspace"; 10 char last_char(); 11 12 f_back(a) alist *a; 13 { unit *b; 14 int n,i; 15 long x,y; 16 17 lfname = NULL; 18 elist = NO; 19 external = YES; 20 errflag = a->aerr; 21 lunit = a->aunit; 22 if (not_legal(lunit)) err(errflag,F_ERUNIT,bksp) 23 b= &units[lunit]; 24 if(!b->ufd && (n=fk_open(READ,SEQ,FMT,(ftnint)lunit)) ) 25 err(errflag,n,bksp) 26 lfname = b->ufnm; 27 if(b->uend) 28 { b->uend = NO; 29 clearerr(b->ufd); 30 return(OK); 31 } 32 if((x=ftell(b->ufd))==0) return(OK); 33 if(!b->useek) err(errflag,F_ERNOBKSP,bksp) 34 if(b->uwrt && (n=t_runc(b,errflag))) return(n); 35 if(b->url) /* direct access, purely academic */ 36 { y = x%(long)b->url; 37 x -= y?y:b->url; 38 fseek(b->ufd,x,0); 39 return(OK); 40 } 41 if(!b->ufmt) /* unformatted sequential */ 42 { fseek(b->ufd,-(long)sizeof(int),1); 43 fread((char *)&n,sizeof(int),1,b->ufd); 44 fseek(b->ufd,-(long)n-2*sizeof(int),1); 45 return(OK); 46 } 47 if(x==1) /* formatted sequential */ 48 { rewind(b->ufd); 49 return(OK); 50 } 51 while(last_char(b->ufd)!='\n'); /* slow but simple */ 52 return(OK); 53 } 54