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