#include #include "f2c.h" #include "fio.h" #ifdef KR_headers integer f_back(a) alist *a; #else integer f_back(alist *a) #endif { unit *b; long v, w, x, y, z; uiolen n; FILE *f; f__curunit = b = &f__units[a->aunit]; /* curunit for error messages */ if (f__init & 2) f__fatal (131, "I/O recursion"); if(a->aunit >= MXUNIT || a->aunit < 0) err(a->aerr,101,"backspace"); if(b->useek==0) err(a->aerr,106,"backspace"); if((f = b->ufd) == NULL) { fk_open(1, 1, a->aunit); return(0); } if(b->uend==1) { b->uend=0; return(0); } if(b->uwrt) { (void) t_runc(a); f = b->ufd; /* t_runc might change b->ufd */ if (f__nowreading(b)) err(a->aerr,errno,"backspace"); } if(b->url>0) { x=ftell(f); y = x % b->url; if(y == 0) x--; x /= b->url; x *= b->url; (void) fseek(f,x,SEEK_SET); return(0); } if(b->ufmt==0) { fseek(f,-(long)sizeof(uiolen),SEEK_CUR); fread((char *)&n,sizeof(uiolen),1,f); fseek(f,-(long)n-2*sizeof(uiolen),SEEK_CUR); return(0); } w = x = ftell(f); z = 0; loop: while(x) { x -= x < 64 ? x : 64; fseek(f,x,SEEK_SET); for(y = x; y < w; y++) { if (getc(f) != '\n') continue; v = ftell(f); if (v == w) { if (z) goto break2; goto loop; } z = v; } err(a->aerr,(EOF),"backspace"); } break2: fseek(f, z, SEEK_SET); return 0; }