xref: /csrg-svn/usr.bin/f77/libI77/backspace.c (revision 10674)
12484Sdlw /*
2*10674Sdlw char id_backspace[] = "@(#)backspace.c	1.5";
32484Sdlw  *
42484Sdlw  * Backspace records
52484Sdlw  */
62484Sdlw 
72484Sdlw #include "fio.h"
82484Sdlw 
9*10674Sdlw static char	bksp[]	= "backspace";
10*10674Sdlw char	last_char();
112484Sdlw 
12*10674Sdlw f_back(a)
13*10674Sdlw alist	*a;
142484Sdlw {	unit *b;
152484Sdlw 	int n,i;
162484Sdlw 	long x,y;
174728Sdlw 
182484Sdlw 	lfname = NULL;
192484Sdlw 	elist = NO;
202484Sdlw 	external = YES;
212484Sdlw 	errflag = a->aerr;
222484Sdlw 	lunit = a->aunit;
23*10674Sdlw 	if (not_legal(lunit))
24*10674Sdlw 		err(errflag, F_ERUNIT, bksp)
252484Sdlw 	b= &units[lunit];
26*10674Sdlw 	if(!b->ufd && (n = fk_open(READ, SEQ, FMT, (ftnint)lunit)) )
27*10674Sdlw 		err(errflag, n, bksp)
282484Sdlw 	lfname = b->ufnm;
292484Sdlw 	if(b->uend)
302484Sdlw 	{	b->uend = NO;
316600Sdlw 		clearerr(b->ufd);
322484Sdlw 		return(OK);
332484Sdlw 	}
34*10674Sdlw 	if((x = ftell(b->ufd)) == 0)
35*10674Sdlw 		return(OK);
36*10674Sdlw 	if(!b->useek)
37*10674Sdlw 		err(errflag, F_ERNOBKSP, bksp)
38*10674Sdlw 	if(b->uwrt && (n = t_runc(b, errflag)))
39*10674Sdlw 		return(n);
402484Sdlw 	if(b->url)		/* direct access, purely academic */
412484Sdlw 	{	y = x%(long)b->url;
422484Sdlw 		x -= y?y:b->url;
432484Sdlw 		fseek(b->ufd,x,0);
442484Sdlw 		return(OK);
452484Sdlw 	}
462484Sdlw 	if(!b->ufmt)		/* unformatted sequential */
472484Sdlw 	{	fseek(b->ufd,-(long)sizeof(int),1);
482484Sdlw 		fread((char *)&n,sizeof(int),1,b->ufd);
492484Sdlw 		fseek(b->ufd,-(long)n-2*sizeof(int),1);
502484Sdlw 		return(OK);
512484Sdlw 	}
52*10674Sdlw 	if(x == 1)			/* formatted sequential */
532484Sdlw 	{	rewind(b->ufd);
542484Sdlw 		return(OK);
552484Sdlw 	}
56*10674Sdlw 	if (b->uwrt && ! nowreading(b))
57*10674Sdlw 		err(errflag, errno, bksp)
58*10674Sdlw 	while (last_char(b->ufd) != '\n')	/* slow but simple */
59*10674Sdlw 		;
602484Sdlw 	return(OK);
612484Sdlw }
62