1*26653Sdonn #if defined(LIBC_SCCS) && !defined(lint) 2*26653Sdonn static char sccsid[] = "@(#)fseek.c 5.3 (Berkeley) 03/09/86"; 3*26653Sdonn #endif LIBC_SCCS and not lint 422134Smckusick 52009Swnj /* 62009Swnj * Seek for standard library. Coordinates with buffering. 72009Swnj */ 82009Swnj 92009Swnj #include <stdio.h> 102009Swnj 112009Swnj long lseek(); 122009Swnj 132009Swnj fseek(iop, offset, ptrname) 1417953Sserge register FILE *iop; 1517953Sserge long offset; 162009Swnj { 172009Swnj register resync, c; 1826431Slepreau long p = -1; /* can't happen? */ 192009Swnj 202009Swnj iop->_flag &= ~_IOEOF; 212009Swnj if (iop->_flag&_IOREAD) { 222009Swnj if (ptrname<2 && iop->_base && 232009Swnj !(iop->_flag&_IONBF)) { 242009Swnj c = iop->_cnt; 252009Swnj p = offset; 2617953Sserge if (ptrname==0) { 2726431Slepreau long curpos = lseek(fileno(iop), 0L, 1); 2817953Sserge if (curpos == -1) 2917953Sserge return (-1); 3017953Sserge p += c - curpos; 3117953Sserge } else 322009Swnj offset -= c; 333163Stoy if(!(iop->_flag&_IORW) && c>0&&p<=c 343163Stoy && p>=iop->_base-iop->_ptr){ 352009Swnj iop->_ptr += (int)p; 362009Swnj iop->_cnt -= (int)p; 3726431Slepreau return(0); 382009Swnj } 392009Swnj resync = offset&01; 402009Swnj } else 412009Swnj resync = 0; 423163Stoy if (iop->_flag & _IORW) { 433163Stoy iop->_ptr = iop->_base; 443163Stoy iop->_flag &= ~_IOREAD; 4515072Skarels resync = 0; 463163Stoy } 472009Swnj p = lseek(fileno(iop), offset-resync, ptrname); 482009Swnj iop->_cnt = 0; 4926431Slepreau if (resync && p != -1) 5026431Slepreau if (getc(iop) == EOF) 5126431Slepreau p = -1; 522009Swnj } 533163Stoy else if (iop->_flag & (_IOWRT|_IORW)) { 5426431Slepreau p = fflush(iop); 553163Stoy if (iop->_flag & _IORW) { 563163Stoy iop->_cnt = 0; 573163Stoy iop->_flag &= ~_IOWRT; 583163Stoy iop->_ptr = iop->_base; 593163Stoy } 6026431Slepreau return(lseek(fileno(iop), offset, ptrname) == -1 || p == EOF ? 6126431Slepreau -1 : 0); 622009Swnj } 6326431Slepreau return(p==-1?-1:0); 642009Swnj } 65