Blame lib/stdio-impl.h

Packit Service a2489d
/* Implementation details of FILE streams.
Packit Service a2489d
   Copyright (C) 2007-2008, 2010-2018 Free Software Foundation, Inc.
Packit Service a2489d
Packit Service a2489d
   This program is free software: you can redistribute it and/or modify
Packit Service a2489d
   it under the terms of the GNU General Public License as published by
Packit Service a2489d
   the Free Software Foundation; either version 3 of the License, or
Packit Service a2489d
   (at your option) any later version.
Packit Service a2489d
Packit Service a2489d
   This program is distributed in the hope that it will be useful,
Packit Service a2489d
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service a2489d
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service a2489d
   GNU General Public License for more details.
Packit Service a2489d
Packit Service a2489d
   You should have received a copy of the GNU General Public License
Packit Service a2489d
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
Packit Service a2489d
Packit Service a2489d
/* Many stdio implementations have the same logic and therefore can share
Packit Service a2489d
   the same implementation of stdio extension API, except that some fields
Packit Service a2489d
   have different naming conventions, or their access requires some casts.  */
Packit Service a2489d
Packit Service a2489d
/* Glibc 2.28 made _IO_IN_BACKUP private.  For now, work around this
Packit Service a2489d
   problem by defining it ourselves.  FIXME: Do not rely on glibc
Packit Service a2489d
   internals.  */
Packit Service a2489d
#if !defined _IO_IN_BACKUP && defined _IO_EOF_SEEN
Packit Service a2489d
# define _IO_IN_BACKUP 0x100
Packit Service a2489d
#endif
Packit Service a2489d
Packit Service a2489d
/* BSD stdio derived implementations.  */
Packit Service a2489d
Packit Service a2489d
#if defined __NetBSD__                         /* NetBSD */
Packit Service a2489d
/* Get __NetBSD_Version__.  */
Packit Service a2489d
# include <sys/param.h>
Packit Service a2489d
#endif
Packit Service a2489d
Packit Service a2489d
#include <errno.h>                             /* For detecting Plan9.  */
Packit Service a2489d
Packit Service a2489d
#if defined __sferror || defined __DragonFly__ || defined __ANDROID__
Packit Service a2489d
  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
Packit Service a2489d
Packit Service a2489d
# if defined __DragonFly__          /* DragonFly */
Packit Service a2489d
  /* See <https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/lib/libc/stdio/priv_stdio.h>.  */
Packit Service a2489d
#  define fp_ ((struct { struct __FILE_public pub; \
Packit Service a2489d
                         struct { unsigned char *_base; int _size; } _bf; \
Packit Service a2489d
                         void *cookie; \
Packit Service a2489d
                         void *_close; \
Packit Service a2489d
                         void *_read; \
Packit Service a2489d
                         void *_seek; \
Packit Service a2489d
                         void *_write; \
Packit Service a2489d
                         struct { unsigned char *_base; int _size; } _ub; \
Packit Service a2489d
                         int _ur; \
Packit Service a2489d
                         unsigned char _ubuf[3]; \
Packit Service a2489d
                         unsigned char _nbuf[1]; \
Packit Service a2489d
                         struct { unsigned char *_base; int _size; } _lb; \
Packit Service a2489d
                         int _blksize; \
Packit Service a2489d
                         fpos_t _offset; \
Packit Service a2489d
                         /* More fields, not relevant here.  */ \
Packit Service a2489d
                       } *) fp)
Packit Service a2489d
  /* See <https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/include/stdio.h>.  */
Packit Service a2489d
#  define _p pub._p
Packit Service a2489d
#  define _flags pub._flags
Packit Service a2489d
#  define _r pub._r
Packit Service a2489d
#  define _w pub._w
Packit Service a2489d
# elif defined __ANDROID__ /* Android */
Packit Service a2489d
  /* Up to this commit from 2015-10-12
Packit Service a2489d
     <https://android.googlesource.com/platform/bionic.git/+/f0141dfab10a4b332769d52fa76631a64741297a>
Packit Service a2489d
     the innards of FILE were public, and fp_ub could be defined like for OpenBSD,
Packit Service a2489d
     see <https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/fileext.h>
Packit Service a2489d
     and <https://android.googlesource.com/platform/bionic.git/+/e78392637d5086384a5631ddfdfa8d7ec8326ee3/libc/stdio/local.h>.
Packit Service a2489d
     After this commit, the innards of FILE are hidden.  */
Packit Service a2489d
#  define fp_ ((struct { unsigned char *_p; \
Packit Service a2489d
                         int _r; \
Packit Service a2489d
                         int _w; \
Packit Service a2489d
                         int _flags; \
Packit Service a2489d
                         int _file; \
Packit Service a2489d
                         struct { unsigned char *_base; size_t _size; } _bf; \
Packit Service a2489d
                         int _lbfsize; \
Packit Service a2489d
                         void *_cookie; \
Packit Service a2489d
                         void *_close; \
Packit Service a2489d
                         void *_read; \
Packit Service a2489d
                         void *_seek; \
Packit Service a2489d
                         void *_write; \
Packit Service a2489d
                         struct { unsigned char *_base; size_t _size; } _ext; \
Packit Service a2489d
                         unsigned char *_up; \
Packit Service a2489d
                         int _ur; \
Packit Service a2489d
                         unsigned char _ubuf[3]; \
Packit Service a2489d
                         unsigned char _nbuf[1]; \
Packit Service a2489d
                         struct { unsigned char *_base; size_t _size; } _lb; \
Packit Service a2489d
                         int _blksize; \
Packit Service a2489d
                         fpos_t _offset; \
Packit Service a2489d
                         /* More fields, not relevant here.  */ \
Packit Service a2489d
                       } *) fp)
Packit Service a2489d
# else
Packit Service a2489d
#  define fp_ fp
Packit Service a2489d
# endif
Packit Service a2489d
Packit Service a2489d
# if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __OpenBSD__ || defined __minix /* NetBSD >= 1.5ZA, OpenBSD, Minix 3 */
Packit Service a2489d
  /* See <http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
Packit Service a2489d
     and <https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
Packit Service a2489d
     and <https://github.com/Stichting-MINIX-Research-Foundation/minix/blob/master/lib/libc/stdio/fileext.h> */
Packit Service a2489d
  struct __sfileext
Packit Service a2489d
    {
Packit Service a2489d
      struct  __sbuf _ub; /* ungetc buffer */
Packit Service a2489d
      /* More fields, not relevant here.  */
Packit Service a2489d
    };
Packit Service a2489d
#  define fp_ub ((struct __sfileext *) fp->_ext._base)->_ub
Packit Service a2489d
# elif defined __ANDROID__                     /* Android */
Packit Service a2489d
  struct __sfileext
Packit Service a2489d
    {
Packit Service a2489d
      struct { unsigned char *_base; size_t _size; } _ub; /* ungetc buffer */
Packit Service a2489d
      /* More fields, not relevant here.  */
Packit Service a2489d
    };
Packit Service a2489d
#  define fp_ub ((struct __sfileext *) fp_->_ext._base)->_ub
Packit Service a2489d
# else                                         /* FreeBSD, NetBSD <= 1.5Z, DragonFly, Mac OS X, Cygwin */
Packit Service a2489d
#  define fp_ub fp_->_ub
Packit Service a2489d
# endif
Packit Service a2489d
Packit Service a2489d
# define HASUB(fp) (fp_ub._base != NULL)
Packit Service a2489d
Packit Service a2489d
# if defined __ANDROID__ /* Android */
Packit Service a2489d
  /* Needed after this commit from 2016-01-25
Packit Service a2489d
     <https://android.googlesource.com/platform/bionic.git/+/e70e0e9267d069bf56a5078c99307e08a7280de7> */
Packit Service a2489d
#  ifndef __SEOF
Packit Service a2489d
#   define __SLBF 1
Packit Service a2489d
#   define __SNBF 2
Packit Service a2489d
#   define __SRD 4
Packit Service a2489d
#   define __SWR 8
Packit Service a2489d
#   define __SRW 0x10
Packit Service a2489d
#   define __SEOF 0x20
Packit Service a2489d
#   define __SERR 0x40
Packit Service a2489d
#  endif
Packit Service a2489d
#  ifndef __SOFF
Packit Service a2489d
#   define __SOFF 0x1000
Packit Service a2489d
#  endif
Packit Service a2489d
# endif
Packit Service a2489d
Packit Service a2489d
#endif
Packit Service a2489d
Packit Service a2489d
Packit Service a2489d
/* SystemV derived implementations.  */
Packit Service a2489d
Packit Service a2489d
#ifdef __TANDEM                     /* NonStop Kernel */
Packit Service a2489d
# ifndef _IOERR
Packit Service a2489d
/* These values were determined by the program 'stdioext-flags' at
Packit Service a2489d
   <https://lists.gnu.org/r/bug-gnulib/2010-12/msg00165.html>.  */
Packit Service a2489d
#  define _IOERR   0x40
Packit Service a2489d
#  define _IOREAD  0x80
Packit Service a2489d
#  define _IOWRT    0x4
Packit Service a2489d
#  define _IORW   0x100
Packit Service a2489d
# endif
Packit Service a2489d
#endif
Packit Service a2489d
Packit Service a2489d
#if defined _IOERR
Packit Service a2489d
Packit Service a2489d
# if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */
Packit Service a2489d
#  define fp_ ((struct { unsigned char *_ptr; \
Packit Service a2489d
                         unsigned char *_base; \
Packit Service a2489d
                         unsigned char *_end; \
Packit Service a2489d
                         long _cnt; \
Packit Service a2489d
                         int _file; \
Packit Service a2489d
                         unsigned int _flag; \
Packit Service a2489d
                       } *) fp)
Packit Service a2489d
# elif defined __VMS                /* OpenVMS */
Packit Service a2489d
#  define fp_ ((struct _iobuf *) fp)
Packit Service a2489d
# else
Packit Service a2489d
#  define fp_ fp
Packit Service a2489d
# endif
Packit Service a2489d
Packit Service a2489d
# if defined _SCO_DS                /* OpenServer */
Packit Service a2489d
#  define _cnt __cnt
Packit Service a2489d
#  define _ptr __ptr
Packit Service a2489d
#  define _base __base
Packit Service a2489d
#  define _flag __flag
Packit Service a2489d
# endif
Packit Service a2489d
Packit Service a2489d
#elif defined _WIN32 && ! defined __CYGWIN__  /* newer Windows with MSVC */
Packit Service a2489d
Packit Service a2489d
/* <stdio.h> does not define the innards of FILE any more.  */
Packit Service a2489d
# define WINDOWS_OPAQUE_FILE
Packit Service a2489d
Packit Service a2489d
struct _gl_real_FILE
Packit Service a2489d
{
Packit Service a2489d
  /* Note: Compared to older Windows and to mingw, it has the fields
Packit Service a2489d
     _base and _cnt swapped. */
Packit Service a2489d
  unsigned char *_ptr;
Packit Service a2489d
  unsigned char *_base;
Packit Service a2489d
  int _cnt;
Packit Service a2489d
  int _flag;
Packit Service a2489d
  int _file;
Packit Service a2489d
  int _charbuf;
Packit Service a2489d
  int _bufsiz;
Packit Service a2489d
};
Packit Service a2489d
# define fp_ ((struct _gl_real_FILE *) fp)
Packit Service a2489d
Packit Service a2489d
/* These values were determined by a program similar to the one at
Packit Service a2489d
   <https://lists.gnu.org/r/bug-gnulib/2010-12/msg00165.html>.  */
Packit Service a2489d
# define _IOREAD   0x1
Packit Service a2489d
# define _IOWRT    0x2
Packit Service a2489d
# define _IORW     0x4
Packit Service a2489d
# define _IOEOF    0x8
Packit Service a2489d
# define _IOERR   0x10
Packit Service a2489d
Packit Service a2489d
#endif