declare init66_ in err.c. DLW
[unix-history] / usr / src / usr.bin / f77 / libI77 / backspace.c
CommitLineData
7bd0b8c0 1/*
fdfc35cb 2char id_backspace[] = "@(#)backspace.c 1.5";
7bd0b8c0
DW
3 *
4 * Backspace records
5 */
6
7#include "fio.h"
8
fdfc35cb
DW
9static char bksp[] = "backspace";
10char last_char();
7bd0b8c0 11
fdfc35cb
DW
12f_back(a)
13alist *a;
7bd0b8c0
DW
14{ unit *b;
15 int n,i;
16 long x,y;
2621bc46 17
7bd0b8c0
DW
18 lfname = NULL;
19 elist = NO;
20 external = YES;
21 errflag = a->aerr;
22 lunit = a->aunit;
fdfc35cb
DW
23 if (not_legal(lunit))
24 err(errflag, F_ERUNIT, bksp)
7bd0b8c0 25 b= &units[lunit];
fdfc35cb
DW
26 if(!b->ufd && (n = fk_open(READ, SEQ, FMT, (ftnint)lunit)) )
27 err(errflag, n, bksp)
7bd0b8c0
DW
28 lfname = b->ufnm;
29 if(b->uend)
30 { b->uend = NO;
1604dff5 31 clearerr(b->ufd);
7bd0b8c0
DW
32 return(OK);
33 }
fdfc35cb
DW
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)))
39 return(n);
7bd0b8c0
DW
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 }
fdfc35cb 52 if(x == 1) /* formatted sequential */
7bd0b8c0
DW
53 { rewind(b->ufd);
54 return(OK);
55 }
fdfc35cb
DW
56 if (b->uwrt && ! nowreading(b))
57 err(errflag, errno, bksp)
58 while (last_char(b->ufd) != '\n') /* slow but simple */
59 ;
7bd0b8c0
DW
60 return(OK);
61}