Blame gl/stdbool.in.h

Packit a4aae4
/* Copyright (C) 2001-2003, 2006-2017 Free Software Foundation, Inc.
Packit a4aae4
   Written by Bruno Haible <haible@clisp.cons.org>, 2001.
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
#ifndef _GL_STDBOOL_H
Packit a4aae4
#define _GL_STDBOOL_H
Packit a4aae4
Packit a4aae4
/* ISO C 99 <stdbool.h> for platforms that lack it.  */
Packit a4aae4
Packit a4aae4
/* Usage suggestions:
Packit a4aae4
Packit a4aae4
   Programs that use <stdbool.h> should be aware of some limitations
Packit a4aae4
   and standards compliance issues.
Packit a4aae4
Packit a4aae4
   Standards compliance:
Packit a4aae4
Packit a4aae4
       - <stdbool.h> must be #included before 'bool', 'false', 'true'
Packit a4aae4
         can be used.
Packit a4aae4
Packit a4aae4
       - You cannot assume that sizeof (bool) == 1.
Packit a4aae4
Packit a4aae4
       - Programs should not undefine the macros bool, true, and false,
Packit a4aae4
         as C99 lists that as an "obsolescent feature".
Packit a4aae4
Packit a4aae4
   Limitations of this substitute, when used in a C89 environment:
Packit a4aae4
Packit a4aae4
       - <stdbool.h> must be #included before the '_Bool' type can be used.
Packit a4aae4
Packit a4aae4
       - You cannot assume that _Bool is a typedef; it might be a macro.
Packit a4aae4
Packit a4aae4
       - Bit-fields of type 'bool' are not supported.  Portable code
Packit a4aae4
         should use 'unsigned int foo : 1;' rather than 'bool foo : 1;'.
Packit a4aae4
Packit a4aae4
       - In C99, casts and automatic conversions to '_Bool' or 'bool' are
Packit a4aae4
         performed in such a way that every nonzero value gets converted
Packit a4aae4
         to 'true', and zero gets converted to 'false'.  This doesn't work
Packit a4aae4
         with this substitute.  With this substitute, only the values 0 and 1
Packit a4aae4
         give the expected result when converted to _Bool' or 'bool'.
Packit a4aae4
Packit a4aae4
       - C99 allows the use of (_Bool)0.0 in constant expressions, but
Packit a4aae4
         this substitute cannot always provide this property.
Packit a4aae4
Packit a4aae4
   Also, it is suggested that programs use 'bool' rather than '_Bool';
Packit a4aae4
   this isn't required, but 'bool' is more common.  */
Packit a4aae4
Packit a4aae4
Packit a4aae4
/* 7.16. Boolean type and values */
Packit a4aae4
Packit a4aae4
/* BeOS <sys/socket.h> already #defines false 0, true 1.  We use the same
Packit a4aae4
   definitions below, but temporarily we have to #undef them.  */
Packit a4aae4
#if defined __BEOS__ && !defined __HAIKU__
Packit a4aae4
# include <OS.h> /* defines bool but not _Bool */
Packit a4aae4
# undef false
Packit a4aae4
# undef true
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#ifdef __cplusplus
Packit a4aae4
# define _Bool bool
Packit a4aae4
# define bool bool
Packit a4aae4
#else
Packit a4aae4
# if defined __BEOS__ && !defined __HAIKU__
Packit a4aae4
  /* A compiler known to have 'bool'.  */
Packit a4aae4
  /* If the compiler already has both 'bool' and '_Bool', we can assume they
Packit a4aae4
     are the same types.  */
Packit a4aae4
#  if !@HAVE__BOOL@
Packit a4aae4
typedef bool _Bool;
Packit a4aae4
#  endif
Packit a4aae4
# else
Packit a4aae4
#  if !defined __GNUC__
Packit a4aae4
   /* If @HAVE__BOOL@:
Packit a4aae4
        Some HP-UX cc and AIX IBM C compiler versions have compiler bugs when
Packit a4aae4
        the built-in _Bool type is used.  See
Packit a4aae4
          http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
Packit a4aae4
          http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
Packit a4aae4
          http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
Packit a4aae4
        Similar bugs are likely with other compilers as well; this file
Packit a4aae4
        wouldn't be used if <stdbool.h> was working.
Packit a4aae4
        So we override the _Bool type.
Packit a4aae4
      If !@HAVE__BOOL@:
Packit a4aae4
        Need to define _Bool ourselves. As 'signed char' or as an enum type?
Packit a4aae4
        Use of a typedef, with SunPRO C, leads to a stupid
Packit a4aae4
          "warning: _Bool is a keyword in ISO C99".
Packit a4aae4
        Use of an enum type, with IRIX cc, leads to a stupid
Packit a4aae4
          "warning(1185): enumerated type mixed with another type".
Packit a4aae4
        Even the existence of an enum type, without a typedef,
Packit a4aae4
          "Invalid enumerator. (badenum)" with HP-UX cc on Tru64.
Packit a4aae4
        The only benefit of the enum, debuggability, is not important
Packit a4aae4
        with these compilers.  So use 'signed char' and no enum.  */
Packit a4aae4
#   define _Bool signed char
Packit a4aae4
#  else
Packit a4aae4
   /* With this compiler, trust the _Bool type if the compiler has it.  */
Packit a4aae4
#   if !@HAVE__BOOL@
Packit a4aae4
   /* For the sake of symbolic names in gdb, define true and false as
Packit a4aae4
      enum constants, not only as macros.
Packit a4aae4
      It is tempting to write
Packit a4aae4
         typedef enum { false = 0, true = 1 } _Bool;
Packit a4aae4
      so that gdb prints values of type 'bool' symbolically.  But then
Packit a4aae4
      values of type '_Bool' might promote to 'int' or 'unsigned int'
Packit a4aae4
      (see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int'
Packit a4aae4
      (see ISO C 99 6.3.1.1.(2)).  So add a negative value to the
Packit a4aae4
      enum; this ensures that '_Bool' promotes to 'int'.  */
Packit a4aae4
typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
Packit a4aae4
#   endif
Packit a4aae4
#  endif
Packit a4aae4
# endif
Packit a4aae4
# define bool _Bool
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
/* The other macros must be usable in preprocessor directives.  */
Packit a4aae4
#ifdef __cplusplus
Packit a4aae4
# define false false
Packit a4aae4
# define true true
Packit a4aae4
#else
Packit a4aae4
# define false 0
Packit a4aae4
# define true 1
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#define __bool_true_false_are_defined 1
Packit a4aae4
Packit a4aae4
#endif /* _GL_STDBOOL_H */