home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************
- *
- * $Source: /unixb/home/unixlib/source/unixlib37/src/stdio/c/RCS/fpos,v $
- * $Date: 1996/05/06 09:01:34 $
- * $Revision: 1.2 $
- * $State: Rel $
- * $Author: unixlib $
- *
- * $Log: fpos,v $
- * Revision 1.2 1996/05/06 09:01:34 unixlib
- * Updates to sources made by Nick Burrett, Peter Burwood and Simon Callan.
- * Saved for 3.7a release.
- *
- * Revision 1.1 1996/04/19 21:32:42 simon
- * Initial revision
- *
- ***************************************************************************/
-
- static const char rcs_id[] = "$Id: fpos,v 1.2 1996/05/06 09:01:34 unixlib Rel $";
-
- #include <errno.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
-
- __STDIOLIB__
-
- int
- fgetpos (register FILE * f, register fpos_t * p)
- {
- long i;
-
- i = ftell (f);
- if (i < 0)
- return ((int) i);
- *p = (fpos_t) i;
- return (0);
- }
-
- int
- fsetpos (register FILE * f, register const fpos_t * p)
- {
- return (fseek (f, (long) (*p), 0));
- }
-
- int
- fseek (register FILE * f, long p, int w)
- {
- long c;
-
- if (!fisopen (f))
- return (-1);
- c = ftell (f);
- fflush (f);
- if (f->flag & _IOERR)
- return (-1);
- f->flag &= ~_IOEOF;
-
- if (w == SEEK_SET)
- {
- if ((c = lseek (f->fd, p, 0)) < 0)
- goto err;
- }
- else if (w == SEEK_CUR)
- {
- if ((c = lseek (f->fd, p + c, 0)) < 0)
- goto err;
- }
- else if (w == SEEK_END)
- {
- if ((c = lseek (f->fd, p, 2)) < 0)
- goto err;
- }
- else
- return (-1);
-
- f->pos = (fpos_t) c;
-
- return (0);
-
- {
- err:
- f->flag |= _IOERR;
- return (-1);
- }
- }
-
- long
- ftell (register FILE * f)
- {
- if (!fisopen (f))
- return (-1);
- if (f->i_base)
- return (f->pos - (long) f->i_cnt);
- else if (f->o_base)
- return (f->pos + (long) (f->o_ptr - f->o_base));
- else
- return (f->pos);
- }
-
- void
- rewind (register FILE * f)
- {
- fseek (f, 0L, 0);
- clearerr (f);
- }
-