home *** CD-ROM | disk | FTP | other *** search
/ PC Extra Super CD 1998 January / PCPLUS131.iso / DJGPP / V2 / DJLSR201.ZIP / src / libc / ansi / stdio / fseek.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-03-23  |  1.2 KB  |  53 lines

  1. /* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
  2. /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
  3. #include <libc/stubs.h>
  4. #include <stdio.h>
  5. #include <unistd.h>
  6. #include <libc/file.h>
  7. #include <fcntl.h>
  8. #include <libc/dosio.h>
  9.  
  10. int
  11. fseek(FILE *f, long offset, int ptrname)
  12. {
  13.   long p = -1;            /* can't happen? */
  14.  
  15.   f->_flag &= ~_IOEOF;
  16.   if (f->_flag & _IOREAD)
  17.   {
  18.     if (f->_base && !(f->_flag & _IONBF))
  19.     {
  20.       p = ftell(f);
  21.       if (ptrname == SEEK_CUR)
  22.       {
  23.     offset += p;
  24.     ptrname = SEEK_SET;
  25.       }
  26.       /* check if the target position is in the buffer and
  27.         optimize seek by moving inside the buffer */
  28.       if (ptrname == SEEK_SET && (f->_flag & (_IOUNGETC|_IORW)) == 0
  29.       && p-offset <= f->_ptr-f->_base && offset-p <= f->_cnt)
  30.       {
  31.         f->_ptr+=offset-p;
  32.         f->_cnt+=p-offset;
  33.         return 0;
  34.       }
  35.     }
  36.  
  37.     if (f->_flag & _IORW)
  38.       f->_flag &= ~_IOREAD;
  39.  
  40.     p = lseek(fileno(f), offset, ptrname);
  41.     f->_cnt = 0;
  42.     f->_ptr = f->_base;
  43.     f->_flag &= ~_IOUNGETC;
  44.   }
  45.   else if (f->_flag & (_IOWRT|_IORW))
  46.   {
  47.     p = fflush(f);
  48.     return lseek(fileno(f), offset, ptrname) == -1 || p == EOF ?
  49.       -1 : 0;
  50.   }
  51.   return p==-1 ? -1 : 0;
  52. }
  53.