Commit | Line | Data |
---|---|---|
7bd0b8c0 | 1 | /* |
fdfc35cb | 2 | char id_backspace[] = "@(#)backspace.c 1.5"; |
7bd0b8c0 DW |
3 | * |
4 | * Backspace records | |
5 | */ | |
6 | ||
7 | #include "fio.h" | |
8 | ||
fdfc35cb DW |
9 | static char bksp[] = "backspace"; |
10 | char last_char(); | |
7bd0b8c0 | 11 | |
fdfc35cb DW |
12 | f_back(a) |
13 | alist *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 | } |