Blame lib/stdio-impl.h

Packit 709fb3
/* Implementation details of FILE streams.
Packit 709fb3
   Copyright (C) 2007-2008, 2010-2017 Free Software Foundation, Inc.
Packit 709fb3
Packit 709fb3
   This program is free software: you can redistribute it and/or modify
Packit 709fb3
   it under the terms of the GNU General Public License as published by
Packit 709fb3
   the Free Software Foundation; either version 3 of the License, or
Packit 709fb3
   (at your option) any later version.
Packit 709fb3
Packit 709fb3
   This program is distributed in the hope that it will be useful,
Packit 709fb3
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 709fb3
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 709fb3
   GNU General Public License for more details.
Packit 709fb3
Packit 709fb3
   You should have received a copy of the GNU General Public License
Packit 709fb3
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit 709fb3
Packit 709fb3
/* Many stdio implementations have the same logic and therefore can share
Packit 709fb3
   the same implementation of stdio extension API, except that some fields
Packit 709fb3
   have different naming conventions, or their access requires some casts.  */
Packit 709fb3
Packit 709fb3
Packit 709fb3
/* BSD stdio derived implementations.  */
Packit 709fb3
Packit 709fb3
#if defined __NetBSD__                         /* NetBSD */
Packit 709fb3
/* Get __NetBSD_Version__.  */
Packit 709fb3
# include <sys/param.h>
Packit 709fb3
#endif
Packit 709fb3
Packit 709fb3
#include <errno.h>                             /* For detecting Plan9.  */
Packit 709fb3
Packit 709fb3
#if defined __sferror || defined __DragonFly__ || defined __ANDROID__
Packit 709fb3
  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Minix 3, Android */
Packit 709fb3
Packit 709fb3
# if defined __DragonFly__          /* DragonFly */
Packit 709fb3
  /* See <http://www.dragonflybsd.org/cvsweb/src/lib/libc/stdio/priv_stdio.h?rev=HEAD&content-type=text/x-cvsweb-markup>.  */
Packit 709fb3
#  define fp_ ((struct { struct __FILE_public pub; \
Packit 709fb3
                         struct { unsigned char *_base; int _size; } _bf; \
Packit 709fb3
                         void *cookie; \
Packit 709fb3
                         void *_close; \
Packit 709fb3
                         void *_read; \
Packit 709fb3
                         void *_seek; \
Packit 709fb3
                         void *_write; \
Packit 709fb3
                         struct { unsigned char *_base; int _size; } _ub; \
Packit 709fb3
                         int _ur; \
Packit 709fb3
                         unsigned char _ubuf[3]; \
Packit 709fb3
                         unsigned char _nbuf[1]; \
Packit 709fb3
                         struct { unsigned char *_base; int _size; } _lb; \
Packit 709fb3
                         int _blksize; \
Packit 709fb3
                         fpos_t _offset; \
Packit 709fb3
                         /* More fields, not relevant here.  */ \
Packit 709fb3
                       } *) fp)
Packit 709fb3
  /* See <http://www.dragonflybsd.org/cvsweb/src/include/stdio.h?rev=HEAD&content-type=text/x-cvsweb-markup>.  */
Packit 709fb3
#  define _p pub._p
Packit 709fb3
#  define _flags pub._flags
Packit 709fb3
#  define _r pub._r
Packit 709fb3
#  define _w pub._w
Packit 709fb3
# else
Packit 709fb3
#  define fp_ fp
Packit 709fb3
# endif
Packit 709fb3
Packit 709fb3
# if (defined __NetBSD__ && __NetBSD_Version__ >= 105270000) || defined __OpenBSD__ || defined __minix || defined __ANDROID__ /* NetBSD >= 1.5ZA, OpenBSD, Minix 3, Android */
Packit 709fb3
  /* See <http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup>
Packit 709fb3
     and <http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdio/fileext.h?rev=HEAD&content-type=text/x-cvsweb-markup> */
Packit 709fb3
  struct __sfileext
Packit 709fb3
    {
Packit 709fb3
      struct  __sbuf _ub; /* ungetc buffer */
Packit 709fb3
      /* More fields, not relevant here.  */
Packit 709fb3
    };
Packit 709fb3
#  define fp_ub ((struct __sfileext *) fp->_ext._base)->_ub
Packit 709fb3
# else                                         /* FreeBSD, NetBSD <= 1.5Z, DragonFly, Mac OS X, Cygwin, Android */
Packit 709fb3
#  define fp_ub fp_->_ub
Packit 709fb3
# endif
Packit 709fb3
Packit 709fb3
# define HASUB(fp) (fp_ub._base != NULL)
Packit 709fb3
Packit 709fb3
#endif
Packit 709fb3
Packit 709fb3
Packit 709fb3
/* SystemV derived implementations.  */
Packit 709fb3
Packit 709fb3
#ifdef __TANDEM                     /* NonStop Kernel */
Packit 709fb3
# ifndef _IOERR
Packit 709fb3
/* These values were determined by the program 'stdioext-flags' at
Packit 709fb3
   <http://lists.gnu.org/archive/html/bug-gnulib/2010-12/msg00165.html>.  */
Packit 709fb3
#  define _IOERR   0x40
Packit 709fb3
#  define _IOREAD  0x80
Packit 709fb3
#  define _IOWRT    0x4
Packit 709fb3
#  define _IORW   0x100
Packit 709fb3
# endif
Packit 709fb3
#endif
Packit 709fb3
Packit 709fb3
#if defined _IOERR
Packit 709fb3
Packit 709fb3
# if defined __sun && defined _LP64 /* Solaris/{SPARC,AMD64} 64-bit */
Packit 709fb3
#  define fp_ ((struct { unsigned char *_ptr; \
Packit 709fb3
                         unsigned char *_base; \
Packit 709fb3
                         unsigned char *_end; \
Packit 709fb3
                         long _cnt; \
Packit 709fb3
                         int _file; \
Packit 709fb3
                         unsigned int _flag; \
Packit 709fb3
                       } *) fp)
Packit 709fb3
# else
Packit 709fb3
#  define fp_ fp
Packit 709fb3
# endif
Packit 709fb3
Packit 709fb3
# if defined _SCO_DS                /* OpenServer */
Packit 709fb3
#  define _cnt __cnt
Packit 709fb3
#  define _ptr __ptr
Packit 709fb3
#  define _base __base
Packit 709fb3
#  define _flag __flag
Packit 709fb3
# endif
Packit 709fb3
Packit 709fb3
#elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__  /* newer Windows with MSVC */
Packit 709fb3
Packit 709fb3
/* <stdio.h> does not define the innards of FILE any more.  */
Packit 709fb3
# define WINDOWS_OPAQUE_FILE
Packit 709fb3
Packit 709fb3
struct _gl_real_FILE
Packit 709fb3
{
Packit 709fb3
  /* Note: Compared to older Windows and to mingw, it has the fields
Packit 709fb3
     _base and _cnt swapped. */
Packit 709fb3
  unsigned char *_ptr;
Packit 709fb3
  unsigned char *_base;
Packit 709fb3
  int _cnt;
Packit 709fb3
  int _flag;
Packit 709fb3
  int _file;
Packit 709fb3
  int _charbuf;
Packit 709fb3
  int _bufsiz;
Packit 709fb3
};
Packit 709fb3
# define fp_ ((struct _gl_real_FILE *) fp)
Packit 709fb3
Packit 709fb3
/* These values were determined by a program similar to the one at
Packit 709fb3
   <http://lists.gnu.org/archive/html/bug-gnulib/2010-12/msg00165.html>.  */
Packit 709fb3
# define _IOREAD   0x1
Packit 709fb3
# define _IOWRT    0x2
Packit 709fb3
# define _IORW     0x4
Packit 709fb3
# define _IOEOF    0x8
Packit 709fb3
# define _IOERR   0x10
Packit 709fb3
Packit 709fb3
#endif