Pristine Ack-5.5
[Ack-5.5.git] / lang / fortran / lib / libI77 / backspace.c
1 #include "f2c.h"
2 #include "fio.h"
3 integer f_back(a) alist *a;
4 {       unit *b;
5         int n,i;
6         long x;
7         char buf[32];
8         if(a->aunit >= MXUNIT || a->aunit < 0)
9                 err(a->aerr,101,"backspace")
10         b= &units[a->aunit];
11         if(b->useek==0) err(a->aerr,106,"backspace")
12         if(b->ufd==NULL) {
13                 fk_open(1, 1, a->aunit);
14                 return(0);
15                 }
16         if(b->uend==1)
17         {       b->uend=0;
18                 return(0);
19         }
20         if(b->uwrt) {
21                 (void) t_runc(a);
22                 if (nowreading(b))
23                         err(a->aerr,errno,"backspace")
24                 }
25         if(b->url>0)
26         {       long y;
27                 x=ftell(b->ufd);
28                 y = x % b->url;
29                 if(y == 0) x--;
30                 x /= b->url;
31                 x *= b->url;
32                 (void) fseek(b->ufd,x,SEEK_SET);
33                 return(0);
34         }
35
36         if(b->ufmt==0)
37         {       (void) fseek(b->ufd,-(long)sizeof(int),SEEK_CUR);
38                 (void) fread((char *)&n,sizeof(int),1,b->ufd);
39                 (void) fseek(b->ufd,-(long)n-2*sizeof(int),SEEK_CUR);
40                 return(0);
41         }
42         for(;;)
43         {       long y;
44                 y = x=ftell(b->ufd);
45                 if(x<sizeof(buf)) x=0;
46                 else x -= sizeof(buf);
47                 (void) fseek(b->ufd,x,SEEK_SET);
48                 n=fread(buf,1,(int)(y-x), b->ufd);
49                 for(i=n-2;i>=0;i--)
50                 {
51                         if(buf[i]!='\n') continue;
52                         (void) fseek(b->ufd,(long)(i+1-n),SEEK_CUR);
53                         return(0);
54                 }
55                 if(x==0)
56                         {
57                         (void) fseek(b->ufd, 0L, SEEK_SET);
58                         return(0);
59                         }
60                 else if(n<=0) err(a->aerr,(EOF),"backspace")
61                 (void) fseek(b->ufd, x, SEEK_SET);
62         }
63 }