OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc2/] [newlib/] [libc/] [stdio/] [ftell.c] - Diff between revs 207 and 520

Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 520
/*
/*
 * Copyright (c) 1990 The Regents of the University of California.
 * Copyright (c) 1990 The Regents of the University of California.
 * All rights reserved.
 * All rights reserved.
 *
 *
 * Redistribution and use in source and binary forms are permitted
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * distribution and use acknowledge that the software was developed
 * by the University of California, Berkeley.  The name of the
 * by the University of California, Berkeley.  The name of the
 * University may not be used to endorse or promote products derived
 * University may not be used to endorse or promote products derived
 * from this software without specific prior written permission.
 * from this software without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */
 */
 
 
/*
/*
FUNCTION
FUNCTION
<<ftell>>, <<ftello>>---return position in a stream or file
<<ftell>>, <<ftello>>---return position in a stream or file
 
 
INDEX
INDEX
        ftell
        ftell
INDEX
INDEX
        ftello
        ftello
INDEX
INDEX
        _ftell_r
        _ftell_r
INDEX
INDEX
        _ftello_r
        _ftello_r
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
        #include <stdio.h>
        #include <stdio.h>
        long ftell(FILE *<[fp]>);
        long ftell(FILE *<[fp]>);
        off_t ftello(FILE *<[fp]>);
        off_t ftello(FILE *<[fp]>);
        long _ftell_r(struct _reent *<[ptr]>, FILE *<[fp]>);
        long _ftell_r(struct _reent *<[ptr]>, FILE *<[fp]>);
        off_t _ftello_r(struct _reent *<[ptr]>, FILE *<[fp]>);
        off_t _ftello_r(struct _reent *<[ptr]>, FILE *<[fp]>);
 
 
TRAD_SYNOPSIS
TRAD_SYNOPSIS
        #include <stdio.h>
        #include <stdio.h>
        long ftell(<[fp]>)
        long ftell(<[fp]>)
        FILE *<[fp]>;
        FILE *<[fp]>;
 
 
        off_t ftello(<[fp]>)
        off_t ftello(<[fp]>)
        FILE *<[fp]>;
        FILE *<[fp]>;
 
 
        long _ftell_r(<[ptr]>, <[fp]>)
        long _ftell_r(<[ptr]>, <[fp]>)
        struct _reent *<[ptr]>;
        struct _reent *<[ptr]>;
        FILE *<[fp]>;
        FILE *<[fp]>;
 
 
        off_t _ftello_r(<[ptr]>, <[fp]>)
        off_t _ftello_r(<[ptr]>, <[fp]>)
        struct _reent *<[ptr]>;
        struct _reent *<[ptr]>;
        FILE *<[fp]>;
        FILE *<[fp]>;
 
 
DESCRIPTION
DESCRIPTION
Objects of type <<FILE>> can have a ``position'' that records how much
Objects of type <<FILE>> can have a ``position'' that records how much
of the file your program has already read.  Many of the <<stdio>> functions
of the file your program has already read.  Many of the <<stdio>> functions
depend on this position, and many change it as a side effect.
depend on this position, and many change it as a side effect.
 
 
The result of <<ftell>>/<<ftello>> is the current position for a file
The result of <<ftell>>/<<ftello>> is the current position for a file
identified by <[fp]>.  If you record this result, you can later
identified by <[fp]>.  If you record this result, you can later
use it with <<fseek>>/<<fseeko>> to return the file to this
use it with <<fseek>>/<<fseeko>> to return the file to this
position.  The difference between <<ftell>> and <<ftello>> is that
position.  The difference between <<ftell>> and <<ftello>> is that
<<ftell>> returns <<long>> and <<ftello>> returns <<off_t>>.
<<ftell>> returns <<long>> and <<ftello>> returns <<off_t>>.
 
 
In the current implementation, <<ftell>>/<<ftello>> simply uses a character
In the current implementation, <<ftell>>/<<ftello>> simply uses a character
count to represent the file position; this is the same number that
count to represent the file position; this is the same number that
would be recorded by <<fgetpos>>.
would be recorded by <<fgetpos>>.
 
 
RETURNS
RETURNS
<<ftell>>/<<ftello>> return the file position, if possible.  If they cannot do
<<ftell>>/<<ftello>> return the file position, if possible.  If they cannot do
this, they return <<-1L>>.  Failure occurs on streams that do not support
this, they return <<-1L>>.  Failure occurs on streams that do not support
positioning; the global <<errno>> indicates this condition with the
positioning; the global <<errno>> indicates this condition with the
value <<ESPIPE>>.
value <<ESPIPE>>.
 
 
PORTABILITY
PORTABILITY
<<ftell>> is required by the ANSI C standard, but the meaning of its
<<ftell>> is required by the ANSI C standard, but the meaning of its
result (when successful) is not specified beyond requiring that it be
result (when successful) is not specified beyond requiring that it be
acceptable as an argument to <<fseek>>.  In particular, other
acceptable as an argument to <<fseek>>.  In particular, other
conforming C implementations may return a different result from
conforming C implementations may return a different result from
<<ftell>> than what <<fgetpos>> records.
<<ftell>> than what <<fgetpos>> records.
 
 
<<ftello>> is defined by the Single Unix specification.
<<ftello>> is defined by the Single Unix specification.
 
 
No supporting OS subroutines are required.
No supporting OS subroutines are required.
*/
*/
 
 
#if defined(LIBC_SCCS) && !defined(lint)
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "%W% (Berkeley) %G%";
static char sccsid[] = "%W% (Berkeley) %G%";
#endif /* LIBC_SCCS and not lint */
#endif /* LIBC_SCCS and not lint */
 
 
/*
/*
 * ftell: return current offset.
 * ftell: return current offset.
 */
 */
 
 
#include <_ansi.h>
#include <_ansi.h>
#include <reent.h>
#include <reent.h>
#include <stdio.h>
#include <stdio.h>
#include <errno.h>
#include <errno.h>
#include "local.h"
#include "local.h"
 
 
long
long
_DEFUN(_ftell_r, (ptr, fp),
_DEFUN(_ftell_r, (ptr, fp),
       struct _reent *ptr _AND
       struct _reent *ptr _AND
       register FILE * fp)
       register FILE * fp)
{
{
  _fpos_t pos;
  _fpos_t pos;
 
 
  /* Ensure stdio is set up.  */
  /* Ensure stdio is set up.  */
 
 
  CHECK_INIT (ptr, fp);
  CHECK_INIT (ptr, fp);
 
 
  _flockfile (fp);
  _flockfile (fp);
 
 
  if (fp->_seek == NULL)
  if (fp->_seek == NULL)
    {
    {
      ptr->_errno = ESPIPE;
      ptr->_errno = ESPIPE;
      _funlockfile (fp);
      _funlockfile (fp);
      return -1L;
      return -1L;
    }
    }
 
 
  /* Find offset of underlying I/O object, then adjust for buffered
  /* Find offset of underlying I/O object, then adjust for buffered
     bytes.  Flush a write stream, since the offset may be altered if
     bytes.  Flush a write stream, since the offset may be altered if
     the stream is appending.  Do not flush a read stream, since we
     the stream is appending.  Do not flush a read stream, since we
     must not lose the ungetc buffer.  */
     must not lose the ungetc buffer.  */
  if (fp->_flags & __SWR)
  if (fp->_flags & __SWR)
    _fflush_r (ptr, fp);
    _fflush_r (ptr, fp);
  if (fp->_flags & __SOFF)
  if (fp->_flags & __SOFF)
    pos = fp->_offset;
    pos = fp->_offset;
  else
  else
    {
    {
      pos = fp->_seek (ptr, fp->_cookie, (_fpos_t) 0, SEEK_CUR);
      pos = fp->_seek (ptr, fp->_cookie, (_fpos_t) 0, SEEK_CUR);
      if (pos == -1L)
      if (pos == -1L)
        {
        {
          _funlockfile (fp);
          _funlockfile (fp);
          return pos;
          return pos;
        }
        }
    }
    }
  if (fp->_flags & __SRD)
  if (fp->_flags & __SRD)
    {
    {
      /*
      /*
       * Reading.  Any unread characters (including
       * Reading.  Any unread characters (including
       * those from ungetc) cause the position to be
       * those from ungetc) cause the position to be
       * smaller than that in the underlying object.
       * smaller than that in the underlying object.
       */
       */
      pos -= fp->_r;
      pos -= fp->_r;
      if (HASUB (fp))
      if (HASUB (fp))
        pos -= fp->_ur;
        pos -= fp->_ur;
    }
    }
  else if ((fp->_flags & __SWR) && fp->_p != NULL)
  else if ((fp->_flags & __SWR) && fp->_p != NULL)
    {
    {
      /*
      /*
       * Writing.  Any buffered characters cause the
       * Writing.  Any buffered characters cause the
       * position to be greater than that in the
       * position to be greater than that in the
       * underlying object.
       * underlying object.
       */
       */
      pos += fp->_p - fp->_bf._base;
      pos += fp->_p - fp->_bf._base;
    }
    }
 
 
  _funlockfile (fp);
  _funlockfile (fp);
  if ((long)pos != pos)
  if ((long)pos != pos)
    {
    {
      pos = -1;
      pos = -1;
      ptr->_errno = EOVERFLOW;
      ptr->_errno = EOVERFLOW;
    }
    }
  return pos;
  return pos;
}
}
 
 
#ifndef _REENT_ONLY
#ifndef _REENT_ONLY
 
 
long
long
_DEFUN(ftell, (fp),
_DEFUN(ftell, (fp),
       register FILE * fp)
       register FILE * fp)
{
{
  return _ftell_r (_REENT, fp);
  return _ftell_r (_REENT, fp);
}
}
 
 
#endif /* !_REENT_ONLY */
#endif /* !_REENT_ONLY */
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.