BSD 4_1_snap release
[unix-history] / usr / src / libc / stdio / fseek.c
index ecbda88..5347996 100644 (file)
@@ -1,3 +1,4 @@
+/* @(#)fseek.c 4.2 (Berkeley) 3/9/81 */
 /*
  * Seek for standard library.  Coordinates with buffering.
  */
 /*
  * Seek for standard library.  Coordinates with buffering.
  */
@@ -7,35 +8,41 @@
 long lseek();
 
 fseek(iop, offset, ptrname)
 long lseek();
 
 fseek(iop, offset, ptrname)
-       register FILE *iop;
-       long offset;
+FILE *iop;
+long offset;
 {
 {
-       register int c;
+       register resync, c;
        long p;
 
        iop->_flag &= ~_IOEOF;
        long p;
 
        iop->_flag &= ~_IOEOF;
-       if (iop->_flag & _IOREAD) {
-               if (ptrname < 2 && iop->_base && !(iop->_flag&_IONBF)) {
+       if (iop->_flag&_IOREAD) {
+               if (ptrname<2 && iop->_base &&
+                       !(iop->_flag&_IONBF)) {
                        c = iop->_cnt;
                        p = offset;
                        c = iop->_cnt;
                        p = offset;
-                       if (ptrname == 0)
-                               p += c - lseek(fileno(iop), 0L, 1);
+                       if (ptrname==0)
+                               p += c - lseek(fileno(iop),0L,1);
                        else
                                offset -= c;
                        else
                                offset -= c;
-                       if (!(iop->_flag&_IORW) && c > 0 && p <= c
-                           && p >= iop->_base - iop->_ptr){
-                               iop->_ptr += (int) p;
-                               iop->_cnt -= (int) p;
+                       if(!(iop->_flag&_IORW) && c>0&&p<=c
+                           && p>=iop->_base-iop->_ptr){
+                               iop->_ptr += (int)p;
+                               iop->_cnt -= (int)p;
                                return(0);
                        }
                                return(0);
                        }
-               }
+                       resync = offset&01;
+               } else 
+                       resync = 0;
                if (iop->_flag & _IORW) {
                        iop->_ptr = iop->_base;
                        iop->_flag &= ~_IOREAD;
                }
                if (iop->_flag & _IORW) {
                        iop->_ptr = iop->_base;
                        iop->_flag &= ~_IOREAD;
                }
-               p = lseek(fileno(iop), offset, ptrname);
+               p = lseek(fileno(iop), offset-resync, ptrname);
                iop->_cnt = 0;
                iop->_cnt = 0;
-       } else if(iop->_flag & (_IOWRT|_IORW)) {
+               if (resync)
+                       getc(iop);
+       }
+       else if (iop->_flag & (_IOWRT|_IORW)) {
                fflush(iop);
                if (iop->_flag & _IORW) {
                        iop->_cnt = 0;
                fflush(iop);
                if (iop->_flag & _IORW) {
                        iop->_cnt = 0;
@@ -44,5 +51,5 @@ fseek(iop, offset, ptrname)
                }
                p = lseek(fileno(iop), offset, ptrname);
        }
                }
                p = lseek(fileno(iop), offset, ptrname);
        }
-       return(p==-1? -1: 0);
+       return(p==-1?-1:0);
 }
 }