Commit | Line | Data |
---|---|---|
7bd0b8c0 | 1 | /* |
1604dff5 | 2 | char id_backspace[] = "@(#)backspace.c 1.4"; |
7bd0b8c0 DW |
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; | |
2621bc46 | 16 | |
7bd0b8c0 DW |
17 | lfname = NULL; |
18 | elist = NO; | |
19 | external = YES; | |
20 | errflag = a->aerr; | |
21 | lunit = a->aunit; | |
3bbbaca0 | 22 | if (not_legal(lunit)) err(errflag,F_ERUNIT,bksp) |
7bd0b8c0 DW |
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; | |
1604dff5 | 29 | clearerr(b->ufd); |
7bd0b8c0 DW |
30 | return(OK); |
31 | } | |
32 | if((x=ftell(b->ufd))==0) return(OK); | |
3bbbaca0 | 33 | if(!b->useek) err(errflag,F_ERNOBKSP,bksp) |
2621bc46 | 34 | if(b->uwrt && (n=t_runc(b,errflag))) return(n); |
7bd0b8c0 DW |
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 | } |