|
|
1.1 ! root 1: /* @(#)backspace.c 1.3 */ ! 2: /* 3.0 SID # 1.2 */ ! 3: #include "fio.h" ! 4: f_back(a) alist *a; ! 5: { unit *b; ! 6: int n,i; ! 7: long x; ! 8: char buf[32]; ! 9: if(a->aunit >= MXUNIT || a->aunit < 0) ! 10: err(a->aerr,101,"backspace") ! 11: b= &units[a->aunit]; ! 12: if(b->useek==0) err(a->aerr,106,"backspace") ! 13: if(b->ufd==NULL) err(a->aerr,114,"backspace") ! 14: if(b->uend==1) ! 15: { b->uend=0; ! 16: return(0); ! 17: } ! 18: if(b->uwrt) ! 19: { (void) t_runc(b); ! 20: (void) nowreading(b); ! 21: } ! 22: if(b->url>0) ! 23: { long y; ! 24: x=ftell(b->ufd); ! 25: y = x % b->url; ! 26: if(y == 0) x--; ! 27: x /= b->url; ! 28: x *= b->url; ! 29: (void) fseek(b->ufd,x,0); ! 30: return(0); ! 31: } ! 32: if(b->ufmt==0) ! 33: { (void) fseek(b->ufd,-(long)sizeof(int),1); ! 34: (void) fread((char *)&n,sizeof(int),1,b->ufd); ! 35: (void) fseek(b->ufd,-(long)n-2*sizeof(int),1); ! 36: return(0); ! 37: } ! 38: for(;;) ! 39: { long y; ! 40: y = x=ftell(b->ufd); ! 41: if(x<sizeof(buf)) x=0; ! 42: else x -= sizeof(buf); ! 43: (void) fseek(b->ufd,x,0); ! 44: n=fread(buf,1,(int)(y-x), b->ufd); ! 45: for(i=n-2;i>=0;i--) ! 46: { ! 47: if(buf[i]!='\n') continue; ! 48: (void) fseek(b->ufd,(long)(i+1-n),1); ! 49: return(0); ! 50: } ! 51: if(x==0) ! 52: { ! 53: (void) fseek(b->ufd, 0L, 0); ! 54: return(0); ! 55: } ! 56: else if(n<=0) err(a->aerr,(EOF),"backspace") ! 57: (void) fseek(b->ufd, x, 0); ! 58: } ! 59: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.