home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / unixlib36d / src / stdio / c / fpos < prev    next >
Text File  |  1994-03-08  |  1KB  |  92 lines

  1. static char sccs_id[] = "@(#) fpos.c 1.2 " __DATE__ " HJR";
  2.  
  3. /* fpos.c (c) Copyright 1990 H.Rogers */
  4.  
  5. #include <errno.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8.  
  9. extern long lseek (int, long, int);
  10.  
  11. __STDIOLIB__
  12.  
  13. int
  14. fgetpos (register FILE * f, register fpos_t * p)
  15. {
  16.   long i;
  17.  
  18.   i = ftell (f);
  19.   if (i < 0)
  20.     return ((int) i);
  21.   *p = (fpos_t) i;
  22.   return (0);
  23. }
  24.  
  25. int
  26. fsetpos (register FILE * f, register const fpos_t * p)
  27. {
  28.   return (fseek (f, (long) (*p), 0));
  29. }
  30.  
  31. int
  32. fseek (register FILE * f, long p, int w)
  33. {
  34.   long c;
  35.  
  36.   if (!fisopen (f))
  37.     return (-1);
  38.   c = ftell (f);
  39.   fflush (f);
  40.   if (f->flag & _IOERR)
  41.     return (-1);
  42.   f->flag &= ~_IOEOF;
  43.  
  44.   if (w == SEEK_SET)
  45.     {
  46.       if ((c = lseek (f->fd, p, 0)) < 0)
  47.     goto err;
  48.     }
  49.   else if (w == SEEK_CUR)
  50.     {
  51.       if ((c = lseek (f->fd, p + c, 0)) < 0)
  52.     goto err;
  53.     }
  54.   else if (w == SEEK_END)
  55.     {
  56.       if ((c = lseek (f->fd, p, 2)) < 0)
  57.     goto err;
  58.     }
  59.   else
  60.     return (-1);
  61.  
  62.   f->pos = (fpos_t) c;
  63.  
  64.   return (0);
  65.  
  66.   {
  67.   err:
  68.     f->flag |= _IOERR;
  69.     return (-1);
  70.   }
  71. }
  72.  
  73. long
  74. ftell (register FILE * f)
  75. {
  76.   if (!fisopen (f))
  77.     return (-1);
  78.   if (f->i_base)
  79.     return (f->pos - (long) f->i_cnt);
  80.   else if (f->o_base)
  81.     return (f->pos + (long) (f->o_ptr - f->o_base));
  82.   else
  83.     return (f->pos);
  84. }
  85.  
  86. void
  87. rewind (register FILE * f)
  88. {
  89.   fseek (f, 0L, 0);
  90.   clearerr (f);
  91. }
  92.