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