home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / program / 316 / libsrc / fseek.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-10-20  |  1.2 KB  |  50 lines

  1.  
  2. #include <file.h>
  3. #include "std-guts.h"
  4. #include <errno.h>
  5.  
  6. long fseek(f, pos, mode)
  7. struct file * f;
  8. long pos;
  9. int mode;
  10. {
  11.   long new_pos;
  12.  
  13.   f->eof_p = 0;                    /* just in case */
  14.   switch (mode)
  15.     {
  16.     case L_SET:  { new_pos = pos; break; };
  17.     case L_INCR: { new_pos = f->file_position + f->buf_index + pos;
  18.                mode = L_SET;
  19.                break; };
  20.     case L_XTND: { new_pos = 0; break; };
  21.     default:     { errno = EBADARG ; return(-1); };
  22.     };
  23. #ifdef DEBUG
  24.     fprintf(stderr, "fseek: %d,%d.  filepos %d, idx %d max %d\n",
  25.          pos, mode, f->file_position, f->buf_index, f->buf_max);
  26. #endif
  27.   if ((f->file_position <= new_pos) &&
  28.       ((f->file_position + f->buf_max) > new_pos))    /* have it already? */
  29.     {
  30.     f->buf_index = new_pos - f->file_position;    /* yes, point at it */
  31. #ifdef DEBUG
  32.     fprintf(stderr, "  same buf: new idx %d\n", f->buf_index);
  33. #endif
  34.     return(0);
  35.     }
  36.   if (file_output_p(f))                    /* output; flush buf */
  37.     fflush(f);
  38.   f->buf_index = f->buf_max = 0;    /* flush buf */
  39.   new_pos = lseek(f->handle, new_pos, mode);
  40.   if (new_pos >= 0)
  41.     f->file_position = new_pos;
  42. #ifdef DEBUG
  43.   fprintf(stderr, "  seeked to %d\n", f->file_position);
  44. #endif
  45.   if (new_pos < 0)
  46.     return (new_pos);
  47.     else
  48.     return (0);
  49. }
  50.