Commit | Line | Data |
---|---|---|
8662e665 PW |
1 | #include "fio.h" |
2 | f_back(a) alist *a; | |
3 | { unit *b; | |
4 | int n,i; | |
5 | long x; | |
6 | char buf[32]; | |
7 | if(a->aunit >= MXUNIT || a->aunit < 0) | |
8 | err(a->aerr,101,"backspace") | |
9 | b= &units[a->aunit]; | |
10 | if(b->useek==0) err(a->aerr,106,"backspace") | |
11 | if(b->ufd==NULL) err(a->aerr,114,"backspace") | |
12 | if(b->uend==1) | |
13 | { b->uend=0; | |
14 | return(0); | |
15 | } | |
16 | if(b->uwrt) | |
17 | { t_runc(b); | |
18 | nowreading(b); | |
19 | } | |
20 | if(b->url>0) | |
21 | { | |
22 | x=ftell(b->ufd); | |
23 | x /= b->url; | |
24 | x *= b->url; | |
25 | fseek(b->ufd,x,0); | |
26 | return(0); | |
27 | } | |
28 | if(b->ufmt==0) | |
29 | { fseek(b->ufd,-(long)sizeof(int),1); | |
30 | fread((char *)&n,sizeof(int),1,b->ufd); | |
31 | fseek(b->ufd,-(long)n-2*sizeof(int),1); | |
32 | return(0); | |
33 | } | |
34 | for(;;) | |
35 | { | |
36 | x=ftell(b->ufd); | |
37 | if(x<sizeof(buf)) x=0; | |
38 | else x -= sizeof(buf); | |
39 | fseek(b->ufd,x,0); | |
40 | n=fread(buf,1,sizeof(buf),b->ufd); | |
41 | for(i=n-1;i>=0;i--) | |
42 | { | |
43 | if(buf[i]!='\n') continue; | |
44 | fseek(b->ufd,(long)(i-n),1); | |
45 | return(0); | |
46 | } | |
47 | if(x==0) return(0); | |
48 | else if(n==0) err(a->aerr,(EOF),"backspace") | |
49 | else err(a->aerr,errno,"backspace"); | |
50 | } | |
51 | } |