home *** CD-ROM | disk | FTP | other *** search
/ Super PC 34 / Super PC 34 (Shareware).iso / spc / UTIL / DJGPP2 / V2 / DJLSR200.ZIP / src / libc / ansi / stdio / fseek.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-02-05  |  854 b   |  40 lines

  1. /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
  2. #include <libc/stubs.h>
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #include <libc/file.h>
  6. #include <fcntl.h>
  7. #include <libc/dosio.h>
  8.  
  9. int
  10. fseek(FILE *f, long offset, int ptrname)
  11. {
  12.   long p = -1;            /* can't happen? */
  13.  
  14.   f->_flag &= ~_IOEOF;
  15.   if (f->_flag & _IOREAD)
  16.   {
  17.     if ((ptrname == SEEK_CUR) && f->_base && !(f->_flag & _IONBF))
  18.     {
  19.       offset += ftell(f);
  20.       ptrname = SEEK_SET;
  21.     }
  22.  
  23.     if (f->_flag & _IORW)
  24.     {
  25.       f->_ptr = f->_base;
  26.       f->_flag &= ~_IOREAD;
  27.     }
  28.     p = lseek(fileno(f), offset, ptrname);
  29.     f->_cnt = 0;
  30.     f->_ptr = f->_base;
  31.   }
  32.   else if (f->_flag & (_IOWRT|_IORW))
  33.   {
  34.     p = fflush(f);
  35.     return lseek(fileno(f), offset, ptrname) == -1 || p == EOF ?
  36.       -1 : 0;
  37.   }
  38.   return p==-1 ? -1 : 0;
  39. }
  40.