Blame gl/stddef.in.h

Packit a4aae4
/* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues.
Packit a4aae4
Packit a4aae4
   Copyright (C) 2009-2017 Free Software Foundation, Inc.
Packit a4aae4
Packit a4aae4
   This program is free software; you can redistribute it and/or modify
Packit a4aae4
   it under the terms of the GNU Lesser General Public License as published by
Packit a4aae4
   the Free Software Foundation; either version 2, or (at your option)
Packit a4aae4
   any later version.
Packit a4aae4
Packit a4aae4
   This program is distributed in the hope that it will be useful,
Packit a4aae4
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit a4aae4
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit a4aae4
   GNU Lesser General Public License for more details.
Packit a4aae4
Packit a4aae4
   You should have received a copy of the GNU Lesser General Public License
Packit a4aae4
   along with this program; if not, see <http://www.gnu.org/licenses/>.  */
Packit a4aae4
Packit a4aae4
/* Written by Eric Blake.  */
Packit a4aae4
Packit a4aae4
/*
Packit a4aae4
 * POSIX 2008 <stddef.h> for platforms that have issues.
Packit a4aae4
 * <http://www.opengroup.org/susv3xbd/stddef.h.html>
Packit a4aae4
 */
Packit a4aae4
Packit a4aae4
#if __GNUC__ >= 3
Packit a4aae4
@PRAGMA_SYSTEM_HEADER@
Packit a4aae4
#endif
Packit a4aae4
@PRAGMA_COLUMNS@
Packit a4aae4
Packit a4aae4
#if defined __need_wchar_t || defined __need_size_t  \
Packit a4aae4
  || defined __need_ptrdiff_t || defined __need_NULL \
Packit a4aae4
  || defined __need_wint_t
Packit a4aae4
/* Special invocation convention inside gcc header files.  In
Packit a4aae4
   particular, gcc provides a version of <stddef.h> that blindly
Packit a4aae4
   redefines NULL even when __need_wint_t was defined, even though
Packit a4aae4
   wint_t is not normally provided by <stddef.h>.  Hence, we must
Packit a4aae4
   remember if special invocation has ever been used to obtain wint_t,
Packit a4aae4
   in which case we need to clean up NULL yet again.  */
Packit a4aae4
Packit a4aae4
# if !(defined _@GUARD_PREFIX@_STDDEF_H && defined _GL_STDDEF_WINT_T)
Packit a4aae4
#  ifdef __need_wint_t
Packit a4aae4
#   define _GL_STDDEF_WINT_T
Packit a4aae4
#  endif
Packit a4aae4
#  @INCLUDE_NEXT@ @NEXT_STDDEF_H@
Packit a4aae4
# endif
Packit a4aae4
Packit a4aae4
#else
Packit a4aae4
/* Normal invocation convention.  */
Packit a4aae4
Packit a4aae4
# ifndef _@GUARD_PREFIX@_STDDEF_H
Packit a4aae4
Packit a4aae4
/* The include_next requires a split double-inclusion guard.  */
Packit a4aae4
Packit a4aae4
#  @INCLUDE_NEXT@ @NEXT_STDDEF_H@
Packit a4aae4
Packit a4aae4
/* On NetBSD 5.0, the definition of NULL lacks proper parentheses.  */
Packit a4aae4
#  if (@REPLACE_NULL@ \
Packit a4aae4
       && (!defined _@GUARD_PREFIX@_STDDEF_H || defined _GL_STDDEF_WINT_T))
Packit a4aae4
#   undef NULL
Packit a4aae4
#   ifdef __cplusplus
Packit a4aae4
   /* ISO C++ says that the macro NULL must expand to an integer constant
Packit a4aae4
      expression, hence '((void *) 0)' is not allowed in C++.  */
Packit a4aae4
#    if __GNUG__ >= 3
Packit a4aae4
    /* GNU C++ has a __null macro that behaves like an integer ('int' or
Packit a4aae4
       'long') but has the same size as a pointer.  Use that, to avoid
Packit a4aae4
       warnings.  */
Packit a4aae4
#     define NULL __null
Packit a4aae4
#    else
Packit a4aae4
#     define NULL 0L
Packit a4aae4
#    endif
Packit a4aae4
#   else
Packit a4aae4
#    define NULL ((void *) 0)
Packit a4aae4
#   endif
Packit a4aae4
#  endif
Packit a4aae4
Packit a4aae4
#  ifndef _@GUARD_PREFIX@_STDDEF_H
Packit a4aae4
#   define _@GUARD_PREFIX@_STDDEF_H
Packit a4aae4
Packit a4aae4
/* Some platforms lack wchar_t.  */
Packit a4aae4
#if !@HAVE_WCHAR_T@
Packit a4aae4
# define wchar_t int
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
/* Some platforms lack max_align_t.  The check for _GCC_MAX_ALIGN_T is
Packit a4aae4
   a hack in case the configure-time test was done with g++ even though
Packit a4aae4
   we are currently compiling with gcc.  */
Packit a4aae4
#if ! (@HAVE_MAX_ALIGN_T@ || defined _GCC_MAX_ALIGN_T)
Packit a4aae4
/* On the x86, the maximum storage alignment of double, long, etc. is 4,
Packit a4aae4
   but GCC's C11 ABI for x86 says that max_align_t has an alignment of 8,
Packit a4aae4
   and the C11 standard allows this.  Work around this problem by
Packit a4aae4
   using __alignof__ (which returns 8 for double) rather than _Alignof
Packit a4aae4
   (which returns 4), and align each union member accordingly.  */
Packit a4aae4
# ifdef __GNUC__
Packit a4aae4
#  define _GL_STDDEF_ALIGNAS(type) \
Packit a4aae4
     __attribute__ ((__aligned__ (__alignof__ (type))))
Packit a4aae4
# else
Packit a4aae4
#  define _GL_STDDEF_ALIGNAS(type) /* */
Packit a4aae4
# endif
Packit a4aae4
typedef union
Packit a4aae4
{
Packit a4aae4
  char *__p _GL_STDDEF_ALIGNAS (char *);
Packit a4aae4
  double __d _GL_STDDEF_ALIGNAS (double);
Packit a4aae4
  long double __ld _GL_STDDEF_ALIGNAS (long double);
Packit a4aae4
  long int __i _GL_STDDEF_ALIGNAS (long int);
Packit a4aae4
} max_align_t;
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#  endif /* _@GUARD_PREFIX@_STDDEF_H */
Packit a4aae4
# endif /* _@GUARD_PREFIX@_STDDEF_H */
Packit a4aae4
#endif /* __need_XXX */