1 /* 2 char id_backspace[] = "@(#)backspace.c 1.2"; 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 lfname = NULL; 17 elist = NO; 18 external = YES; 19 errflag = a->aerr; 20 lunit = a->aunit; 21 if (not_legal(lunit)) err(errflag,F_ERUNIT,bksp) 22 b= &units[lunit]; 23 if(!b->ufd && (n=fk_open(READ,SEQ,FMT,(ftnint)lunit)) ) 24 err(errflag,n,bksp) 25 lfname = b->ufnm; 26 if(b->uend) 27 { b->uend = NO; 28 return(OK); 29 } 30 if((x=ftell(b->ufd))==0) return(OK); 31 if(!b->useek) err(errflag,F_ERNOBKSP,bksp) 32 if(b->uwrt) t_runc(b,errflag); 33 if(b->url) /* direct access, purely academic */ 34 { y = x%(long)b->url; 35 x -= y?y:b->url; 36 fseek(b->ufd,x,0); 37 return(OK); 38 } 39 if(!b->ufmt) /* unformatted sequential */ 40 { fseek(b->ufd,-(long)sizeof(int),1); 41 fread((char *)&n,sizeof(int),1,b->ufd); 42 fseek(b->ufd,-(long)n-2*sizeof(int),1); 43 return(OK); 44 } 45 if(x==1) /* formatted sequential */ 46 { rewind(b->ufd); 47 return(OK); 48 } 49 while(last_char(b->ufd)!='\n'); /* slow but simple */ 50 return(OK); 51 } 52