xref: /netbsd-src/external/lgpl3/mpfr/dist/src/mpfr-intmax.h (revision ba125506a622fe649968631a56eba5d42ff57863)
1 /* MPFR internal header related to intmax_t.
2 
3 Copyright 2004-2023 Free Software Foundation, Inc.
4 Contributed by the AriC and Caramba projects, INRIA.
5 
6 This file is part of the GNU MPFR Library.
7 
8 The GNU MPFR Library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or (at your
11 option) any later version.
12 
13 The GNU MPFR Library is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16 License for more details.
17 
18 You should have received a copy of the GNU Lesser General Public License
19 along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
20 https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22 
23 /* If you need something defined here, do not include this header file
24    directly, but define the MPFR_NEED_INTMAX_H macro before including
25    "mpfr-impl.h" (or "mpfr-test.h" in the tests). This will ensure that
26    this header file "mpfr-intmax.h" is included in a consistent way,
27    thus avoiding the various cases that could otherwise be obtained on
28    different platforms and compilation options. Note that in particular,
29    it needs <limits.h> (always included first in "mpfr-impl.h") if
30    <inttypes.h> or <stdint.h> does not exist or does not work. It also
31    needs "config.h" if used (HAVE_CONFIG_H defined), but "config.h" is
32    also included first in "mpfr-impl.h". */
33 
34 #ifndef MPFR_NEED_INTMAX_H
35 # error "Never include mpfr-intmax.h directly; define MPFR_NEED_INTMAX_H instead."
36 #endif
37 
38 #ifndef __MPFR_INTMAX_H__
39 #define __MPFR_INTMAX_H__
40 
41 /* The ISO C99 standard specifies that in C++ implementations the
42  * INTMAX_MAX, ... macros should only be defined if explicitly requested.
43  */
44 #if defined __cplusplus
45 # define __STDC_LIMIT_MACROS
46 # define __STDC_CONSTANT_MACROS
47 #endif
48 
49 /* The definition of MPFR_USE_INTMAX_T is needed on systems for which
50  * the current (non-standard) macro tests in mpfr.h is not sufficient.
51  * This will force the support of intmax_t/uintmax_t if <inttypes.h>
52  * and/or <stdint.h> are available. This also avoids a failure in the
53  * tests (replace the macro tests in mpfr.h by just
54  *   #if defined (MPFR_USE_INTMAX_T)
55  * to simulate such a system and reproduce the problem).
56  * Note: if this makes the build fail on some systems (because these
57  * headers are broken), we will need a configure test to undefine
58  * HAVE_INTTYPES_H and HAVE_STDINT_H in such a case.
59  */
60 
61 #if HAVE_INTTYPES_H
62 # include <inttypes.h>
63 # define MPFR_USE_INTMAX_T
64 #endif
65 
66 #if HAVE_STDINT_H
67 # include <stdint.h>
68 # define MPFR_USE_INTMAX_T
69 #endif
70 
71 /* Largest integer type available and fully working for the MPFR build
72    (may be smaller than intmax_t / uintmax_t if NPRINTF_J is defined). */
73 #if defined(MPFR_USE_INTMAX_T) && !defined(NPRINTF_J)
74 typedef uintmax_t mpfr_uintmax_t;
75 typedef intmax_t mpfr_intmax_t;
76 # define MPFR_UINTMAX_MAX UINTMAX_MAX
77 # define MPFR_INTMAX_MAX INTMAX_MAX
78 # define MPFR_INTMAX_MIN INTMAX_MIN
79 # define MPFR_INTMAX_FSPEC "j"
80 #elif defined(HAVE_LONG_LONG) && !defined(NPRINTF_LL)
81 typedef unsigned long long mpfr_uintmax_t;
82 typedef long long mpfr_intmax_t;
83 #if defined(ULLONG_MAX)
84 /* standard */
85 # define MPFR_UINTMAX_MAX ULLONG_MAX
86 # define MPFR_INTMAX_MAX LLONG_MAX
87 # define MPFR_INTMAX_MIN LLONG_MIN
88 #elif defined(ULONGLONG_MAX)
89 /* Silicon Graphics IRIX 6.5 with native /usr/bin/cc */
90 # define MPFR_UINTMAX_MAX ULONGLONG_MAX
91 # define MPFR_INTMAX_MAX LONGLONG_MAX
92 # define MPFR_INTMAX_MIN LONGLONG_MIN
93 #else
94 /* We do not know any platform in this case (but this case would be a bug).
95    Let's give an error. A workaround should be possible, but it should be
96    tested first. */
97 # error "Neither ULLONG_MAX nor ULONGLONG_MAX is defined."
98 #endif
99 # define MPFR_INTMAX_FSPEC "ll"
100 #else
101 typedef unsigned long mpfr_uintmax_t;
102 typedef long mpfr_intmax_t;
103 # define MPFR_UINTMAX_MAX ULONG_MAX
104 # define MPFR_INTMAX_MAX LONG_MAX
105 # define MPFR_INTMAX_MIN LONG_MIN
106 # define MPFR_INTMAX_FSPEC "l"
107 #endif
108 
109 #endif
110