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