Blame gettext-runtime/gnulib-lib/stdbool.in.h

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