12484Sdlw /* 2*4728Sdlw char id_backspace[] = "@(#)backspace.c 1.3"; 32484Sdlw * 42484Sdlw * Backspace records 52484Sdlw */ 62484Sdlw 72484Sdlw #include "fio.h" 82484Sdlw 92484Sdlw char *bksp = "backspace"; 102484Sdlw char last_char(); 112484Sdlw 122484Sdlw f_back(a) alist *a; 132484Sdlw { unit *b; 142484Sdlw int n,i; 152484Sdlw long x,y; 16*4728Sdlw 172484Sdlw lfname = NULL; 182484Sdlw elist = NO; 192484Sdlw external = YES; 202484Sdlw errflag = a->aerr; 212484Sdlw lunit = a->aunit; 222582Sdlw if (not_legal(lunit)) err(errflag,F_ERUNIT,bksp) 232484Sdlw b= &units[lunit]; 242484Sdlw if(!b->ufd && (n=fk_open(READ,SEQ,FMT,(ftnint)lunit)) ) 252484Sdlw err(errflag,n,bksp) 262484Sdlw lfname = b->ufnm; 272484Sdlw if(b->uend) 282484Sdlw { b->uend = NO; 292484Sdlw return(OK); 302484Sdlw } 312484Sdlw if((x=ftell(b->ufd))==0) return(OK); 322582Sdlw if(!b->useek) err(errflag,F_ERNOBKSP,bksp) 33*4728Sdlw if(b->uwrt && (n=t_runc(b,errflag))) return(n); 342484Sdlw if(b->url) /* direct access, purely academic */ 352484Sdlw { y = x%(long)b->url; 362484Sdlw x -= y?y:b->url; 372484Sdlw fseek(b->ufd,x,0); 382484Sdlw return(OK); 392484Sdlw } 402484Sdlw if(!b->ufmt) /* unformatted sequential */ 412484Sdlw { fseek(b->ufd,-(long)sizeof(int),1); 422484Sdlw fread((char *)&n,sizeof(int),1,b->ufd); 432484Sdlw fseek(b->ufd,-(long)n-2*sizeof(int),1); 442484Sdlw return(OK); 452484Sdlw } 462484Sdlw if(x==1) /* formatted sequential */ 472484Sdlw { rewind(b->ufd); 482484Sdlw return(OK); 492484Sdlw } 502484Sdlw while(last_char(b->ufd)!='\n'); /* slow but simple */ 512484Sdlw return(OK); 522484Sdlw } 53