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