]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - include/limits.h
test-container: Fix "unused code" warnings on HURD
[thirdparty/glibc.git] / include / limits.h
index ab51f483312b4a1af4435471e8f25a4ac748bba4..e332be732d103972ac95589798f566bdf0b6b484 100644 (file)
@@ -1,52 +1,40 @@
-/* Copyright (C) 1991, 1992, 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991-2022 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
 
 /*
- *     ISO C Standard: 4.14/2.2.4.2 Limits of integral types   <limits.h>
+ *     ISO C99 Standard: 7.10/5.2.4.2.1 Sizes of integer types <limits.h>
  */
 
 #ifndef _LIBC_LIMITS_H_
 #define _LIBC_LIMITS_H_        1
 
-#include <features.h>
+#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+#include <bits/libc-header-start.h>
 
-#ifdef __USE_POSIX
-/* POSIX adds things to <limits.h>.  */
-# include <bits/posix1_lim.h>
-#endif
 
-#ifdef __USE_POSIX2
-# include <bits/posix2_lim.h>
-#endif
+/* Maximum length of any multibyte character in any locale.
+   We define this value here since the gcc header does not define
+   the correct value.  */
+#define MB_LEN_MAX     16
 
-#ifdef __USE_XOPEN
-# include <bits/xopen_lim.h>
-#endif
 
-
-#if __GNUC__ >= 2
-
- /* Get the compiler's limits.h, which defines all the ANSI constants.  */
-# ifndef _GCC_LIMITS_H_                /* This is what GCC's file defines.  */
-#  include_next <limits.h>
-# endif
-
-#else  /* Not GCC 2.  */
+/* If we are not using GNU CC we have to define all the symbols ourself.
+   Otherwise use gcc's definitions (see below).  */
+#if !defined __GNUC__ || __GNUC__ < 2
 
 /* We only protect from multiple inclusion here, because all the other
    #include's protect themselves, and in GCC 2 we may #include_next through
@@ -54,6 +42,8 @@
 # ifndef _LIMITS_H
 #  define _LIMITS_H    1
 
+#include <bits/wordsize.h>
+
 /* We don't have #include_next.
    Define ANSI <limits.h> for standard 32-bit words.  */
 
@@ -63,9 +53,6 @@
 /* Number of bits in a `char'. */
 #  define CHAR_BIT     8
 
-/* Maximum length of any multibyte character in any locale.  */
-#  define MB_LEN_MAX   6
-
 /* Minimum and maximum values a `signed char' can hold.  */
 #  define SCHAR_MIN    (-128)
 #  define SCHAR_MAX    127
 #  define INT_MAX      2147483647
 
 /* Maximum value an `unsigned int' can hold.  (Minimum is 0.)  */
-#  ifdef __STDC__
-#   define UINT_MAX    4294967295U
-#  else
-#   define UINT_MAX    4294967295
-#  endif
+#  define UINT_MAX     4294967295U
 
 /* Minimum and maximum values a `signed long int' can hold.  */
-#  ifdef __alpha__
+#  if __WORDSIZE == 64
 #   define LONG_MAX    9223372036854775807L
 #  else
 #   define LONG_MAX    2147483647L
 #  define LONG_MIN     (-LONG_MAX - 1L)
 
 /* Maximum value an `unsigned long int' can hold.  (Minimum is 0.)  */
-#  ifdef __alpha__
+#  if __WORDSIZE == 64
 #   define ULONG_MAX   18446744073709551615UL
 #  else
-#   ifdef __STDC__
-#    define ULONG_MAX  4294967295UL
-#   else
-#    define ULONG_MAX  4294967295L
-#   endif
+#   define ULONG_MAX   4294967295UL
 #  endif
 
+#  ifdef __USE_ISOC99
+
+/* Minimum and maximum values a `signed long long int' can hold.  */
+#   define LLONG_MAX   9223372036854775807LL
+#   define LLONG_MIN   (-LLONG_MAX - 1LL)
+
+/* Maximum value an `unsigned long long int' can hold.  (Minimum is 0.)  */
+#   define ULLONG_MAX  18446744073709551615ULL
+
+#  endif /* ISO C99 */
+
 # endif        /* limits.h  */
 #endif /* GCC 2.  */
 
 #endif /* !_LIBC_LIMITS_H_ */
+
+ /* Get the compiler's limits.h, which defines almost all the ISO constants.
+
+    We put this #include_next outside the double inclusion check because
+    it should be possible to include this file more than once and still get
+    the definitions from gcc's header.  */
+#if defined __GNUC__ && !defined _GCC_LIMITS_H_
+/* `_GCC_LIMITS_H_' is what GCC's file defines.  */
+# include_next <limits.h>
+#endif
+
+/* The <limits.h> files in some gcc versions don't define LLONG_MIN,
+   LLONG_MAX, and ULLONG_MAX.  Instead only the values gcc defined for
+   ages are available.  */
+#if defined __USE_ISOC99 && defined __GNUC__
+# ifndef LLONG_MIN
+#  define LLONG_MIN    (-LLONG_MAX-1)
+# endif
+# ifndef LLONG_MAX
+#  define LLONG_MAX    __LONG_LONG_MAX__
+# endif
+# ifndef ULLONG_MAX
+#  define ULLONG_MAX   (LLONG_MAX * 2ULL + 1)
+# endif
+#endif
+
+/* The integer width macros are not defined by GCC's <limits.h> before
+   GCC 7, or if _GNU_SOURCE rather than
+   __STDC_WANT_IEC_60559_BFP_EXT__ is used to enable this feature.  */
+#if __GLIBC_USE (IEC_60559_BFP_EXT_C2X)
+# ifndef CHAR_WIDTH
+#  define CHAR_WIDTH 8
+# endif
+# ifndef SCHAR_WIDTH
+#  define SCHAR_WIDTH 8
+# endif
+# ifndef UCHAR_WIDTH
+#  define UCHAR_WIDTH 8
+# endif
+# ifndef SHRT_WIDTH
+#  define SHRT_WIDTH 16
+# endif
+# ifndef USHRT_WIDTH
+#  define USHRT_WIDTH 16
+# endif
+# ifndef INT_WIDTH
+#  define INT_WIDTH 32
+# endif
+# ifndef UINT_WIDTH
+#  define UINT_WIDTH 32
+# endif
+# ifndef LONG_WIDTH
+#  define LONG_WIDTH __WORDSIZE
+# endif
+# ifndef ULONG_WIDTH
+#  define ULONG_WIDTH __WORDSIZE
+# endif
+# ifndef LLONG_WIDTH
+#  define LLONG_WIDTH 64
+# endif
+# ifndef ULLONG_WIDTH
+#  define ULLONG_WIDTH 64
+# endif
+#endif /* Use IEC_60559_BFP_EXT.  */
+
+/* The macros for _Bool are not defined by GCC's <limits.h> before GCC
+   11, or if _GNU_SOURCE is defined rather than enabling C2x support
+   with -std.  */
+#if __GLIBC_USE (ISOC2X)
+# ifndef BOOL_MAX
+#  define BOOL_MAX 1
+# endif
+# ifndef BOOL_WIDTH
+#  define BOOL_WIDTH 1
+# endif
+#endif
+
+#ifdef __USE_POSIX
+/* POSIX adds things to <limits.h>.  */
+# include <bits/posix1_lim.h>
+#endif
+
+#ifdef __USE_POSIX2
+# include <bits/posix2_lim.h>
+#endif
+
+#ifdef __USE_XOPEN
+# include <bits/xopen_lim.h>
+#endif