home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / libI77 / backspace.c next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  977 b   |  52 lines

  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. }
  52.