17d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#ifndef Py_PYPORT_H
214a4d88a2eb576f66573bbae3db46065e26bccd2Vladimir Marangozov#define Py_PYPORT_H
37d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
44f1cd8bdcbd20bb0acdbe9e240f28c09dd38370fMartin v. Löwis#include "pyconfig.h" /* include for defines */
525f68944c20a3a37da6776277057c2d19a80211fPeter Schneider-Kamp
62f865b962cc26366ddd374233ee78ee759e62f68Mark Dickinson/* Some versions of HP-UX & Solaris need inttypes.h for int32_t,
72f865b962cc26366ddd374233ee78ee759e62f68Mark Dickinson   INT32_MAX, etc. */
82f865b962cc26366ddd374233ee78ee759e62f68Mark Dickinson#ifdef HAVE_INTTYPES_H
92f865b962cc26366ddd374233ee78ee759e62f68Mark Dickinson#include <inttypes.h>
102f865b962cc26366ddd374233ee78ee759e62f68Mark Dickinson#endif
112f865b962cc26366ddd374233ee78ee759e62f68Mark Dickinson
1240e9aed050e4fac881487fcfb125306fce0431d9Martin v. Löwis#ifdef HAVE_STDINT_H
1340e9aed050e4fac881487fcfb125306fce0431d9Martin v. Löwis#include <stdint.h>
1440e9aed050e4fac881487fcfb125306fce0431d9Martin v. Löwis#endif
1540e9aed050e4fac881487fcfb125306fce0431d9Martin v. Löwis
167d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters/**************************************************************************
177d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim PetersSymbols and macros to supply platform-independent interfaces to basic
181be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim PetersC language & library operations whose spellings vary across platforms.
197d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
207d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim PetersPlease try to make documentation here as clear as possible:  by definition,
217d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Petersthe stuff here is trying to illuminate C's darkest corners.
227d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
237d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim PetersConfig #defines referenced here:
247d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
257d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim PetersSIGNED_RIGHT_SHIFT_ZERO_FILLS
267d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim PetersMeaning:  To be defined iff i>>j does not extend the sign bit when i is a
277d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters          signed integral type and i < 0.
287d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim PetersUsed in:  Py_ARITHMETIC_RIGHT_SHIFT
291be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim Peters
308315ea579046727bb234dc4692ca28c8514eacbeTim PetersPy_DEBUG
318315ea579046727bb234dc4692ca28c8514eacbeTim PetersMeaning:  Extra checks compiled in for debug mode.
328315ea579046727bb234dc4692ca28c8514eacbeTim PetersUsed in:  Py_SAFE_DOWNCAST
33fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw
34fd847b23e64180d117af44e51eeb03b61e2f04d2Barry WarsawHAVE_UINTPTR_T
35fd847b23e64180d117af44e51eeb03b61e2f04d2Barry WarsawMeaning:  The C9X type uintptr_t is supported by the compiler
36fd847b23e64180d117af44e51eeb03b61e2f04d2Barry WarsawUsed in:  Py_uintptr_t
37fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw
38fd847b23e64180d117af44e51eeb03b61e2f04d2Barry WarsawHAVE_LONG_LONG
39fd847b23e64180d117af44e51eeb03b61e2f04d2Barry WarsawMeaning:  The compiler supports the C type "long long"
40b9a0f9121876cbc728cbef88f16bb32b92712d2dMartin v. LöwisUsed in:  PY_LONG_LONG
41fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw
427d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters**************************************************************************/
437d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
447d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
45e2bf7e63d6ae8855eef6858551356046169ddfcdVladimir Marangozov/* For backward compatibility only. Obsolete, do not use. */
46e2bf7e63d6ae8855eef6858551356046169ddfcdVladimir Marangozov#ifdef HAVE_PROTOTYPES
47e2bf7e63d6ae8855eef6858551356046169ddfcdVladimir Marangozov#define Py_PROTO(x) x
48e2bf7e63d6ae8855eef6858551356046169ddfcdVladimir Marangozov#else
49e2bf7e63d6ae8855eef6858551356046169ddfcdVladimir Marangozov#define Py_PROTO(x) ()
50e2bf7e63d6ae8855eef6858551356046169ddfcdVladimir Marangozov#endif
5177317ca7dc4d4267c2c23b3825ba95c3978c9cddMarc-André Lemburg#ifndef Py_FPROTO
5277317ca7dc4d4267c2c23b3825ba95c3978c9cddMarc-André Lemburg#define Py_FPROTO(x) Py_PROTO(x)
5377317ca7dc4d4267c2c23b3825ba95c3978c9cddMarc-André Lemburg#endif
547e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp
55fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw/* typedefs for some C9X-defined synonyms for integral types.
56fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw *
57fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * The names in Python are exactly the same as the C9X names, except with a
58fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * Py_ prefix.  Until C9X is universally implemented, this is the only way
59fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * to ensure that Python gets reliable names that don't conflict with names
60fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * in non-Python code that are playing their own tricks to define the C9X
61fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * names.
62fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw *
63fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * NOTE: don't go nuts here!  Python has no use for *most* of the C9X
64fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * integral synonyms.  Only define the ones we actually need.
65fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw */
66fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw
67fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw#ifdef HAVE_LONG_LONG
68b9a0f9121876cbc728cbef88f16bb32b92712d2dMartin v. Löwis#ifndef PY_LONG_LONG
69b9a0f9121876cbc728cbef88f16bb32b92712d2dMartin v. Löwis#define PY_LONG_LONG long long
709201e7f1a663abc76a4bcd57686c1e966240da64Martin v. Löwis#if defined(LLONG_MAX)
712a71a47c95701c71bc28314fe005e23fe32ddafbMartin v. Löwis/* If LLONG_MAX is defined in limits.h, use that. */
726371cd81775298dfd5dbbffbc172f3e5ddf6b5eaMartin v. Löwis#define PY_LLONG_MIN LLONG_MIN
736371cd81775298dfd5dbbffbc172f3e5ddf6b5eaMartin v. Löwis#define PY_LLONG_MAX LLONG_MAX
746371cd81775298dfd5dbbffbc172f3e5ddf6b5eaMartin v. Löwis#define PY_ULLONG_MAX ULLONG_MAX
752a71a47c95701c71bc28314fe005e23fe32ddafbMartin v. Löwis#elif defined(__LONG_LONG_MAX__)
762a71a47c95701c71bc28314fe005e23fe32ddafbMartin v. Löwis/* Otherwise, if GCC has a builtin define, use that. */
772a71a47c95701c71bc28314fe005e23fe32ddafbMartin v. Löwis#define PY_LLONG_MAX __LONG_LONG_MAX__
782a71a47c95701c71bc28314fe005e23fe32ddafbMartin v. Löwis#define PY_LLONG_MIN (-PY_LLONG_MAX-1)
792a71a47c95701c71bc28314fe005e23fe32ddafbMartin v. Löwis#define PY_ULLONG_MAX (__LONG_LONG_MAX__*2ULL + 1ULL)
802a71a47c95701c71bc28314fe005e23fe32ddafbMartin v. Löwis#else
812a71a47c95701c71bc28314fe005e23fe32ddafbMartin v. Löwis/* Otherwise, rely on two's complement. */
822a71a47c95701c71bc28314fe005e23fe32ddafbMartin v. Löwis#define PY_ULLONG_MAX (~0ULL)
832a71a47c95701c71bc28314fe005e23fe32ddafbMartin v. Löwis#define PY_LLONG_MAX  ((long long)(PY_ULLONG_MAX>>1))
849201e7f1a663abc76a4bcd57686c1e966240da64Martin v. Löwis#define PY_LLONG_MIN (-PY_LLONG_MAX-1)
859201e7f1a663abc76a4bcd57686c1e966240da64Martin v. Löwis#endif /* LLONG_MAX */
86fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw#endif
87fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw#endif /* HAVE_LONG_LONG */
88fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw
89efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson/* a build with 30-bit digits for Python long integers needs an exact-width
90efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson * 32-bit unsigned integer type to store those digits.  (We could just use
91efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson * type 'unsigned long', but that would be wasteful on a system where longs
92efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson * are 64-bits.)  On Unix systems, the autoconf macro AC_TYPE_UINT32_T defines
93efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson * uint32_t to be such a type unless stdint.h or inttypes.h defines uint32_t.
94efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson * However, it doesn't set HAVE_UINT32_T, so we do that here.
95efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson */
9617c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#ifdef uint32_t
97efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#define HAVE_UINT32_T 1
9817c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#endif
9917c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson
10017c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#ifdef HAVE_UINT32_T
10117c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#ifndef PY_UINT32_T
102efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#define PY_UINT32_T uint32_t
103efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#endif
104efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#endif
105efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson
106efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson/* Macros for a 64-bit unsigned integer type; used for type 'twodigits' in the
107efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson * long integer implementation, when 30-bit digits are enabled.
108efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson */
10917c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#ifdef uint64_t
110efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#define HAVE_UINT64_T 1
11117c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#endif
11217c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson
11317c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#ifdef HAVE_UINT64_T
11417c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#ifndef PY_UINT64_T
115efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#define PY_UINT64_T uint64_t
116efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#endif
117efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#endif
118efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson
119efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson/* Signed variants of the above */
12017c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#ifdef int32_t
121efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#define HAVE_INT32_T 1
12217c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#endif
12317c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson
12417c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#ifdef HAVE_INT32_T
12517c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#ifndef PY_INT32_T
126efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#define PY_INT32_T int32_t
127efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#endif
128efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#endif
12917c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson
13017c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#ifdef int64_t
131efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#define HAVE_INT64_T 1
13217c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#endif
13317c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson
13417c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#ifdef HAVE_INT64_T
13517c50cdac2c35e4f37bc5fd68f24a00d1e7c67a6Mark Dickinson#ifndef PY_INT64_T
136efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#define PY_INT64_T int64_t
137efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#endif
138efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#endif
139efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson
140efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson/* If PYLONG_BITS_IN_DIGIT is not defined then we'll use 30-bit digits if all
141efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson   the necessary integer types are available, and we're on a 64-bit platform
142efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson   (as determined by SIZEOF_VOID_P); otherwise we use 15-bit digits. */
143efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson
144efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#ifndef PYLONG_BITS_IN_DIGIT
145efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#if (defined HAVE_UINT64_T && defined HAVE_INT64_T && \
146efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson     defined HAVE_UINT32_T && defined HAVE_INT32_T && SIZEOF_VOID_P >= 8)
147efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#define PYLONG_BITS_IN_DIGIT 30
148efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#else
149efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#define PYLONG_BITS_IN_DIGIT 15
150efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#endif
151efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson#endif
152efc82f7e8eff19d8e844a3dc268a88de7fbcb173Mark Dickinson
153fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw/* uintptr_t is the C9X name for an unsigned integral type such that a
154fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * legitimate void* can be cast to uintptr_t and then back to void* again
15579248aa1e4a8f6510b1f0ef95dc9592d51e16d6cTim Peters * without loss of information.  Similarly for intptr_t, wrt a signed
15679248aa1e4a8f6510b1f0ef95dc9592d51e16d6cTim Peters * integral type.
157fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw */
158fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw#ifdef HAVE_UINTPTR_T
159c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroutypedef uintptr_t       Py_uintptr_t;
160c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroutypedef intptr_t        Py_intptr_t;
16179248aa1e4a8f6510b1f0ef95dc9592d51e16d6cTim Peters
162fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw#elif SIZEOF_VOID_P <= SIZEOF_INT
163c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroutypedef unsigned int    Py_uintptr_t;
164c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroutypedef int             Py_intptr_t;
16579248aa1e4a8f6510b1f0ef95dc9592d51e16d6cTim Peters
166fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw#elif SIZEOF_VOID_P <= SIZEOF_LONG
167c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroutypedef unsigned long   Py_uintptr_t;
168c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroutypedef long            Py_intptr_t;
16979248aa1e4a8f6510b1f0ef95dc9592d51e16d6cTim Peters
170fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw#elif defined(HAVE_LONG_LONG) && (SIZEOF_VOID_P <= SIZEOF_LONG_LONG)
171c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroutypedef unsigned PY_LONG_LONG   Py_uintptr_t;
172c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroutypedef PY_LONG_LONG            Py_intptr_t;
17379248aa1e4a8f6510b1f0ef95dc9592d51e16d6cTim Peters
174fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw#else
175fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw#   error "Python needs a typedef for Py_uintptr_t in pyport.h."
176fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw#endif /* HAVE_UINTPTR_T */
177fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw
178ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters/* Py_ssize_t is a signed integral type such that sizeof(Py_ssize_t) ==
179ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters * sizeof(size_t).  C99 doesn't define such a thing directly (size_t is an
180ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters * unsigned integral type).  See PEP 353 for details.
181ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters */
18218e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis#ifdef HAVE_SSIZE_T
183c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroutypedef ssize_t         Py_ssize_t;
18418e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis#elif SIZEOF_VOID_P == SIZEOF_SIZE_T
185c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroutypedef Py_intptr_t     Py_ssize_t;
18618e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis#else
18718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis#   error "Python needs a typedef for Py_ssize_t in pyport.h."
18818e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis#endif
189ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters
1909d53457e599623fbad90833c3448835b42d7e7f9Gregory P. Smith/* Largest possible value of size_t.
1919d53457e599623fbad90833c3448835b42d7e7f9Gregory P. Smith   SIZE_MAX is part of C99, so it might be defined on some
1929d53457e599623fbad90833c3448835b42d7e7f9Gregory P. Smith   platforms. If it is not defined, (size_t)-1 is a portable
193c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou   definition for C89, due to the way signed->unsigned
1949d53457e599623fbad90833c3448835b42d7e7f9Gregory P. Smith   conversion is defined. */
1959d53457e599623fbad90833c3448835b42d7e7f9Gregory P. Smith#ifdef SIZE_MAX
1969d53457e599623fbad90833c3448835b42d7e7f9Gregory P. Smith#define PY_SIZE_MAX SIZE_MAX
1979d53457e599623fbad90833c3448835b42d7e7f9Gregory P. Smith#else
1989d53457e599623fbad90833c3448835b42d7e7f9Gregory P. Smith#define PY_SIZE_MAX ((size_t)-1)
1999d53457e599623fbad90833c3448835b42d7e7f9Gregory P. Smith#endif
2009d53457e599623fbad90833c3448835b42d7e7f9Gregory P. Smith
201ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters/* Largest positive value of type Py_ssize_t. */
20218e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1))
2033b1c01d4b696e2e4c94b6abccd603c617f9b095aTim Peters/* Smallest negative value of type Py_ssize_t. */
204c48c8db110fd5e3b1f8574e8e52f85d11d4c4fd4Martin v. Löwis#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1)
20518e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis
206951cc0f474e4757e6954f0435952804211c5637cChristian Heimes#if SIZEOF_PID_T > SIZEOF_LONG
207951cc0f474e4757e6954f0435952804211c5637cChristian Heimes#   error "Python doesn't support sizeof(pid_t) > sizeof(long)"
208951cc0f474e4757e6954f0435952804211c5637cChristian Heimes#endif
209951cc0f474e4757e6954f0435952804211c5637cChristian Heimes
210ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters/* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf
211ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters * format to convert an argument with the width of a size_t or Py_ssize_t.
212ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters * C99 introduced "z" for this purpose, but not all platforms support that;
213ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters * e.g., MS compilers use "I" instead.
214ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters *
215ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters * These "high level" Python format functions interpret "z" correctly on
216ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters * all platforms (Python interprets the format string itself, and does whatever
217ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters * the platform C requires to convert a size_t/Py_ssize_t argument):
218ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters *
219dd96db63f689e2f0d8ae5a1436b3b3395eec7de5Gregory P. Smith *     PyString_FromFormat
220ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters *     PyErr_Format
221dd96db63f689e2f0d8ae5a1436b3b3395eec7de5Gregory P. Smith *     PyString_FromFormatV
222ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters *
223ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters * Lower-level uses require that you interpolate the correct format modifier
224ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters * yourself (e.g., calling printf, fprintf, sprintf, PyOS_snprintf); for
225ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters * example,
226ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters *
227ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters *     Py_ssize_t index;
228ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters *     fprintf(stderr, "index %" PY_FORMAT_SIZE_T "d sucks\n", index);
229ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters *
230ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters * That will expand to %ld, or %Id, or to something else correct for a
231ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters * Py_ssize_t on the platform.
232ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters */
233ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters#ifndef PY_FORMAT_SIZE_T
23402743ca0146c2cbedfeb0c05d7f3731fab281575Neal Norwitz#   if SIZEOF_SIZE_T == SIZEOF_INT && !defined(__APPLE__)
2354a8fbdb1b2172e1954e652be7dda74d188a00fa5Neal Norwitz#       define PY_FORMAT_SIZE_T ""
23602743ca0146c2cbedfeb0c05d7f3731fab281575Neal Norwitz#   elif SIZEOF_SIZE_T == SIZEOF_LONG
23702743ca0146c2cbedfeb0c05d7f3731fab281575Neal Norwitz#       define PY_FORMAT_SIZE_T "l"
238ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters#   elif defined(MS_WINDOWS)
239ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters#       define PY_FORMAT_SIZE_T "I"
240ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters#   else
241ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters#       error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T"
242ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters#   endif
243ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters#endif
244ae1d0c978dbf8327f1193ab2f36323393efd5eb6Tim Peters
24582864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson/* PY_FORMAT_LONG_LONG is analogous to PY_FORMAT_SIZE_T above, but for
24682864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson * the long long type instead of the size_t type.  It's only available
24782864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson * when HAVE_LONG_LONG is defined. The "high level" Python format
24882864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson * functions listed above will interpret "lld" or "llu" correctly on
24982864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson * all platforms.
25082864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson */
25182864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson#ifdef HAVE_LONG_LONG
25282864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson#   ifndef PY_FORMAT_LONG_LONG
25382864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson#       if defined(MS_WIN64) || defined(MS_WINDOWS)
25482864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson#           define PY_FORMAT_LONG_LONG "I64"
25582864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson#       else
25682864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson#           error "This platform's pyconfig.h needs to define PY_FORMAT_LONG_LONG"
25782864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson#       endif
25882864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson#   endif
25982864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson#endif
26082864d1ab101d971e77b73cac9e994fd09cd796bMark Dickinson
2617a83089c06744dcdd29eb692dbeb51449191ed3fFredrik Lundh/* Py_LOCAL can be used instead of static to get the fastest possible calling
2627a83089c06744dcdd29eb692dbeb51449191ed3fFredrik Lundh * convention for functions that are local to a given module.
26395e2a916158860f76539d36b9fe9e1688cb85aacFredrik Lundh *
2647a83089c06744dcdd29eb692dbeb51449191ed3fFredrik Lundh * Py_LOCAL_INLINE does the same thing, and also explicitly requests inlining,
2657a83089c06744dcdd29eb692dbeb51449191ed3fFredrik Lundh * for platforms that support that.
2667a83089c06744dcdd29eb692dbeb51449191ed3fFredrik Lundh *
2677a83089c06744dcdd29eb692dbeb51449191ed3fFredrik Lundh * If PY_LOCAL_AGGRESSIVE is defined before python.h is included, more
268e2eacc02bcc9f8977f5f3cea6243f236c508b772Martin Panter * "aggressive" inlining/optimization is enabled for the entire module.  This
2697a83089c06744dcdd29eb692dbeb51449191ed3fFredrik Lundh * may lead to code bloat, and may slow things down for those reasons.  It may
2707a83089c06744dcdd29eb692dbeb51449191ed3fFredrik Lundh * also lead to errors, if the code relies on pointer aliasing.  Use with
2717a83089c06744dcdd29eb692dbeb51449191ed3fFredrik Lundh * care.
27257640f5c575ce284b041595c238f8ac615f1618dFredrik Lundh *
27395e2a916158860f76539d36b9fe9e1688cb85aacFredrik Lundh * NOTE: You can only use this for functions that are entirely local to a
27495e2a916158860f76539d36b9fe9e1688cb85aacFredrik Lundh * module; functions that are exported via method tables, callbacks, etc,
27595e2a916158860f76539d36b9fe9e1688cb85aacFredrik Lundh * should keep using static.
27695e2a916158860f76539d36b9fe9e1688cb85aacFredrik Lundh */
277b8b3c8e276b7f0d2004bc5c7b7ca6d652c0b9327Fredrik Lundh
278b8b3c8e276b7f0d2004bc5c7b7ca6d652c0b9327Fredrik Lundh#undef USE_INLINE /* XXX - set via configure? */
279b8b3c8e276b7f0d2004bc5c7b7ca6d652c0b9327Fredrik Lundh
280b8b3c8e276b7f0d2004bc5c7b7ca6d652c0b9327Fredrik Lundh#if defined(_MSC_VER)
28157640f5c575ce284b041595c238f8ac615f1618dFredrik Lundh#if defined(PY_LOCAL_AGGRESSIVE)
28257640f5c575ce284b041595c238f8ac615f1618dFredrik Lundh/* enable more aggressive optimization for visual studio */
28357640f5c575ce284b041595c238f8ac615f1618dFredrik Lundh#pragma optimize("agtw", on)
28457640f5c575ce284b041595c238f8ac615f1618dFredrik Lundh#endif
285c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou/* ignore warnings if the compiler decides not to inline a function */
286b8b3c8e276b7f0d2004bc5c7b7ca6d652c0b9327Fredrik Lundh#pragma warning(disable: 4710)
287b8b3c8e276b7f0d2004bc5c7b7ca6d652c0b9327Fredrik Lundh/* fastest possible local call under MSVC */
2887a83089c06744dcdd29eb692dbeb51449191ed3fFredrik Lundh#define Py_LOCAL(type) static type __fastcall
2897a83089c06744dcdd29eb692dbeb51449191ed3fFredrik Lundh#define Py_LOCAL_INLINE(type) static __inline type __fastcall
290b8b3c8e276b7f0d2004bc5c7b7ca6d652c0b9327Fredrik Lundh#elif defined(USE_INLINE)
2917a83089c06744dcdd29eb692dbeb51449191ed3fFredrik Lundh#define Py_LOCAL(type) static type
2927a83089c06744dcdd29eb692dbeb51449191ed3fFredrik Lundh#define Py_LOCAL_INLINE(type) static inline type
293b8b3c8e276b7f0d2004bc5c7b7ca6d652c0b9327Fredrik Lundh#else
294b8b3c8e276b7f0d2004bc5c7b7ca6d652c0b9327Fredrik Lundh#define Py_LOCAL(type) static type
2957a83089c06744dcdd29eb692dbeb51449191ed3fFredrik Lundh#define Py_LOCAL_INLINE(type) static type
296b8b3c8e276b7f0d2004bc5c7b7ca6d652c0b9327Fredrik Lundh#endif
297b8b3c8e276b7f0d2004bc5c7b7ca6d652c0b9327Fredrik Lundh
29880f8e80c15a784a84f77f4895318d13b831b017eFredrik Lundh/* Py_MEMCPY can be used instead of memcpy in cases where the copied blocks
29980f8e80c15a784a84f77f4895318d13b831b017eFredrik Lundh * are often very short.  While most platforms have highly optimized code for
30080f8e80c15a784a84f77f4895318d13b831b017eFredrik Lundh * large transfers, the setup costs for memcpy are often quite high.  MEMCPY
30180f8e80c15a784a84f77f4895318d13b831b017eFredrik Lundh * solves this by doing short copies "in line".
30280f8e80c15a784a84f77f4895318d13b831b017eFredrik Lundh */
30380f8e80c15a784a84f77f4895318d13b831b017eFredrik Lundh
30480f8e80c15a784a84f77f4895318d13b831b017eFredrik Lundh#if defined(_MSC_VER)
305c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#define Py_MEMCPY(target, source, length) do {                          \
306c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        size_t i_, n_ = (length);                                       \
307c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        char *t_ = (void*) (target);                                    \
308c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        const char *s_ = (void*) (source);                              \
309c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (n_ >= 16)                                                   \
310c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            memcpy(t_, s_, n_);                                         \
311c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else                                                            \
312c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            for (i_ = 0; i_ < n_; i_++)                                 \
313c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                t_[i_] = s_[i_];                                        \
314c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    } while (0)
31580f8e80c15a784a84f77f4895318d13b831b017eFredrik Lundh#else
31680f8e80c15a784a84f77f4895318d13b831b017eFredrik Lundh#define Py_MEMCPY memcpy
31780f8e80c15a784a84f77f4895318d13b831b017eFredrik Lundh#endif
31880f8e80c15a784a84f77f4895318d13b831b017eFredrik Lundh
3197e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp#include <stdlib.h>
3207e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp
32131f0cfef0e2f409d90b67ec5836c217c29be4bb6Mark Dickinson#ifdef HAVE_IEEEFP_H
32231f0cfef0e2f409d90b67ec5836c217c29be4bb6Mark Dickinson#include <ieeefp.h>  /* needed for 'finite' declaration on some platforms */
32331f0cfef0e2f409d90b67ec5836c217c29be4bb6Mark Dickinson#endif
32431f0cfef0e2f409d90b67ec5836c217c29be4bb6Mark Dickinson
3252c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#include <math.h> /* Moved here from the math section, before extern "C" */
3262c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
3272c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov/********************************************
3282c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov * WRAPPER FOR <time.h> and/or <sys/time.h> *
3292c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov ********************************************/
3302c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
3312c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#ifdef TIME_WITH_SYS_TIME
3322c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#include <sys/time.h>
3332c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#include <time.h>
3342c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#else /* !TIME_WITH_SYS_TIME */
3352c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#ifdef HAVE_SYS_TIME_H
3362c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#include <sys/time.h>
3372c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#else /* !HAVE_SYS_TIME_H */
3382c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#include <time.h>
3392c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#endif /* !HAVE_SYS_TIME_H */
3402c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#endif /* !TIME_WITH_SYS_TIME */
3412c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
3422c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
3432c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov/******************************
3442c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov * WRAPPER FOR <sys/select.h> *
3452c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov ******************************/
3462c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
3472c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov/* NB caller must include <sys/types.h> */
3482c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
3492c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#ifdef HAVE_SYS_SELECT_H
3502c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
3512c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#include <sys/select.h>
3522c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
3532c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#endif /* !HAVE_SYS_SELECT_H */
3542c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
35560f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters/*******************************
35660f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters * stat() and fstat() fiddling *
35760f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters *******************************/
35860f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters
35960f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters/* We expect that stat and fstat exist on most systems.
36060f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters *  It's confirmed on Unix, Mac and Windows.
36160f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters *  If you don't have them, add
36260f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters *      #define DONT_HAVE_STAT
36360f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters * and/or
36460f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters *      #define DONT_HAVE_FSTAT
36576f373d081a38ed49d56540298123bd1e0bcd0cdTim Peters * to your pyconfig.h. Python code beyond this should check HAVE_STAT and
36660f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters * HAVE_FSTAT instead.
36760f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters * Also
3680e8bd7e1ccf7f47bc0bb920af899c77669016d3dMartin v. Löwis *      #define HAVE_SYS_STAT_H
3690e8bd7e1ccf7f47bc0bb920af899c77669016d3dMartin v. Löwis * if <sys/stat.h> exists on your platform, and
37060f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters *      #define HAVE_STAT_H
3710e8bd7e1ccf7f47bc0bb920af899c77669016d3dMartin v. Löwis * if <stat.h> does.
37260f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters */
37360f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters#ifndef DONT_HAVE_STAT
37460f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters#define HAVE_STAT
37560f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters#endif
37660f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters
37760f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters#ifndef DONT_HAVE_FSTAT
37860f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters#define HAVE_FSTAT
37960f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters#endif
38060f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters
381e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum#ifdef RISCOS
382e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum#include <sys/types.h>
383a94568a7535de60f1144e4eea0d027b87017a4b4Martin v. Löwis#include "unixstuff.h"
384e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum#endif
385e2ae77b8b8a62e648bb1864a9b36ef3280984404Guido van Rossum
3860e8bd7e1ccf7f47bc0bb920af899c77669016d3dMartin v. Löwis#ifdef HAVE_SYS_STAT_H
3875e090fc98525308d2a86eaf5c535c3c2ba1a644cAndrew MacIntyre#if defined(PYOS_OS2) && defined(PYCC_GCC)
3885e090fc98525308d2a86eaf5c535c3c2ba1a644cAndrew MacIntyre#include <sys/types.h>
3895e090fc98525308d2a86eaf5c535c3c2ba1a644cAndrew MacIntyre#endif
39060f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters#include <sys/stat.h>
39160f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters#elif defined(HAVE_STAT_H)
39260f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters#include <stat.h>
39360f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters#endif
39460f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters
395f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#if defined(PYCC_VACPP)
396f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
397f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG)
398f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#endif
399f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis
400f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#ifndef S_ISREG
401f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG)
402f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#endif
403f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis
404f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#ifndef S_ISDIR
405f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR)
406f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#endif
407f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis
4082c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
4097d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#ifdef __cplusplus
4107e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp/* Move this down here since some C++ #include's don't like to be included
4117e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp   inside an extern "C" */
4127d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Petersextern "C" {
4137d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#endif
4147d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
4152c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
4167d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters/* Py_ARITHMETIC_RIGHT_SHIFT
4177d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters * C doesn't define whether a right-shift of a signed integer sign-extends
4187d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters * or zero-fills.  Here a macro to force sign extension:
4197d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters * Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J)
420f35f8044e4c2679d4d701fb464be7541a9f33e6dMark Dickinson *    Return I >> J, forcing sign extension.  Arithmetically, return the
421f35f8044e4c2679d4d701fb464be7541a9f33e6dMark Dickinson *    floor of I/2**J.
4227d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters * Requirements:
423f35f8044e4c2679d4d701fb464be7541a9f33e6dMark Dickinson *    I should have signed integer type.  In the terminology of C99, this can
424f35f8044e4c2679d4d701fb464be7541a9f33e6dMark Dickinson *    be either one of the five standard signed integer types (signed char,
425f35f8044e4c2679d4d701fb464be7541a9f33e6dMark Dickinson *    short, int, long, long long) or an extended signed integer type.
426f35f8044e4c2679d4d701fb464be7541a9f33e6dMark Dickinson *    J is an integer >= 0 and strictly less than the number of bits in the
427f35f8044e4c2679d4d701fb464be7541a9f33e6dMark Dickinson *    type of I (because C doesn't define what happens for J outside that
428f35f8044e4c2679d4d701fb464be7541a9f33e6dMark Dickinson *    range either).
429f35f8044e4c2679d4d701fb464be7541a9f33e6dMark Dickinson *    TYPE used to specify the type of I, but is now ignored.  It's been left
430f35f8044e4c2679d4d701fb464be7541a9f33e6dMark Dickinson *    in for backwards compatibility with versions <= 2.6 or 3.0.
4317d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters * Caution:
4327d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters *    I may be evaluated more than once.
4337d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters */
4347d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS
4357d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \
436c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    ((I) < 0 ? -1-((-1-(I)) >> (J)) : (I) >> (J))
4377d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#else
4387d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J))
4397d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#endif
4407d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
44139dce29365d287dc6b353b2a527dc11fe58dcfa6Tim Peters/* Py_FORCE_EXPANSION(X)
4421be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim Peters * "Simply" returns its argument.  However, macro expansions within the
4431be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim Peters * argument are evaluated.  This unfortunate trickery is needed to get
4441be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim Peters * token-pasting to work as desired in some cases.
4451be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim Peters */
4461be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim Peters#define Py_FORCE_EXPANSION(X) X
4471be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim Peters
4488315ea579046727bb234dc4692ca28c8514eacbeTim Peters/* Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW)
4498315ea579046727bb234dc4692ca28c8514eacbeTim Peters * Cast VALUE to type NARROW from type WIDE.  In Py_DEBUG mode, this
4508315ea579046727bb234dc4692ca28c8514eacbeTim Peters * assert-fails if any information is lost.
4518315ea579046727bb234dc4692ca28c8514eacbeTim Peters * Caution:
4528315ea579046727bb234dc4692ca28c8514eacbeTim Peters *    VALUE may be evaluated more than once.
4538315ea579046727bb234dc4692ca28c8514eacbeTim Peters */
4548315ea579046727bb234dc4692ca28c8514eacbeTim Peters#ifdef Py_DEBUG
4558315ea579046727bb234dc4692ca28c8514eacbeTim Peters#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \
456c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    (assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE))
4578315ea579046727bb234dc4692ca28c8514eacbeTim Peters#else
4588315ea579046727bb234dc4692ca28c8514eacbeTim Peters#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE)
4598315ea579046727bb234dc4692ca28c8514eacbeTim Peters#endif
4608315ea579046727bb234dc4692ca28c8514eacbeTim Peters
46177d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang/* Py_SET_ERRNO_ON_MATH_ERROR(x)
462a40c793d06ee2b42a5013015352616b4ca6b288bTim Peters * If a libm function did not set errno, but it looks like the result
46377d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang * overflowed or not-a-number, set errno to ERANGE or EDOM.  Set errno
46477d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang * to 0 before calling a libm function, and invoke this macro after,
46577d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang * passing the function result.
466a40c793d06ee2b42a5013015352616b4ca6b288bTim Peters * Caution:
467a40c793d06ee2b42a5013015352616b4ca6b288bTim Peters *    This isn't reliable.  See Py_OVERFLOWED comments.
468a40c793d06ee2b42a5013015352616b4ca6b288bTim Peters *    X is evaluated more than once.
469a40c793d06ee2b42a5013015352616b4ca6b288bTim Peters */
470539c662f10b41d15f658cabfa03cc02902862adcGuido van Rossum#if defined(__FreeBSD__) || defined(__OpenBSD__) || (defined(__hpux) && defined(__ia64))
47177d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang#define _Py_SET_EDOM_FOR_NAN(X) if (isnan(X)) errno = EDOM;
47277d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang#else
47377d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang#define _Py_SET_EDOM_FOR_NAN(X) ;
47477d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang#endif
47577d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang#define Py_SET_ERRNO_ON_MATH_ERROR(X) \
476c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    do { \
477c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (errno == 0) { \
478c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \
479c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                errno = ERANGE; \
480c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            else _Py_SET_EDOM_FOR_NAN(X) \
481c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        } \
482c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    } while(0)
48357f282a2a06c01417abec74926e770fb12f95610Tim Peters
48477d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang/* Py_SET_ERANGE_ON_OVERFLOW(x)
48577d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang * An alias of Py_SET_ERRNO_ON_MATH_ERROR for backward-compatibility.
48677d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang */
48777d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang#define Py_SET_ERANGE_IF_OVERFLOW(X) Py_SET_ERRNO_ON_MATH_ERROR(X)
48877d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang
489dc5a508761d7260bc863a2f3068723c298336382Tim Peters/* Py_ADJUST_ERANGE1(x)
490dc5a508761d7260bc863a2f3068723c298336382Tim Peters * Py_ADJUST_ERANGE2(x, y)
491dc5a508761d7260bc863a2f3068723c298336382Tim Peters * Set errno to 0 before calling a libm function, and invoke one of these
492dc5a508761d7260bc863a2f3068723c298336382Tim Peters * macros after, passing the function result(s) (Py_ADJUST_ERANGE2 is useful
493dc5a508761d7260bc863a2f3068723c298336382Tim Peters * for functions returning complex results).  This makes two kinds of
494dc5a508761d7260bc863a2f3068723c298336382Tim Peters * adjustments to errno:  (A) If it looks like the platform libm set
495dc5a508761d7260bc863a2f3068723c298336382Tim Peters * errno=ERANGE due to underflow, clear errno. (B) If it looks like the
496dc5a508761d7260bc863a2f3068723c298336382Tim Peters * platform libm overflowed but didn't set errno, force errno to ERANGE.  In
497dc5a508761d7260bc863a2f3068723c298336382Tim Peters * effect, we're trying to force a useful implementation of C89 errno
498dc5a508761d7260bc863a2f3068723c298336382Tim Peters * behavior.
499dc5a508761d7260bc863a2f3068723c298336382Tim Peters * Caution:
500dc5a508761d7260bc863a2f3068723c298336382Tim Peters *    This isn't reliable.  See Py_OVERFLOWED comments.
501dc5a508761d7260bc863a2f3068723c298336382Tim Peters *    X and Y may be evaluated more than once.
502dc5a508761d7260bc863a2f3068723c298336382Tim Peters */
503c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#define Py_ADJUST_ERANGE1(X)                                            \
504c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    do {                                                                \
505c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (errno == 0) {                                               \
506c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL)              \
507c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                errno = ERANGE;                                         \
508c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }                                                               \
509c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else if (errno == ERANGE && (X) == 0.0)                         \
510c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            errno = 0;                                                  \
511c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    } while(0)
512c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou
513c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#define Py_ADJUST_ERANGE2(X, Y)                                         \
514c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    do {                                                                \
515c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL ||                \
516c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            (Y) == Py_HUGE_VAL || (Y) == -Py_HUGE_VAL) {                \
517c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                        if (errno == 0)                                 \
518c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou                                errno = ERANGE;                         \
519c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        }                                                               \
520c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        else if (errno == ERANGE)                                       \
521c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            errno = 0;                                                  \
522c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    } while(0)
523dc5a508761d7260bc863a2f3068723c298336382Tim Peters
5241d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson/*  The functions _Py_dg_strtod and _Py_dg_dtoa in Python/dtoa.c (which are
5251d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *  required to support the short float repr introduced in Python 3.1) require
5261d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *  that the floating-point unit that's being used for arithmetic operations
5271d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *  on C doubles is set to use 53-bit precision.  It also requires that the
5281d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *  FPU rounding mode is round-half-to-even, but that's less often an issue.
5291d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *
5301d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *  If your FPU isn't already set to 53-bit precision/round-half-to-even, and
5311d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *  you want to make use of _Py_dg_strtod and _Py_dg_dtoa, then you should
5321d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *
5331d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *     #define HAVE_PY_SET_53BIT_PRECISION 1
5341d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *
5351d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *  and also give appropriate definitions for the following three macros:
5361d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *
5371d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *    _PY_SET_53BIT_PRECISION_START : store original FPU settings, and
5381d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *        set FPU to 53-bit precision/round-half-to-even
5391d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *    _PY_SET_53BIT_PRECISION_END : restore original FPU settings
5401d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *    _PY_SET_53BIT_PRECISION_HEADER : any variable declarations needed to
5411d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *        use the two macros above.
5421d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson *
5431d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson * The macros are designed to be used within a single C function: see
5441d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson * Python/pystrtod.c for an example of their use.
5451d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson */
5461d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson
5471d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson/* get and set x87 control word for gcc/x86 */
5481d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson#ifdef HAVE_GCC_ASM_FOR_X87
5491d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson#define HAVE_PY_SET_53BIT_PRECISION 1
5501d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson/* _Py_get/set_387controlword functions are defined in Python/pymath.c */
551c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#define _Py_SET_53BIT_PRECISION_HEADER                          \
552c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    unsigned short old_387controlword, new_387controlword
553c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#define _Py_SET_53BIT_PRECISION_START                                   \
554c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    do {                                                                \
555c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        old_387controlword = _Py_get_387controlword();                  \
556c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        new_387controlword = (old_387controlword & ~0x0f00) | 0x0200; \
557c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        if (new_387controlword != old_387controlword)                   \
558c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou            _Py_set_387controlword(new_387controlword);                 \
559c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    } while (0)
560c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#define _Py_SET_53BIT_PRECISION_END                             \
561c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    if (new_387controlword != old_387controlword)               \
562c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou        _Py_set_387controlword(old_387controlword)
5631d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson#endif
5641d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson
5659c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson/* get and set x87 control word for VisualStudio/x86 */
5669c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson#if defined(_MSC_VER) && !defined(_WIN64) /* x87 not supported in 64-bit */
5679c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson#define HAVE_PY_SET_53BIT_PRECISION 1
5689c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson#define _Py_SET_53BIT_PRECISION_HEADER \
5699c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson    unsigned int old_387controlword, new_387controlword, out_387controlword
5709c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson/* We use the __control87_2 function to set only the x87 control word.
5719c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson   The SSE control word is unaffected. */
5729c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson#define _Py_SET_53BIT_PRECISION_START                                   \
5739c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson    do {                                                                \
5749c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson        __control87_2(0, 0, &old_387controlword, NULL);                 \
5759c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson        new_387controlword =                                            \
5769c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson          (old_387controlword & ~(_MCW_PC | _MCW_RC)) | (_PC_53 | _RC_NEAR); \
5779c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson        if (new_387controlword != old_387controlword)                   \
5789c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson            __control87_2(new_387controlword, _MCW_PC | _MCW_RC,        \
5799c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson                          &out_387controlword, NULL);                   \
5809c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson    } while (0)
5819c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson#define _Py_SET_53BIT_PRECISION_END                                     \
5829c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson    do {                                                                \
5839c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson        if (new_387controlword != old_387controlword)                   \
5849c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson            __control87_2(old_387controlword, _MCW_PC | _MCW_RC,        \
5859c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson                          &out_387controlword, NULL);                   \
5869c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson    } while (0)
5879c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson#endif
5889c0baf72020d8ab452101dd7c447ec61e16a96d6Mark Dickinson
5891d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson/* default definitions are empty */
5901d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson#ifndef HAVE_PY_SET_53BIT_PRECISION
5911d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson#define _Py_SET_53BIT_PRECISION_HEADER
5921d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson#define _Py_SET_53BIT_PRECISION_START
5931d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson#define _Py_SET_53BIT_PRECISION_END
5941d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson#endif
5951d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson
5961d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson/* If we can't guarantee 53-bit precision, don't use the code
5971d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson   in Python/dtoa.c, but fall back to standard code.  This
5981d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson   means that repr of a float will be long (17 sig digits).
5991d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson
6001d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson   Realistically, there are two things that could go wrong:
6011d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson
6021d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson   (1) doubles aren't IEEE 754 doubles, or
6031d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson   (2) we're on x86 with the rounding precision set to 64-bits
6041d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson       (extended precision), and we don't know how to change
6051d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson       the rounding precision.
6061d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson */
6071d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson
6081d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson#if !defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) && \
6091d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson    !defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) && \
6101d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson    !defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754)
6111d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson#define PY_NO_SHORT_FLOAT_REPR
6121d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson#endif
6131d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson
6141d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson/* double rounding is symptomatic of use of extended precision on x86.  If
6151d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson   we're seeing double rounding, and we don't have any mechanism available for
6161d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson   changing the FPU rounding precision, then don't use Python/dtoa.c. */
6171d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson#if defined(X87_DOUBLE_ROUNDING) && !defined(HAVE_PY_SET_53BIT_PRECISION)
6181d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson#define PY_NO_SHORT_FLOAT_REPR
6191d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson#endif
6201d6e2e1833864238b903325b37d05fef9b794393Mark Dickinson
621802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz/* Py_DEPRECATED(version)
62293344ab0365c4b55ef895c9fd3873dd06690ca00Neal Norwitz * Declare a variable, type, or function deprecated.
623802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz * Usage:
624802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz *    extern int old_var Py_DEPRECATED(2.3);
625802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz *    typedef int T1 Py_DEPRECATED(2.4);
626802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz *    extern int x() Py_DEPRECATED(2.5);
627802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz */
6283dd8be414eb00700965428902e12c073ab97728fNeal Norwitz#if defined(__GNUC__) && ((__GNUC__ >= 4) || \
629c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou              (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))
630802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz#define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__))
631802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz#else
6324643bd9a9cf43332992d10982c52debf3f0d980cTim Peters#define Py_DEPRECATED(VERSION_UNUSED)
633802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz#endif
634802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz
6351e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters/**************************************************************************
6361e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas WoutersPrototypes that are missing from the standard include files on some systems
6371e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters(and possibly only some versions of such systems.)
6381e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
6391e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas WoutersPlease be conservative with adding new ones, document them and enclose them
6401e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Woutersin platform-specific #ifdefs.
6411e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters**************************************************************************/
6421e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
6431e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#ifdef SOLARIS
6441e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters/* Unchecked */
6451e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Woutersextern int gethostname(char *, int);
6461e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#endif
6471e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
6481e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#ifdef __BEOS__
6491e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters/* Unchecked */
6501e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters/* It's in the libs, but not the headers... - [cjh] */
65160f42b50d894d3c9798c50e063ae758a1a5987a2Tim Petersint shutdown( int, int );
6521e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#endif
6531e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
6541e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#ifdef HAVE__GETPTY
655c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#include <sys/types.h>          /* we need to import mode_t */
6561e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Woutersextern char * _getpty(int *, int, mode_t, int);
6571e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#endif
6581e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
6598c255e4173cfc86ff7015b8f75dccf0d41b24003Martin v. Löwis/* On QNX 6, struct termio must be declared by including sys/termio.h
6608c255e4173cfc86ff7015b8f75dccf0d41b24003Martin v. Löwis   if TCGETA, TCSETA, TCSETAW, or TCSETAF are used.  sys/termio.h must
6618c255e4173cfc86ff7015b8f75dccf0d41b24003Martin v. Löwis   be included before termios.h or it will generate an error. */
662e78f12f7c29d0ac48b5fee86b9afb38012a809e5Stefan Krah#if defined(HAVE_SYS_TERMIO_H) && !defined(__hpux)
6638c255e4173cfc86ff7015b8f75dccf0d41b24003Martin v. Löwis#include <sys/termio.h>
6648c255e4173cfc86ff7015b8f75dccf0d41b24003Martin v. Löwis#endif
6658c255e4173cfc86ff7015b8f75dccf0d41b24003Martin v. Löwis
6661e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY)
667a55af9a9db334fb587f2c6b37ac28ac2463ebf04Ronald Oussoren#if !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) && !defined(HAVE_UTIL_H)
6681e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters/* BSDI does not supply a prototype for the 'openpty' and 'forkpty'
6691e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters   functions, even though they are included in libutil. */
6701e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#include <termios.h>
6711e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Woutersextern int openpty(int *, int *, char *, struct termios *, struct winsize *);
672951cc0f474e4757e6954f0435952804211c5637cChristian Heimesextern pid_t forkpty(int *, char *, struct termios *, struct winsize *);
6731e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#endif /* !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) */
6741e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */
6751e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
6761e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
6771e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters/* These are pulled from various places. It isn't obvious on what platforms
6781e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters   they are necessary, nor what the exact prototype should look like (which
6791e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters   is likely to vary between platforms!) If you find you need one of these
6801e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters   declarations, please move them to a platform-specific block and include
6811e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters   proper prototypes. */
6821e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#if 0
6831e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
6841e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters/* From Modules/resource.c */
6851e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Woutersextern int getrusage();
6861e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Woutersextern int getpagesize();
6871e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
6881e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters/* From Python/sysmodule.c and Modules/posixmodule.c */
6891e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Woutersextern int fclose(FILE *);
6901e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
6911e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters/* From Modules/posixmodule.c */
6921e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Woutersextern int fdatasync(int);
6931e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#endif /* 0 */
6941e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
6957e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp
696f303261cf036b4e4d78281a9639e2441e0b644f1Hye-Shik Chang/* On 4.4BSD-descendants, ctype functions serves the whole range of
697f303261cf036b4e4d78281a9639e2441e0b644f1Hye-Shik Chang * wchar_t character set rather than single byte code points only.
698f303261cf036b4e4d78281a9639e2441e0b644f1Hye-Shik Chang * This characteristic can break some operations of string object
699f303261cf036b4e4d78281a9639e2441e0b644f1Hye-Shik Chang * including str.upper() and str.split() on UTF-8 locales.  This
700f303261cf036b4e4d78281a9639e2441e0b644f1Hye-Shik Chang * workaround was provided by Tim Robbins of FreeBSD project.
701f303261cf036b4e4d78281a9639e2441e0b644f1Hye-Shik Chang */
702b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang
703b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#ifdef __FreeBSD__
704b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#include <osreldate.h>
705b97001ef46e599642affde61e31abace71486703Ned Deily#if (__FreeBSD_version >= 500040 && __FreeBSD_version < 602113) || \
706b97001ef46e599642affde61e31abace71486703Ned Deily    (__FreeBSD_version >= 700000 && __FreeBSD_version < 700054) || \
707b97001ef46e599642affde61e31abace71486703Ned Deily    (__FreeBSD_version >= 800000 && __FreeBSD_version < 800001)
70837805e5c1f082c753f9088e48dc945afdba29779Ronald Oussoren# define _PY_PORT_CTYPE_UTF8_ISSUE
70937805e5c1f082c753f9088e48dc945afdba29779Ronald Oussoren#endif
71037805e5c1f082c753f9088e48dc945afdba29779Ronald Oussoren#endif
71137805e5c1f082c753f9088e48dc945afdba29779Ronald Oussoren
71237805e5c1f082c753f9088e48dc945afdba29779Ronald Oussoren
71337805e5c1f082c753f9088e48dc945afdba29779Ronald Oussoren#if defined(__APPLE__)
71437805e5c1f082c753f9088e48dc945afdba29779Ronald Oussoren# define _PY_PORT_CTYPE_UTF8_ISSUE
71537805e5c1f082c753f9088e48dc945afdba29779Ronald Oussoren#endif
71637805e5c1f082c753f9088e48dc945afdba29779Ronald Oussoren
71737805e5c1f082c753f9088e48dc945afdba29779Ronald Oussoren#ifdef _PY_PORT_CTYPE_UTF8_ISSUE
71898ba455b9afe3fa78751ecae2e9d29f1ba82e7f7Ned Deily#ifndef __cplusplus
71998ba455b9afe3fa78751ecae2e9d29f1ba82e7f7Ned Deily   /* The workaround below is unsafe in C++ because
72098ba455b9afe3fa78751ecae2e9d29f1ba82e7f7Ned Deily    * the <locale> defines these symbols as real functions,
72198ba455b9afe3fa78751ecae2e9d29f1ba82e7f7Ned Deily    * with a slightly different signature.
72298ba455b9afe3fa78751ecae2e9d29f1ba82e7f7Ned Deily    * See issue #10910
72398ba455b9afe3fa78751ecae2e9d29f1ba82e7f7Ned Deily    */
724b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#include <ctype.h>
725b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#include <wctype.h>
726b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#undef isalnum
727b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#define isalnum(c) iswalnum(btowc(c))
728b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#undef isalpha
729b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#define isalpha(c) iswalpha(btowc(c))
730b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#undef islower
731b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#define islower(c) iswlower(btowc(c))
732b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#undef isspace
733b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#define isspace(c) iswspace(btowc(c))
734b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#undef isupper
735b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#define isupper(c) iswupper(btowc(c))
736b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#undef tolower
737b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#define tolower(c) towlower(btowc(c))
738b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#undef toupper
739b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#define toupper(c) towupper(btowc(c))
740b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#endif
74198ba455b9afe3fa78751ecae2e9d29f1ba82e7f7Ned Deily#endif
742b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang
743b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang
7448235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond/* Declarations for symbol visibility.
7458235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond
7468235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond  PyAPI_FUNC(type): Declares a public Python API function and return type
7474643bd9a9cf43332992d10982c52debf3f0d980cTim Peters  PyAPI_DATA(type): Declares public Python data and its type
7488235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond  PyMODINIT_FUNC:   A Python module init function.  If these functions are
7494643bd9a9cf43332992d10982c52debf3f0d980cTim Peters                    inside the Python core, they are private to the core.
7504643bd9a9cf43332992d10982c52debf3f0d980cTim Peters                    If in an extension module, it may be declared with
7518235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond                    external linkage depending on the platform.
7528235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond
7538235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond  As a number of platforms support/require "__declspec(dllimport/dllexport)",
7548235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond  we support a HAVE_DECLSPEC_DLL macro to save duplication.
7558235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond*/
7568235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond
7574643bd9a9cf43332992d10982c52debf3f0d980cTim Peters/*
758f163d10fbe5d90aace7325400c3d597ed6c9e62aMichael W. Hudson  All windows ports, except cygwin, are handled in PC/pyconfig.h.
759f163d10fbe5d90aace7325400c3d597ed6c9e62aMichael W. Hudson
760f163d10fbe5d90aace7325400c3d597ed6c9e62aMichael W. Hudson  BeOS and cygwin are the only other autoconf platform requiring special
761f163d10fbe5d90aace7325400c3d597ed6c9e62aMichael W. Hudson  linkage handling and both of these use __declspec().
7628235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond*/
7638235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#if defined(__CYGWIN__) || defined(__BEOS__)
764c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#       define HAVE_DECLSPEC_DLL
7658235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#endif
7668235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond
7673076559ea5d36d9795edc32e2fae7949b875d7efJason Tishler/* only get special linkage if built as shared or platform is Cygwin */
7683076559ea5d36d9795edc32e2fae7949b875d7efJason Tishler#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__)
769c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#       if defined(HAVE_DECLSPEC_DLL)
770c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#               ifdef Py_BUILD_CORE
771c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                       define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE
772c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                       define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE
77393db23ef2f128abae78101c556675d1f84c8f6e6Daniel Stutzbach        /* module init functions inside the core need no external linkage */
77493db23ef2f128abae78101c556675d1f84c8f6e6Daniel Stutzbach        /* except for Cygwin to handle embedding (FIXME: BeOS too?) */
775c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                       if defined(__CYGWIN__)
776c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                               define PyMODINIT_FUNC __declspec(dllexport) void
777c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                       else /* __CYGWIN__ */
778c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                               define PyMODINIT_FUNC void
779c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                       endif /* __CYGWIN__ */
780c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#               else /* Py_BUILD_CORE */
78193db23ef2f128abae78101c556675d1f84c8f6e6Daniel Stutzbach        /* Building an extension module, or an embedded situation */
78293db23ef2f128abae78101c556675d1f84c8f6e6Daniel Stutzbach        /* public Python functions and data are imported */
78393db23ef2f128abae78101c556675d1f84c8f6e6Daniel Stutzbach        /* Under Cygwin, auto-import functions to prevent compilation */
78493db23ef2f128abae78101c556675d1f84c8f6e6Daniel Stutzbach        /* failures similar to those described at the bottom of 4.1: */
78593db23ef2f128abae78101c556675d1f84c8f6e6Daniel Stutzbach        /* http://docs.python.org/extending/windows.html#a-cookbook-approach */
786c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                       if !defined(__CYGWIN__)
787c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                               define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE
788c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                       endif /* !__CYGWIN__ */
789c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                       define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE
79093db23ef2f128abae78101c556675d1f84c8f6e6Daniel Stutzbach        /* module init functions outside the core must be exported */
791c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                       if defined(__cplusplus)
792c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                               define PyMODINIT_FUNC extern "C" __declspec(dllexport) void
793c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                       else /* __cplusplus */
794c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                               define PyMODINIT_FUNC __declspec(dllexport) void
795c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#                       endif /* __cplusplus */
796c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#               endif /* Py_BUILD_CORE */
797c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#       endif /* HAVE_DECLSPEC */
7988235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#endif /* Py_ENABLE_SHARED */
7998235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond
8008235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond/* If no external linkage macros defined by now, create defaults */
8018235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#ifndef PyAPI_FUNC
802c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#       define PyAPI_FUNC(RTYPE) RTYPE
8038235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#endif
8048235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#ifndef PyAPI_DATA
805c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#       define PyAPI_DATA(RTYPE) extern RTYPE
8068235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#endif
8078235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#ifndef PyMODINIT_FUNC
808c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#       if defined(__cplusplus)
809c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#               define PyMODINIT_FUNC extern "C" void
810c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#       else /* __cplusplus */
811c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#               define PyMODINIT_FUNC void
812c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#       endif /* __cplusplus */
8138235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#endif
8148235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond
8158235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond/* Deprecated DL_IMPORT and DL_EXPORT macros */
8168235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#if defined(Py_ENABLE_SHARED) && defined (HAVE_DECLSPEC_DLL)
817c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#       if defined(Py_BUILD_CORE)
818c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#               define DL_IMPORT(RTYPE) __declspec(dllexport) RTYPE
819c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#               define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE
820c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#       else
821c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#               define DL_IMPORT(RTYPE) __declspec(dllimport) RTYPE
822c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#               define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE
823c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#       endif
8248235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#endif
8258235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#ifndef DL_EXPORT
826c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#       define DL_EXPORT(RTYPE) RTYPE
8278235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#endif
8288235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#ifndef DL_IMPORT
829c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#       define DL_IMPORT(RTYPE) RTYPE
8308235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#endif
8318235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond/* End of deprecated DL_* macros */
8327e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp
8337e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp/* If the fd manipulation macros aren't defined,
8347e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp   here is a set that should do the job */
8357e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp
836367e46a9432c2dd0c11e74526fd26b10ef57dad7Guido van Rossum#if 0 /* disabled and probably obsolete */
8371c2b178cebfe45bb832a33a8a87c9899365d0b4fPeter Schneider-Kamp
838c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#ifndef FD_SETSIZE
839c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#define FD_SETSIZE      256
8407e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp#endif
8417e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp
8427e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp#ifndef FD_SET
8437e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp
8447e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamptypedef long fd_mask;
8457e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp
846c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#define NFDBITS (sizeof(fd_mask) * NBBY)        /* bits per mask */
8477e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp#ifndef howmany
848c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#define howmany(x, y)   (((x)+((y)-1))/(y))
8497e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp#endif /* howmany */
8507e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp
851c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitroutypedef struct fd_set {
852c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou    fd_mask     fds_bits[howmany(FD_SETSIZE, NFDBITS)];
8537e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp} fd_set;
8547e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp
855c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#define FD_SET(n, p)    ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
856c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#define FD_CLR(n, p)    ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
857c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#define FD_ISSET(n, p)  ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
858c83ea137d7e717f764e2f31fc2544f522de7d857Antoine Pitrou#define FD_ZERO(p)      memset((char *)(p), '\0', sizeof(*(p)))
8597e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp
8607e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp#endif /* FD_SET */
8611c2b178cebfe45bb832a33a8a87c9899365d0b4fPeter Schneider-Kamp
8621c2b178cebfe45bb832a33a8a87c9899365d0b4fPeter Schneider-Kamp#endif /* fd manipulation macros */
8631c2b178cebfe45bb832a33a8a87c9899365d0b4fPeter Schneider-Kamp
8642c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
865d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake/* limits.h constants that may be missing */
866d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake
867d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#ifndef INT_MAX
868d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#define INT_MAX 2147483647
869d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#endif
870d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake
871d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#ifndef LONG_MAX
872d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#if SIZEOF_LONG == 4
873d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#define LONG_MAX 0X7FFFFFFFL
874d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#elif SIZEOF_LONG == 8
875d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#define LONG_MAX 0X7FFFFFFFFFFFFFFFL
876d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#else
877d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#error "could not set LONG_MAX in pyport.h"
878d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#endif
879d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#endif
880d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake
881d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#ifndef LONG_MIN
882d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#define LONG_MIN (-LONG_MAX-1)
883d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#endif
884d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake
885d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters#ifndef LONG_BIT
886d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters#define LONG_BIT (8 * SIZEOF_LONG)
887d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters#endif
888d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters
889d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters#if LONG_BIT != 8 * SIZEOF_LONG
890d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters/* 04-Oct-2000 LONG_BIT is apparently (mis)defined as 64 on some recent
891d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters * 32-bit platforms using gcc.  We try to catch that here at compile-time
892d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters * rather than waiting for integer multiplication to trigger bogus
893d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters * overflows.
894d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters */
895234fb632a376622ddf8b7c3fd600b9b434e21b14Andrew M. Kuchling#error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)."
896d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters#endif
897d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters
8987d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#ifdef __cplusplus
8997d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters}
9007d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#endif
9017d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
902156910851e31d4e7f8d1441a3b05a44b31349adfNeil Schemenauer/*
903156910851e31d4e7f8d1441a3b05a44b31349adfNeil Schemenauer * Hide GCC attributes from compilers that don't support them.
904156910851e31d4e7f8d1441a3b05a44b31349adfNeil Schemenauer */
905bd67d6f32c813eb3c17a07d305db7004c2dcee0aGuido van Rossum#if (!defined(__GNUC__) || __GNUC__ < 2 || \
9064892f2406f8cc3527bf0620c4a78f11d909afe8aJack Jansen     (__GNUC__ == 2 && __GNUC_MINOR__ < 7) ) && \
907bd67d6f32c813eb3c17a07d305db7004c2dcee0aGuido van Rossum    !defined(RISCOS)
90896aa0acef021f77d6e5b861201ccd952aa6f6469Neil Schemenauer#define Py_GCC_ATTRIBUTE(x)
90996aa0acef021f77d6e5b861201ccd952aa6f6469Neil Schemenauer#else
91096aa0acef021f77d6e5b861201ccd952aa6f6469Neil Schemenauer#define Py_GCC_ATTRIBUTE(x) __attribute__(x)
911156910851e31d4e7f8d1441a3b05a44b31349adfNeil Schemenauer#endif
912156910851e31d4e7f8d1441a3b05a44b31349adfNeil Schemenauer
913aac1316222c7e4a073af1634f2eef0a872a3dafbMartin v. Löwis/*
914aac1316222c7e4a073af1634f2eef0a872a3dafbMartin v. Löwis * Add PyArg_ParseTuple format where available.
915aac1316222c7e4a073af1634f2eef0a872a3dafbMartin v. Löwis */
916aac1316222c7e4a073af1634f2eef0a872a3dafbMartin v. Löwis#ifdef HAVE_ATTRIBUTE_FORMAT_PARSETUPLE
917aac1316222c7e4a073af1634f2eef0a872a3dafbMartin v. Löwis#define Py_FORMAT_PARSETUPLE(func,p1,p2) __attribute__((format(func,p1,p2)))
918aac1316222c7e4a073af1634f2eef0a872a3dafbMartin v. Löwis#else
919aac1316222c7e4a073af1634f2eef0a872a3dafbMartin v. Löwis#define Py_FORMAT_PARSETUPLE(func,p1,p2)
920aac1316222c7e4a073af1634f2eef0a872a3dafbMartin v. Löwis#endif
921aac1316222c7e4a073af1634f2eef0a872a3dafbMartin v. Löwis
922d89f5b20b2e00241eebd8ca592520c429d6f0d4cJeffrey Yasskin/*
923d89f5b20b2e00241eebd8ca592520c429d6f0d4cJeffrey Yasskin * Specify alignment on compilers that support it.
924d89f5b20b2e00241eebd8ca592520c429d6f0d4cJeffrey Yasskin */
925d89f5b20b2e00241eebd8ca592520c429d6f0d4cJeffrey Yasskin#if defined(__GNUC__) && __GNUC__ >= 3
926d89f5b20b2e00241eebd8ca592520c429d6f0d4cJeffrey Yasskin#define Py_ALIGNED(x) __attribute__((aligned(x)))
927d89f5b20b2e00241eebd8ca592520c429d6f0d4cJeffrey Yasskin#else
928d89f5b20b2e00241eebd8ca592520c429d6f0d4cJeffrey Yasskin#define Py_ALIGNED(x)
929d89f5b20b2e00241eebd8ca592520c429d6f0d4cJeffrey Yasskin#endif
930d89f5b20b2e00241eebd8ca592520c429d6f0d4cJeffrey Yasskin
9319ba301e589b47af776294804240cc10e08e38498Nicholas Bastin/* Eliminate end-of-loop code not reached warnings from SunPro C
9329ba301e589b47af776294804240cc10e08e38498Nicholas Bastin * when using do{...}while(0) macros
9339ba301e589b47af776294804240cc10e08e38498Nicholas Bastin */
9349ba301e589b47af776294804240cc10e08e38498Nicholas Bastin#ifdef __SUNPRO_C
9359ba301e589b47af776294804240cc10e08e38498Nicholas Bastin#pragma error_messages (off,E_END_OF_LOOP_CODE_NOT_REACHED)
9369ba301e589b47af776294804240cc10e08e38498Nicholas Bastin#endif
9379ba301e589b47af776294804240cc10e08e38498Nicholas Bastin
938a43190bc789bebfef15fb2b82f94a19a6bc80000Martin v. Löwis/*
939a43190bc789bebfef15fb2b82f94a19a6bc80000Martin v. Löwis * Older Microsoft compilers don't support the C99 long long literal suffixes,
940a43190bc789bebfef15fb2b82f94a19a6bc80000Martin v. Löwis * so these will be defined in PC/pyconfig.h for those compilers.
941a43190bc789bebfef15fb2b82f94a19a6bc80000Martin v. Löwis */
942a43190bc789bebfef15fb2b82f94a19a6bc80000Martin v. Löwis#ifndef Py_LL
943a43190bc789bebfef15fb2b82f94a19a6bc80000Martin v. Löwis#define Py_LL(x) x##LL
944a43190bc789bebfef15fb2b82f94a19a6bc80000Martin v. Löwis#endif
945a43190bc789bebfef15fb2b82f94a19a6bc80000Martin v. Löwis
946a43190bc789bebfef15fb2b82f94a19a6bc80000Martin v. Löwis#ifndef Py_ULL
947a43190bc789bebfef15fb2b82f94a19a6bc80000Martin v. Löwis#define Py_ULL(x) Py_LL(x##U)
948a43190bc789bebfef15fb2b82f94a19a6bc80000Martin v. Löwis#endif
949a43190bc789bebfef15fb2b82f94a19a6bc80000Martin v. Löwis
9507d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#endif /* Py_PYPORT_H */
951