Blame gnulib/stdio-impl.h

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