Research V7 development
[unix-history] / usr / src / libI77 / backspace.c
CommitLineData
8662e665
PW
1#include "fio.h"
2f_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}