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