Blame gl/stdio-impl.h

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