diff options
Diffstat (limited to 'lib/libI77/backspace.c')
-rw-r--r-- | lib/libI77/backspace.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/lib/libI77/backspace.c b/lib/libI77/backspace.c index 4213424..3771cd9 100644 --- a/lib/libI77/backspace.c +++ b/lib/libI77/backspace.c @@ -50,14 +50,16 @@ integer f_back(alist *a) #ifdef MSDOS w = -1; #endif - for(ndec = 2;; ndec = 1) + for(ndec = 1;; ndec = 0) { - y = x=ftell(b->ufd); - if(x<sizeof(buf)) x=0; - else x -= sizeof(buf); + y = x = ftell(b->ufd); + if(x < sizeof(buf)) + x = 0; + else + x -= sizeof(buf); (void) fseek(b->ufd,x,SEEK_SET); n=fread(buf,1,(int)(y-x), b->ufd); - for(i=n-ndec;i>=0;i--) + for(i = n - ndec; --i >= 0; ) { if(buf[i]!='\n') continue; #ifdef MSDOS @@ -65,17 +67,17 @@ integer f_back(alist *a) if (buf[j] == '\n') k++; fseek(b->ufd,x,SEEK_SET); - do { + for(;;) if (getc(b->ufd) == '\n') { - --k; - if ((z = ftell(b->ufd)) >= y) { + if ((z = ftell(b->ufd)) >= y && ndec) { if (w == -1) goto break2; break; } + if (--k <= 0) + return 0; w = z; } - } while(k > 0); fseek(b->ufd, w, SEEK_SET); #else fseek(b->ufd,(long)(i+1-n),SEEK_CUR); |