Blame lib/stdio-impl.h

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