Blame lib/freadahead.c

Packit Service 2723c6
/* Retrieve information about a FILE stream.
Packit Service 2723c6
   Copyright (C) 2007-2018 Free Software Foundation, Inc.
Packit Service 2723c6
Packit Service 2723c6
   This program is free software: you can redistribute it and/or modify
Packit Service 2723c6
   it under the terms of the GNU General Public License as published by
Packit Service 2723c6
   the Free Software Foundation; either version 3 of the License, or
Packit Service 2723c6
   (at your option) any later version.
Packit Service 2723c6
Packit Service 2723c6
   This program is distributed in the hope that it will be useful,
Packit Service 2723c6
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 2723c6
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 2723c6
   GNU General Public License for more details.
Packit Service 2723c6
Packit Service 2723c6
   You should have received a copy of the GNU General Public License
Packit Service 2723c6
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
Packit Service 2723c6
Packit Service 2723c6
#include <config.h>
Packit Service 2723c6
Packit Service 2723c6
/* Specification.  */
Packit Service 2723c6
#include "freadahead.h"
Packit Service 2723c6
Packit Service 2723c6
#include <stdlib.h>
Packit Service 2723c6
#include "stdio-impl.h"
Packit Service 2723c6
Packit Service 2723c6
#if defined __DragonFly__
Packit Service 2723c6
/* Defined in libc, but not declared in <stdio.h>.  */
Packit Service 2723c6
extern size_t __sreadahead (FILE *);
Packit Service 2723c6
#endif
Packit Service 2723c6
Packit Service 2723c6
/* This file is not used on systems that have the __freadahead function,
Packit Service 2723c6
   namely musl libc.  */
Packit Service 2723c6
Packit Service 2723c6
size_t
Packit Service 2723c6
freadahead (FILE *fp)
Packit Service 2723c6
{
Packit Service 2723c6
#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1
Packit Service 2723c6
  /* GNU libc, BeOS, Haiku, Linux libc5 */
Packit Service 2723c6
  if (fp->_IO_write_ptr > fp->_IO_write_base)
Packit Service 2723c6
    return 0;
Packit Service 2723c6
  return (fp->_IO_read_end - fp->_IO_read_ptr)
Packit Service 2723c6
         + (fp->_flags & _IO_IN_BACKUP ? fp->_IO_save_end - fp->_IO_save_base :
Packit Service 2723c6
            0);
Packit Service 2723c6
#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
Packit Service 2723c6
  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
Packit Service 2723c6
  if ((fp_->_flags & __SWR) != 0 || fp_->_r < 0)
Packit Service 2723c6
    return 0;
Packit Service 2723c6
# if defined __DragonFly__
Packit Service 2723c6
  return __sreadahead (fp);
Packit Service 2723c6
# else
Packit Service 2723c6
  return fp_->_r
Packit Service 2723c6
         + (HASUB (fp) ? fp_->_ur : 0);
Packit Service 2723c6
# endif
Packit Service 2723c6
#elif defined __EMX__               /* emx+gcc */
Packit Service 2723c6
  if ((fp->_flags & _IOWRT) != 0)
Packit Service 2723c6
    return 0;
Packit Service 2723c6
  /* Note: fp->_ungetc_count > 0 implies fp->_rcount <= 0,
Packit Service 2723c6
           fp->_ungetc_count = 0 implies fp->_rcount >= 0.  */
Packit Service 2723c6
  /* equivalent to
Packit Service 2723c6
     (fp->_ungetc_count == 0 ? fp->_rcount : fp->_ungetc_count - fp->_rcount) */
Packit Service 2723c6
  return (fp->_rcount > 0 ? fp->_rcount : fp->_ungetc_count - fp->_rcount);
Packit Service 2723c6
#elif defined __minix               /* Minix */
Packit Service 2723c6
  if ((fp_->_flags & _IOWRITING) != 0)
Packit Service 2723c6
    return 0;
Packit Service 2723c6
  return fp_->_count;
Packit Service 2723c6
#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel, OpenVMS */
Packit Service 2723c6
  if ((fp_->_flag & _IOWRT) != 0)
Packit Service 2723c6
    return 0;
Packit Service 2723c6
  return fp_->_cnt;
Packit Service 2723c6
#elif defined __UCLIBC__            /* uClibc */
Packit Service 2723c6
# ifdef __STDIO_BUFFERS
Packit Service 2723c6
  if (fp->__modeflags & __FLAG_WRITING)
Packit Service 2723c6
    return 0;
Packit Service 2723c6
  return (fp->__bufread - fp->__bufpos)
Packit Service 2723c6
         + (fp->__modeflags & __FLAG_UNGOT ? 1 : 0);
Packit Service 2723c6
# else
Packit Service 2723c6
  return 0;
Packit Service 2723c6
# endif
Packit Service 2723c6
#elif defined __QNX__               /* QNX */
Packit Service 2723c6
  if ((fp->_Mode & 0x2000 /* _MWRITE */) != 0)
Packit Service 2723c6
    return 0;
Packit Service 2723c6
  /* fp->_Buf <= fp->_Next <= fp->_Rend,
Packit Service 2723c6
     and fp->_Rend may be overridden by fp->_Rsave. */
Packit Service 2723c6
  return ((fp->_Rsave ? fp->_Rsave : fp->_Rend) - fp->_Next)
Packit Service 2723c6
         + (fp->_Mode & 0x4000 /* _MBYTE */
Packit Service 2723c6
            ? (fp->_Back + sizeof (fp->_Back)) - fp->_Rback
Packit Service 2723c6
            : 0);
Packit Service 2723c6
#elif defined __MINT__              /* Atari FreeMiNT */
Packit Service 2723c6
  if (!fp->__mode.__read)
Packit Service 2723c6
    return 0;
Packit Service 2723c6
  return (fp->__pushed_back
Packit Service 2723c6
          ? fp->__get_limit - fp->__pushback_bufp + 1
Packit Service 2723c6
          : fp->__get_limit - fp->__bufp);
Packit Service 2723c6
#elif defined EPLAN9                /* Plan9 */
Packit Service 2723c6
  if (fp->state == 4 /* WR */ || fp->rp >= fp->wp)
Packit Service 2723c6
    return 0;
Packit Service 2723c6
  return fp->wp - fp->rp;
Packit Service 2723c6
#elif defined SLOW_BUT_NO_HACKS     /* users can define this */
Packit Service 2723c6
  abort ();
Packit Service 2723c6
  return 0;
Packit Service 2723c6
#else
Packit Service 2723c6
 #error "Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib."
Packit Service 2723c6
#endif
Packit Service 2723c6
}