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
6835a6c8467a5c2d63a23b392d21c79c5f5a9e300Mark Dickinson#include <inttypes.h>
789f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters
87d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters/**************************************************************************
97d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim PetersSymbols and macros to supply platform-independent interfaces to basic
101be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim PetersC language & library operations whose spellings vary across platforms.
117d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
127d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim PetersPlease try to make documentation here as clear as possible:  by definition,
137d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Petersthe stuff here is trying to illuminate C's darkest corners.
147d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
157d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim PetersConfig #defines referenced here:
167d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
177d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim PetersSIGNED_RIGHT_SHIFT_ZERO_FILLS
187d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim PetersMeaning:  To be defined iff i>>j does not extend the sign bit when i is a
197d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters          signed integral type and i < 0.
207d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim PetersUsed in:  Py_ARITHMETIC_RIGHT_SHIFT
211be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim Peters
228315ea579046727bb234dc4692ca28c8514eacbeTim PetersPy_DEBUG
238315ea579046727bb234dc4692ca28c8514eacbeTim PetersMeaning:  Extra checks compiled in for debug mode.
248315ea579046727bb234dc4692ca28c8514eacbeTim PetersUsed in:  Py_SAFE_DOWNCAST
25fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw
267d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters**************************************************************************/
277d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
28fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw/* typedefs for some C9X-defined synonyms for integral types.
29fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw *
30fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * The names in Python are exactly the same as the C9X names, except with a
31fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * Py_ prefix.  Until C9X is universally implemented, this is the only way
32fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * to ensure that Python gets reliable names that don't conflict with names
33fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * in non-Python code that are playing their own tricks to define the C9X
34fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * names.
35fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw *
36fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * NOTE: don't go nuts here!  Python has no use for *most* of the C9X
37fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * integral synonyms.  Only define the ones we actually need.
38fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw */
39fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw
4007e6cbd7b9e5b6047a608cedd5cc9b20891a3972n.d. parker/* long long is required. Ensure HAVE_LONG_LONG is defined for compatibility. */
410d5742dec0a44c6fdbb544bc683855ff78554e72Benjamin Peterson#ifndef HAVE_LONG_LONG
42a251fb02f4400a2ea32677110e430742fd1444bcVictor Stinner#define HAVE_LONG_LONG 1
430d5742dec0a44c6fdbb544bc683855ff78554e72Benjamin Peterson#endif
44b9a0f9121876cbc728cbef88f16bb32b92712d2dMartin v. Löwis#ifndef PY_LONG_LONG
45b9a0f9121876cbc728cbef88f16bb32b92712d2dMartin v. Löwis#define PY_LONG_LONG long long
46cd16bf640405065e4702539632ce577536207d88Guido van Rossum/* If LLONG_MAX is defined in limits.h, use that. */
47cd16bf640405065e4702539632ce577536207d88Guido van Rossum#define PY_LLONG_MIN LLONG_MIN
48cd16bf640405065e4702539632ce577536207d88Guido van Rossum#define PY_LLONG_MAX LLONG_MAX
49cd16bf640405065e4702539632ce577536207d88Guido van Rossum#define PY_ULLONG_MAX ULLONG_MAX
50fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw#endif
51fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw
52bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson#define PY_UINT32_T uint32_t
53bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson#define PY_UINT64_T uint64_t
54bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson
55bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson/* Signed variants of the above */
56bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson#define PY_INT32_T int32_t
57bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson#define PY_INT64_T int64_t
58bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson
59bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson/* If PYLONG_BITS_IN_DIGIT is not defined then we'll use 30-bit digits if all
60bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson   the necessary integer types are available, and we're on a 64-bit platform
61bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson   (as determined by SIZEOF_VOID_P); otherwise we use 15-bit digits. */
62bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson
63bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson#ifndef PYLONG_BITS_IN_DIGIT
644fe55106d1bd99015b18118bf1067a1189e070eaBenjamin Peterson#if SIZEOF_VOID_P >= 8
65bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson#define PYLONG_BITS_IN_DIGIT 30
66bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson#else
67bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson#define PYLONG_BITS_IN_DIGIT 15
68bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson#endif
69bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson#endif
70bd7926478de92a2a0ef4440e1a9ae61b706a80d2Mark Dickinson
71fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw/* uintptr_t is the C9X name for an unsigned integral type such that a
72fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw * legitimate void* can be cast to uintptr_t and then back to void* again
7379248aa1e4a8f6510b1f0ef95dc9592d51e16d6cTim Peters * without loss of information.  Similarly for intptr_t, wrt a signed
7479248aa1e4a8f6510b1f0ef95dc9592d51e16d6cTim Peters * integral type.
75fd847b23e64180d117af44e51eeb03b61e2f04d2Barry Warsaw */
76f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitroutypedef uintptr_t       Py_uintptr_t;
77f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitroutypedef intptr_t        Py_intptr_t;
7879248aa1e4a8f6510b1f0ef95dc9592d51e16d6cTim Peters
7949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters/* Py_ssize_t is a signed integral type such that sizeof(Py_ssize_t) ==
8049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * sizeof(size_t).  C99 doesn't define such a thing directly (size_t is an
8149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * unsigned integral type).  See PEP 353 for details.
8249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters */
8318e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis#ifdef HAVE_SSIZE_T
84f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitroutypedef ssize_t         Py_ssize_t;
8518e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis#elif SIZEOF_VOID_P == SIZEOF_SIZE_T
86f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitroutypedef Py_intptr_t     Py_ssize_t;
8718e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis#else
8818e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis#   error "Python needs a typedef for Py_ssize_t in pyport.h."
8918e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis#endif
9049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
918f67d0893f7170986b0ad370844318544270cbccBenjamin Peterson/* Py_hash_t is the same size as a pointer. */
92985ecdcfc29adfc36ce2339acf03f819ad414869Christian Heimes#define SIZEOF_PY_HASH_T SIZEOF_SIZE_T
938f67d0893f7170986b0ad370844318544270cbccBenjamin Petersontypedef Py_ssize_t Py_hash_t;
948035bc5c048ff08f652649754eb8ea769337afa0Benjamin Peterson/* Py_uhash_t is the unsigned equivalent needed to calculate numeric hash. */
95985ecdcfc29adfc36ce2339acf03f819ad414869Christian Heimes#define SIZEOF_PY_UHASH_T SIZEOF_SIZE_T
968035bc5c048ff08f652649754eb8ea769337afa0Benjamin Petersontypedef size_t Py_uhash_t;
978f67d0893f7170986b0ad370844318544270cbccBenjamin Peterson
98ebdcb50b8a0d37af4acd7d2387eae8ff2b5f0b9bLarry Hastings/* Only used for compatibility with code that may not be PY_SSIZE_T_CLEAN. */
99ebdcb50b8a0d37af4acd7d2387eae8ff2b5f0b9bLarry Hastings#ifdef PY_SSIZE_T_CLEAN
100ebdcb50b8a0d37af4acd7d2387eae8ff2b5f0b9bLarry Hastingstypedef Py_ssize_t Py_ssize_clean_t;
101ebdcb50b8a0d37af4acd7d2387eae8ff2b5f0b9bLarry Hastings#else
102ebdcb50b8a0d37af4acd7d2387eae8ff2b5f0b9bLarry Hastingstypedef int Py_ssize_clean_t;
103ebdcb50b8a0d37af4acd7d2387eae8ff2b5f0b9bLarry Hastings#endif
104ebdcb50b8a0d37af4acd7d2387eae8ff2b5f0b9bLarry Hastings
1052f8bfef1587b3e8f43c0ce7cd9546137c5b56782Benjamin Peterson/* Largest possible value of size_t. */
1069c74b14fe9b6dddc9d41dd37f431f174350004d4Amaury Forgeot d'Arc#define PY_SIZE_MAX SIZE_MAX
1079c74b14fe9b6dddc9d41dd37f431f174350004d4Amaury Forgeot d'Arc
10849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters/* Largest positive value of type Py_ssize_t. */
10918e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1))
11049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters/* Smallest negative value of type Py_ssize_t. */
11149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1)
11249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
11349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters/* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf
11449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * format to convert an argument with the width of a size_t or Py_ssize_t.
11549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * C99 introduced "z" for this purpose, but not all platforms support that;
11649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * e.g., MS compilers use "I" instead.
11749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters *
11849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * These "high level" Python format functions interpret "z" correctly on
11949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * all platforms (Python interprets the format string itself, and does whatever
12049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * the platform C requires to convert a size_t/Py_ssize_t argument):
12149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters *
12272b710a59617ebe6dd1c41613d2c7eb81702efd9Christian Heimes *     PyBytes_FromFormat
12349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters *     PyErr_Format
12472b710a59617ebe6dd1c41613d2c7eb81702efd9Christian Heimes *     PyBytes_FromFormatV
1257696ed7b926dd73700ff9972d7a47beb7ec13191Walter Dörwald *     PyUnicode_FromFormatV
12649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters *
12749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * Lower-level uses require that you interpolate the correct format modifier
12849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * yourself (e.g., calling printf, fprintf, sprintf, PyOS_snprintf); for
12949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * example,
13049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters *
13149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters *     Py_ssize_t index;
13249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters *     fprintf(stderr, "index %" PY_FORMAT_SIZE_T "d sucks\n", index);
13349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters *
13449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * That will expand to %ld, or %Id, or to something else correct for a
13549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * Py_ssize_t on the platform.
13649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters */
13749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifndef PY_FORMAT_SIZE_T
13889f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters#   if SIZEOF_SIZE_T == SIZEOF_INT && !defined(__APPLE__)
13949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#       define PY_FORMAT_SIZE_T ""
14049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#   elif SIZEOF_SIZE_T == SIZEOF_LONG
14149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#       define PY_FORMAT_SIZE_T "l"
14249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#   elif defined(MS_WINDOWS)
14349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#       define PY_FORMAT_SIZE_T "I"
14449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#   else
14549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#       error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T"
14649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#   endif
14749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
14818e165558b24d29e7e0ca501842b9236589b012aMartin v. Löwis
149477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters/* Py_LOCAL can be used instead of static to get the fastest possible calling
150477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters * convention for functions that are local to a given module.
151477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters *
152477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters * Py_LOCAL_INLINE does the same thing, and also explicitly requests inlining,
153477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters * for platforms that support that.
154477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters *
155477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters * If PY_LOCAL_AGGRESSIVE is defined before python.h is included, more
1564882cacab6bcaf90ac496fc8878987598e7665c1Berker Peksag * "aggressive" inlining/optimization is enabled for the entire module.  This
157477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters * may lead to code bloat, and may slow things down for those reasons.  It may
158477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters * also lead to errors, if the code relies on pointer aliasing.  Use with
159477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters * care.
160477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters *
161477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters * NOTE: You can only use this for functions that are entirely local to a
162477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters * module; functions that are exported via method tables, callbacks, etc,
163477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters * should keep using static.
164477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters */
165477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
166477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#if defined(_MSC_VER)
167477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#if defined(PY_LOCAL_AGGRESSIVE)
168477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters/* enable more aggressive optimization for visual studio */
169477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#pragma optimize("agtw", on)
170477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#endif
171f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou/* ignore warnings if the compiler decides not to inline a function */
172477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#pragma warning(disable: 4710)
173477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters/* fastest possible local call under MSVC */
174477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#define Py_LOCAL(type) static type __fastcall
175477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#define Py_LOCAL_INLINE(type) static __inline type __fastcall
176477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#elif defined(USE_INLINE)
177477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#define Py_LOCAL(type) static type
178477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#define Py_LOCAL_INLINE(type) static inline type
179477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#else
180477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#define Py_LOCAL(type) static type
181477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#define Py_LOCAL_INLINE(type) static type
182477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#endif
183477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
184f051e43b22af014364e231c36489e6745993ea34Christian Heimes/* Py_MEMCPY is kept for backwards compatibility,
185f051e43b22af014364e231c36489e6745993ea34Christian Heimes * see https://bugs.python.org/issue28126 */
1864d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas Wouters#define Py_MEMCPY memcpy
1874d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas Wouters
1887e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp#include <stdlib.h>
1897e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp
190a4962cb694c5fc7ae53f762a682cdc1ca72410eeMark Dickinson#ifdef HAVE_IEEEFP_H
191a4962cb694c5fc7ae53f762a682cdc1ca72410eeMark Dickinson#include <ieeefp.h>  /* needed for 'finite' declaration on some platforms */
192a4962cb694c5fc7ae53f762a682cdc1ca72410eeMark Dickinson#endif
193a4962cb694c5fc7ae53f762a682cdc1ca72410eeMark Dickinson
1942c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#include <math.h> /* Moved here from the math section, before extern "C" */
1952c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
1962c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov/********************************************
1972c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov * WRAPPER FOR <time.h> and/or <sys/time.h> *
1982c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov ********************************************/
1992c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
2002c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#ifdef TIME_WITH_SYS_TIME
2012c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#include <sys/time.h>
2022c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#include <time.h>
2032c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#else /* !TIME_WITH_SYS_TIME */
2042c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#ifdef HAVE_SYS_TIME_H
2052c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#include <sys/time.h>
2062c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#else /* !HAVE_SYS_TIME_H */
2072c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#include <time.h>
2082c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#endif /* !HAVE_SYS_TIME_H */
2092c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#endif /* !TIME_WITH_SYS_TIME */
2102c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
2112c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
2122c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov/******************************
2132c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov * WRAPPER FOR <sys/select.h> *
2142c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov ******************************/
2152c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
2162c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov/* NB caller must include <sys/types.h> */
2172c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
2182c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#ifdef HAVE_SYS_SELECT_H
2192c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#include <sys/select.h>
2202c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov#endif /* !HAVE_SYS_SELECT_H */
2212c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
22260f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters/*******************************
22360f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters * stat() and fstat() fiddling *
22460f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters *******************************/
22560f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters
2260e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters#ifdef HAVE_SYS_STAT_H
22760f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters#include <sys/stat.h>
22860f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters#elif defined(HAVE_STAT_H)
22960f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters#include <stat.h>
23060f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters#endif
23160f42b50d894d3c9798c50e063ae758a1a5987a2Tim Peters
23299d6135a157f6626fddd5d61007d363b3a14990dChristian Heimes#ifndef S_IFMT
233f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */
23499d6135a157f6626fddd5d61007d363b3a14990dChristian Heimes#define S_IFMT 0170000
23599d6135a157f6626fddd5d61007d363b3a14990dChristian Heimes#endif
23699d6135a157f6626fddd5d61007d363b3a14990dChristian Heimes
23799d6135a157f6626fddd5d61007d363b3a14990dChristian Heimes#ifndef S_IFLNK
23899d6135a157f6626fddd5d61007d363b3a14990dChristian Heimes/* Windows doesn't define S_IFLNK but posixmodule.c maps
23999d6135a157f6626fddd5d61007d363b3a14990dChristian Heimes * IO_REPARSE_TAG_SYMLINK to S_IFLNK */
24099d6135a157f6626fddd5d61007d363b3a14990dChristian Heimes#  define S_IFLNK 0120000
241f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#endif
242f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis
243f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#ifndef S_ISREG
244f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG)
245f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#endif
246f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis
247f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#ifndef S_ISDIR
248f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR)
249f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis#endif
250f9836ba4fea66d74fc2afddc434a147265a9caa7Martin v. Löwis
251c6ebd16a203b84de020fb236f32e8c58db92718dVictor Stinner#ifndef S_ISCHR
252c6ebd16a203b84de020fb236f32e8c58db92718dVictor Stinner#define S_ISCHR(x) (((x) & S_IFMT) == S_IFCHR)
253c6ebd16a203b84de020fb236f32e8c58db92718dVictor Stinner#endif
254c6ebd16a203b84de020fb236f32e8c58db92718dVictor Stinner
2557d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#ifdef __cplusplus
2567e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp/* Move this down here since some C++ #include's don't like to be included
2577e018909862a3fe6c571bbb7143f4ffb18ae834cPeter Schneider-Kamp   inside an extern "C" */
2587d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Petersextern "C" {
2597d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#endif
2607d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
2612c57e076fe7653e38fb0a52679bb3ac219793143Vladimir Marangozov
2627d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters/* Py_ARITHMETIC_RIGHT_SHIFT
2637d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters * C doesn't define whether a right-shift of a signed integer sign-extends
2647d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters * or zero-fills.  Here a macro to force sign extension:
2657d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters * Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J)
26616f966ee2618f7a6604b94de2e478637676f550eMark Dickinson *    Return I >> J, forcing sign extension.  Arithmetically, return the
26716f966ee2618f7a6604b94de2e478637676f550eMark Dickinson *    floor of I/2**J.
2687d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters * Requirements:
26916f966ee2618f7a6604b94de2e478637676f550eMark Dickinson *    I should have signed integer type.  In the terminology of C99, this can
27016f966ee2618f7a6604b94de2e478637676f550eMark Dickinson *    be either one of the five standard signed integer types (signed char,
27116f966ee2618f7a6604b94de2e478637676f550eMark Dickinson *    short, int, long, long long) or an extended signed integer type.
27216f966ee2618f7a6604b94de2e478637676f550eMark Dickinson *    J is an integer >= 0 and strictly less than the number of bits in the
27316f966ee2618f7a6604b94de2e478637676f550eMark Dickinson *    type of I (because C doesn't define what happens for J outside that
27416f966ee2618f7a6604b94de2e478637676f550eMark Dickinson *    range either).
27516f966ee2618f7a6604b94de2e478637676f550eMark Dickinson *    TYPE used to specify the type of I, but is now ignored.  It's been left
27616f966ee2618f7a6604b94de2e478637676f550eMark Dickinson *    in for backwards compatibility with versions <= 2.6 or 3.0.
2777d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters * Caution:
2787d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters *    I may be evaluated more than once.
2797d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters */
2807d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS
2817d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \
282f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    ((I) < 0 ? -1-((-1-(I)) >> (J)) : (I) >> (J))
2837d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#else
2847d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J))
2857d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#endif
2867d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
28739dce29365d287dc6b353b2a527dc11fe58dcfa6Tim Peters/* Py_FORCE_EXPANSION(X)
2881be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim Peters * "Simply" returns its argument.  However, macro expansions within the
2891be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim Peters * argument are evaluated.  This unfortunate trickery is needed to get
2901be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim Peters * token-pasting to work as desired in some cases.
2911be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim Peters */
2921be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim Peters#define Py_FORCE_EXPANSION(X) X
2931be46844d9c858a21021e2c3ad0ef9bbee64d9e0Tim Peters
2948315ea579046727bb234dc4692ca28c8514eacbeTim Peters/* Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW)
2958315ea579046727bb234dc4692ca28c8514eacbeTim Peters * Cast VALUE to type NARROW from type WIDE.  In Py_DEBUG mode, this
2968315ea579046727bb234dc4692ca28c8514eacbeTim Peters * assert-fails if any information is lost.
2978315ea579046727bb234dc4692ca28c8514eacbeTim Peters * Caution:
2988315ea579046727bb234dc4692ca28c8514eacbeTim Peters *    VALUE may be evaluated more than once.
2998315ea579046727bb234dc4692ca28c8514eacbeTim Peters */
3008315ea579046727bb234dc4692ca28c8514eacbeTim Peters#ifdef Py_DEBUG
3018315ea579046727bb234dc4692ca28c8514eacbeTim Peters#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \
302f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    (assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE))
3038315ea579046727bb234dc4692ca28c8514eacbeTim Peters#else
3048315ea579046727bb234dc4692ca28c8514eacbeTim Peters#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE)
3058315ea579046727bb234dc4692ca28c8514eacbeTim Peters#endif
3068315ea579046727bb234dc4692ca28c8514eacbeTim Peters
30777d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang/* Py_SET_ERRNO_ON_MATH_ERROR(x)
308a40c793d06ee2b42a5013015352616b4ca6b288bTim Peters * If a libm function did not set errno, but it looks like the result
30977d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang * overflowed or not-a-number, set errno to ERANGE or EDOM.  Set errno
31077d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang * to 0 before calling a libm function, and invoke this macro after,
31177d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang * passing the function result.
312a40c793d06ee2b42a5013015352616b4ca6b288bTim Peters * Caution:
313a40c793d06ee2b42a5013015352616b4ca6b288bTim Peters *    This isn't reliable.  See Py_OVERFLOWED comments.
314a40c793d06ee2b42a5013015352616b4ca6b288bTim Peters *    X is evaluated more than once.
315a40c793d06ee2b42a5013015352616b4ca6b288bTim Peters */
316539c662f10b41d15f658cabfa03cc02902862adcGuido van Rossum#if defined(__FreeBSD__) || defined(__OpenBSD__) || (defined(__hpux) && defined(__ia64))
31777d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang#define _Py_SET_EDOM_FOR_NAN(X) if (isnan(X)) errno = EDOM;
31877d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang#else
31977d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang#define _Py_SET_EDOM_FOR_NAN(X) ;
32077d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang#endif
32177d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang#define Py_SET_ERRNO_ON_MATH_ERROR(X) \
322f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    do { \
323f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (errno == 0) { \
324f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \
325f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                errno = ERANGE; \
326f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            else _Py_SET_EDOM_FOR_NAN(X) \
327f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        } \
328f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } while(0)
32957f282a2a06c01417abec74926e770fb12f95610Tim Peters
33077d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang/* Py_SET_ERANGE_ON_OVERFLOW(x)
33177d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang * An alias of Py_SET_ERRNO_ON_MATH_ERROR for backward-compatibility.
33277d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang */
33377d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang#define Py_SET_ERANGE_IF_OVERFLOW(X) Py_SET_ERRNO_ON_MATH_ERROR(X)
33477d9a3effa21b8987ceac26d67ad676e1c5afb49Hye-Shik Chang
335dc5a508761d7260bc863a2f3068723c298336382Tim Peters/* Py_ADJUST_ERANGE1(x)
336dc5a508761d7260bc863a2f3068723c298336382Tim Peters * Py_ADJUST_ERANGE2(x, y)
337dc5a508761d7260bc863a2f3068723c298336382Tim Peters * Set errno to 0 before calling a libm function, and invoke one of these
338dc5a508761d7260bc863a2f3068723c298336382Tim Peters * macros after, passing the function result(s) (Py_ADJUST_ERANGE2 is useful
339dc5a508761d7260bc863a2f3068723c298336382Tim Peters * for functions returning complex results).  This makes two kinds of
340dc5a508761d7260bc863a2f3068723c298336382Tim Peters * adjustments to errno:  (A) If it looks like the platform libm set
341dc5a508761d7260bc863a2f3068723c298336382Tim Peters * errno=ERANGE due to underflow, clear errno. (B) If it looks like the
342dc5a508761d7260bc863a2f3068723c298336382Tim Peters * platform libm overflowed but didn't set errno, force errno to ERANGE.  In
343dc5a508761d7260bc863a2f3068723c298336382Tim Peters * effect, we're trying to force a useful implementation of C89 errno
344dc5a508761d7260bc863a2f3068723c298336382Tim Peters * behavior.
345dc5a508761d7260bc863a2f3068723c298336382Tim Peters * Caution:
346dc5a508761d7260bc863a2f3068723c298336382Tim Peters *    This isn't reliable.  See Py_OVERFLOWED comments.
347dc5a508761d7260bc863a2f3068723c298336382Tim Peters *    X and Y may be evaluated more than once.
348dc5a508761d7260bc863a2f3068723c298336382Tim Peters */
349f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#define Py_ADJUST_ERANGE1(X)                                            \
350f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    do {                                                                \
351f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (errno == 0) {                                               \
352f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL)              \
353f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                errno = ERANGE;                                         \
354f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }                                                               \
355f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else if (errno == ERANGE && (X) == 0.0)                         \
356f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            errno = 0;                                                  \
357f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } while(0)
358f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
359f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#define Py_ADJUST_ERANGE2(X, Y)                                         \
360f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    do {                                                                \
361f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL ||                \
362f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            (Y) == Py_HUGE_VAL || (Y) == -Py_HUGE_VAL) {                \
363f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        if (errno == 0)                                 \
364f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                                errno = ERANGE;                         \
365f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }                                                               \
366f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else if (errno == ERANGE)                                       \
367f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            errno = 0;                                                  \
368f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } while(0)
369dc5a508761d7260bc863a2f3068723c298336382Tim Peters
370a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson/*  The functions _Py_dg_strtod and _Py_dg_dtoa in Python/dtoa.c (which are
371a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *  required to support the short float repr introduced in Python 3.1) require
372a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *  that the floating-point unit that's being used for arithmetic operations
373a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *  on C doubles is set to use 53-bit precision.  It also requires that the
374a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *  FPU rounding mode is round-half-to-even, but that's less often an issue.
375a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *
376a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *  If your FPU isn't already set to 53-bit precision/round-half-to-even, and
377a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *  you want to make use of _Py_dg_strtod and _Py_dg_dtoa, then you should
378a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *
379a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *     #define HAVE_PY_SET_53BIT_PRECISION 1
380a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *
381a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *  and also give appropriate definitions for the following three macros:
382a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *
383a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *    _PY_SET_53BIT_PRECISION_START : store original FPU settings, and
384a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *        set FPU to 53-bit precision/round-half-to-even
385a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *    _PY_SET_53BIT_PRECISION_END : restore original FPU settings
386a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *    _PY_SET_53BIT_PRECISION_HEADER : any variable declarations needed to
387a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *        use the two macros above.
388a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson *
389a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson * The macros are designed to be used within a single C function: see
390a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson * Python/pystrtod.c for an example of their use.
391a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson */
392b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
393a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson/* get and set x87 control word for gcc/x86 */
3947abf8d4066e9b4dd21f9a498427ac1ec8914c0abMark Dickinson#ifdef HAVE_GCC_ASM_FOR_X87
395a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson#define HAVE_PY_SET_53BIT_PRECISION 1
396a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson/* _Py_get/set_387controlword functions are defined in Python/pymath.c */
397f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#define _Py_SET_53BIT_PRECISION_HEADER                          \
398f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    unsigned short old_387controlword, new_387controlword
399f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#define _Py_SET_53BIT_PRECISION_START                                   \
400f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    do {                                                                \
401f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        old_387controlword = _Py_get_387controlword();                  \
402f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        new_387controlword = (old_387controlword & ~0x0f00) | 0x0200; \
403f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (new_387controlword != old_387controlword)                   \
404f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            _Py_set_387controlword(new_387controlword);                 \
405f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } while (0)
406f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#define _Py_SET_53BIT_PRECISION_END                             \
407f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (new_387controlword != old_387controlword)               \
408f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _Py_set_387controlword(old_387controlword)
409a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson#endif
410a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson
41118e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson/* get and set x87 control word for VisualStudio/x86 */
41218e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson#if defined(_MSC_VER) && !defined(_WIN64) /* x87 not supported in 64-bit */
41318e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson#define HAVE_PY_SET_53BIT_PRECISION 1
41418e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson#define _Py_SET_53BIT_PRECISION_HEADER \
41518e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson    unsigned int old_387controlword, new_387controlword, out_387controlword
41618e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson/* We use the __control87_2 function to set only the x87 control word.
41718e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson   The SSE control word is unaffected. */
41818e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson#define _Py_SET_53BIT_PRECISION_START                                   \
41918e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson    do {                                                                \
42018e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson        __control87_2(0, 0, &old_387controlword, NULL);                 \
42118e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson        new_387controlword =                                            \
42218e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson          (old_387controlword & ~(_MCW_PC | _MCW_RC)) | (_PC_53 | _RC_NEAR); \
42318e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson        if (new_387controlword != old_387controlword)                   \
42418e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson            __control87_2(new_387controlword, _MCW_PC | _MCW_RC,        \
42518e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson                          &out_387controlword, NULL);                   \
42618e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson    } while (0)
42718e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson#define _Py_SET_53BIT_PRECISION_END                                     \
42818e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson    do {                                                                \
42918e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson        if (new_387controlword != old_387controlword)                   \
43018e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson            __control87_2(old_387controlword, _MCW_PC | _MCW_RC,        \
43118e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson                          &out_387controlword, NULL);                   \
43218e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson    } while (0)
43318e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson#endif
43418e3d81f96a592a0307fa41645017483eabcfc51Mark Dickinson
4358bdeb1672ce1d0412e1fcc6cff0821bb66f02c1aBenjamin Peterson#ifdef HAVE_GCC_ASM_FOR_MC68881
4368bdeb1672ce1d0412e1fcc6cff0821bb66f02c1aBenjamin Peterson#define HAVE_PY_SET_53BIT_PRECISION 1
4378bdeb1672ce1d0412e1fcc6cff0821bb66f02c1aBenjamin Peterson#define _Py_SET_53BIT_PRECISION_HEADER \
4388bdeb1672ce1d0412e1fcc6cff0821bb66f02c1aBenjamin Peterson  unsigned int old_fpcr, new_fpcr
439f051e43b22af014364e231c36489e6745993ea34Christian Heimes#define _Py_SET_53BIT_PRECISION_START                                   \
440f051e43b22af014364e231c36489e6745993ea34Christian Heimes  do {                                                                  \
441f051e43b22af014364e231c36489e6745993ea34Christian Heimes    __asm__ ("fmove.l %%fpcr,%0" : "=g" (old_fpcr));                    \
442f051e43b22af014364e231c36489e6745993ea34Christian Heimes    /* Set double precision / round to nearest.  */                     \
443f051e43b22af014364e231c36489e6745993ea34Christian Heimes    new_fpcr = (old_fpcr & ~0xf0) | 0x80;                               \
444f051e43b22af014364e231c36489e6745993ea34Christian Heimes    if (new_fpcr != old_fpcr)                                           \
445f051e43b22af014364e231c36489e6745993ea34Christian Heimes      __asm__ volatile ("fmove.l %0,%%fpcr" : : "g" (new_fpcr));        \
4468bdeb1672ce1d0412e1fcc6cff0821bb66f02c1aBenjamin Peterson  } while (0)
447f051e43b22af014364e231c36489e6745993ea34Christian Heimes#define _Py_SET_53BIT_PRECISION_END                                     \
448f051e43b22af014364e231c36489e6745993ea34Christian Heimes  do {                                                                  \
449f051e43b22af014364e231c36489e6745993ea34Christian Heimes    if (new_fpcr != old_fpcr)                                           \
450f051e43b22af014364e231c36489e6745993ea34Christian Heimes      __asm__ volatile ("fmove.l %0,%%fpcr" : : "g" (old_fpcr));        \
4518bdeb1672ce1d0412e1fcc6cff0821bb66f02c1aBenjamin Peterson  } while (0)
4528bdeb1672ce1d0412e1fcc6cff0821bb66f02c1aBenjamin Peterson#endif
4538bdeb1672ce1d0412e1fcc6cff0821bb66f02c1aBenjamin Peterson
454a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson/* default definitions are empty */
455a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson#ifndef HAVE_PY_SET_53BIT_PRECISION
456b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define _Py_SET_53BIT_PRECISION_HEADER
457b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define _Py_SET_53BIT_PRECISION_START
458b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define _Py_SET_53BIT_PRECISION_END
459b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
460b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
461b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson/* If we can't guarantee 53-bit precision, don't use the code
462b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   in Python/dtoa.c, but fall back to standard code.  This
463b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   means that repr of a float will be long (17 sig digits).
464b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
465b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   Realistically, there are two things that could go wrong:
466b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
467b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   (1) doubles aren't IEEE 754 doubles, or
468b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson   (2) we're on x86 with the rounding precision set to 64-bits
469b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson       (extended precision), and we don't know how to change
470b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson       the rounding precision.
471b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson */
472b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
473b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#if !defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) && \
474b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    !defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) && \
475b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson    !defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754)
476b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define PY_NO_SHORT_FLOAT_REPR
477b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
478b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
47960fd0999cce17ec8603edf4219f686c37a260d7bMark Dickinson/* double rounding is symptomatic of use of extended precision on x86.  If
48060fd0999cce17ec8603edf4219f686c37a260d7bMark Dickinson   we're seeing double rounding, and we don't have any mechanism available for
48160fd0999cce17ec8603edf4219f686c37a260d7bMark Dickinson   changing the FPU rounding precision, then don't use Python/dtoa.c. */
482a4262b93ebb4d6a0419d10832c56b689c7a2e208Mark Dickinson#if defined(X87_DOUBLE_ROUNDING) && !defined(HAVE_PY_SET_53BIT_PRECISION)
483b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#define PY_NO_SHORT_FLOAT_REPR
484b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson#endif
485b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
486b08a53a99def3fa949643974f713b5b189e21bc7Mark Dickinson
487802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz/* Py_DEPRECATED(version)
48893344ab0365c4b55ef895c9fd3873dd06690ca00Neal Norwitz * Declare a variable, type, or function deprecated.
489802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz * Usage:
490802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz *    extern int old_var Py_DEPRECATED(2.3);
491802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz *    typedef int T1 Py_DEPRECATED(2.4);
492802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz *    extern int x() Py_DEPRECATED(2.5);
493802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz */
49449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#if defined(__GNUC__) && ((__GNUC__ >= 4) || \
495f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou              (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))
496802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz#define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__))
497802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz#else
4984643bd9a9cf43332992d10982c52debf3f0d980cTim Peters#define Py_DEPRECATED(VERSION_UNUSED)
499802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz#endif
500802926482ca55342316c315ed3d20e9a2f7087b7Neal Norwitz
5011e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters/**************************************************************************
5021e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas WoutersPrototypes that are missing from the standard include files on some systems
5031e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters(and possibly only some versions of such systems.)
5041e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
5051e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas WoutersPlease be conservative with adding new ones, document them and enclose them
5061e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Woutersin platform-specific #ifdefs.
5071e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters**************************************************************************/
5081e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
5091e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#ifdef SOLARIS
5101e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters/* Unchecked */
5111e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Woutersextern int gethostname(char *, int);
5121e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#endif
5131e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
5141e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#ifdef HAVE__GETPTY
515f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#include <sys/types.h>          /* we need to import mode_t */
5161e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Woutersextern char * _getpty(int *, int, mode_t, int);
5171e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#endif
5181e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
519f78e02b79862ac555fe052240bda55fa770a2d6fGeorg Brandl/* On QNX 6, struct termio must be declared by including sys/termio.h
520f78e02b79862ac555fe052240bda55fa770a2d6fGeorg Brandl   if TCGETA, TCSETA, TCSETAW, or TCSETAF are used.  sys/termio.h must
521f78e02b79862ac555fe052240bda55fa770a2d6fGeorg Brandl   be included before termios.h or it will generate an error. */
5222cbbed6541d7d79176ff7dcd0eafcada95b4fa80Stefan Krah#if defined(HAVE_SYS_TERMIO_H) && !defined(__hpux)
523f78e02b79862ac555fe052240bda55fa770a2d6fGeorg Brandl#include <sys/termio.h>
524f78e02b79862ac555fe052240bda55fa770a2d6fGeorg Brandl#endif
525f78e02b79862ac555fe052240bda55fa770a2d6fGeorg Brandl
5261e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY)
5271e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#if !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H)
5281e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters/* BSDI does not supply a prototype for the 'openpty' and 'forkpty'
5291e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters   functions, even though they are included in libutil. */
5301e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#include <termios.h>
531aa2b22abf342dd000d243512c620d5b5022381cfSerhiy Storchakaextern int openpty(int *, int *, char *, struct termios *, struct winsize *);
532aa2b22abf342dd000d243512c620d5b5022381cfSerhiy Storchakaextern pid_t forkpty(int *, char *, struct termios *, struct winsize *);
5331e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#endif /* !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) */
5341e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */
5351e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
5361e0c2f4bee43728930bd5f4dc77283f09c4ba004Thomas Wouters
53749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters/* On 4.4BSD-descendants, ctype functions serves the whole range of
53849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * wchar_t character set rather than single byte code points only.
53949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * This characteristic can break some operations of string object
54049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * including str.upper() and str.split() on UTF-8 locales.  This
54149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters * workaround was provided by Tim Robbins of FreeBSD project.
54249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters */
543b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang
544b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#ifdef __FreeBSD__
545b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#include <osreldate.h>
5463d4559936a0e628c1c910c48b26907f2b2f2c9cbNed Deily#if (__FreeBSD_version >= 500040 && __FreeBSD_version < 602113) || \
5473d4559936a0e628c1c910c48b26907f2b2f2c9cbNed Deily    (__FreeBSD_version >= 700000 && __FreeBSD_version < 700054) || \
5483d4559936a0e628c1c910c48b26907f2b2f2c9cbNed Deily    (__FreeBSD_version >= 800000 && __FreeBSD_version < 800001)
549501aeffba3673fdce742054a5e0014dbe3ab40a7Ronald Oussoren# define _PY_PORT_CTYPE_UTF8_ISSUE
550501aeffba3673fdce742054a5e0014dbe3ab40a7Ronald Oussoren#endif
551501aeffba3673fdce742054a5e0014dbe3ab40a7Ronald Oussoren#endif
552501aeffba3673fdce742054a5e0014dbe3ab40a7Ronald Oussoren
553501aeffba3673fdce742054a5e0014dbe3ab40a7Ronald Oussoren
554501aeffba3673fdce742054a5e0014dbe3ab40a7Ronald Oussoren#if defined(__APPLE__)
555501aeffba3673fdce742054a5e0014dbe3ab40a7Ronald Oussoren# define _PY_PORT_CTYPE_UTF8_ISSUE
556501aeffba3673fdce742054a5e0014dbe3ab40a7Ronald Oussoren#endif
557501aeffba3673fdce742054a5e0014dbe3ab40a7Ronald Oussoren
558501aeffba3673fdce742054a5e0014dbe3ab40a7Ronald Oussoren#ifdef _PY_PORT_CTYPE_UTF8_ISSUE
5597659aab5e990dd33fab47bd29c445ed7202e0cacNed Deily#ifndef __cplusplus
5607659aab5e990dd33fab47bd29c445ed7202e0cacNed Deily   /* The workaround below is unsafe in C++ because
5617659aab5e990dd33fab47bd29c445ed7202e0cacNed Deily    * the <locale> defines these symbols as real functions,
5627659aab5e990dd33fab47bd29c445ed7202e0cacNed Deily    * with a slightly different signature.
5637659aab5e990dd33fab47bd29c445ed7202e0cacNed Deily    * See issue #10910
5647659aab5e990dd33fab47bd29c445ed7202e0cacNed Deily    */
565b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#include <ctype.h>
566b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#include <wctype.h>
567b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#undef isalnum
568b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#define isalnum(c) iswalnum(btowc(c))
569b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#undef isalpha
570b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#define isalpha(c) iswalpha(btowc(c))
571b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#undef islower
572b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#define islower(c) iswlower(btowc(c))
573b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#undef isspace
574b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#define isspace(c) iswspace(btowc(c))
575b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#undef isupper
576b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#define isupper(c) iswupper(btowc(c))
577b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#undef tolower
578b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#define tolower(c) towlower(btowc(c))
579b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#undef toupper
580b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#define toupper(c) towupper(btowc(c))
581b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang#endif
5827659aab5e990dd33fab47bd29c445ed7202e0cacNed Deily#endif
583b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang
584b5047fd01948ab108edcc1b3c2c901d915814cfdHye-Shik Chang
5858235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond/* Declarations for symbol visibility.
5868235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond
5878235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond  PyAPI_FUNC(type): Declares a public Python API function and return type
5884643bd9a9cf43332992d10982c52debf3f0d980cTim Peters  PyAPI_DATA(type): Declares public Python data and its type
5898235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond  PyMODINIT_FUNC:   A Python module init function.  If these functions are
5904643bd9a9cf43332992d10982c52debf3f0d980cTim Peters                    inside the Python core, they are private to the core.
5914643bd9a9cf43332992d10982c52debf3f0d980cTim Peters                    If in an extension module, it may be declared with
5928235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond                    external linkage depending on the platform.
5938235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond
5948235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond  As a number of platforms support/require "__declspec(dllimport/dllexport)",
5958235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond  we support a HAVE_DECLSPEC_DLL macro to save duplication.
5968235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond*/
5978235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond
5984643bd9a9cf43332992d10982c52debf3f0d980cTim Peters/*
599f163d10fbe5d90aace7325400c3d597ed6c9e62aMichael W. Hudson  All windows ports, except cygwin, are handled in PC/pyconfig.h.
600f163d10fbe5d90aace7325400c3d597ed6c9e62aMichael W. Hudson
601eb33e5ae79542371a165bdb67099d14b7557a698Skip Montanaro  Cygwin is the only other autoconf platform requiring special
602eb33e5ae79542371a165bdb67099d14b7557a698Skip Montanaro  linkage handling and it uses __declspec().
6038235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond*/
604eb33e5ae79542371a165bdb67099d14b7557a698Skip Montanaro#if defined(__CYGWIN__)
605f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#       define HAVE_DECLSPEC_DLL
6068235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#endif
6078235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond
6083076559ea5d36d9795edc32e2fae7949b875d7efJason Tishler/* only get special linkage if built as shared or platform is Cygwin */
6093076559ea5d36d9795edc32e2fae7949b875d7efJason Tishler#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__)
610f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#       if defined(HAVE_DECLSPEC_DLL)
611f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#               ifdef Py_BUILD_CORE
612f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                       define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE
613f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                       define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE
61438615993b0b13729cc2afaa69686f5bff17547c4Daniel Stutzbach        /* module init functions inside the core need no external linkage */
61538615993b0b13729cc2afaa69686f5bff17547c4Daniel Stutzbach        /* except for Cygwin to handle embedding */
616f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                       if defined(__CYGWIN__)
617f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                               define PyMODINIT_FUNC __declspec(dllexport) PyObject*
618f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                       else /* __CYGWIN__ */
619f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                               define PyMODINIT_FUNC PyObject*
620f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                       endif /* __CYGWIN__ */
621f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#               else /* Py_BUILD_CORE */
62238615993b0b13729cc2afaa69686f5bff17547c4Daniel Stutzbach        /* Building an extension module, or an embedded situation */
62338615993b0b13729cc2afaa69686f5bff17547c4Daniel Stutzbach        /* public Python functions and data are imported */
62438615993b0b13729cc2afaa69686f5bff17547c4Daniel Stutzbach        /* Under Cygwin, auto-import functions to prevent compilation */
62538615993b0b13729cc2afaa69686f5bff17547c4Daniel Stutzbach        /* failures similar to those described at the bottom of 4.1: */
62638615993b0b13729cc2afaa69686f5bff17547c4Daniel Stutzbach        /* http://docs.python.org/extending/windows.html#a-cookbook-approach */
627f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                       if !defined(__CYGWIN__)
628f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                               define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE
629f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                       endif /* !__CYGWIN__ */
630f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                       define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE
63138615993b0b13729cc2afaa69686f5bff17547c4Daniel Stutzbach        /* module init functions outside the core must be exported */
632f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                       if defined(__cplusplus)
633f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                               define PyMODINIT_FUNC extern "C" __declspec(dllexport) PyObject*
634f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                       else /* __cplusplus */
635f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                               define PyMODINIT_FUNC __declspec(dllexport) PyObject*
636f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#                       endif /* __cplusplus */
637f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#               endif /* Py_BUILD_CORE */
638f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#       endif /* HAVE_DECLSPEC */
6398235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#endif /* Py_ENABLE_SHARED */
6408235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond
6418235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond/* If no external linkage macros defined by now, create defaults */
6428235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#ifndef PyAPI_FUNC
643f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#       define PyAPI_FUNC(RTYPE) RTYPE
6448235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#endif
6458235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#ifndef PyAPI_DATA
646f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#       define PyAPI_DATA(RTYPE) extern RTYPE
6478235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#endif
6488235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#ifndef PyMODINIT_FUNC
649f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#       if defined(__cplusplus)
650f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#               define PyMODINIT_FUNC extern "C" PyObject*
651f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#       else /* __cplusplus */
652f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#               define PyMODINIT_FUNC PyObject*
653f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#       endif /* __cplusplus */
6548235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond#endif
6558235ea1c3a5c57c9279668b5bff3d5f021ceb2d5Mark Hammond
656d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake/* limits.h constants that may be missing */
657d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake
658d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#ifndef INT_MAX
659d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#define INT_MAX 2147483647
660d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#endif
661d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake
662d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#ifndef LONG_MAX
663d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#if SIZEOF_LONG == 4
664d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#define LONG_MAX 0X7FFFFFFFL
665d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#elif SIZEOF_LONG == 8
666d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#define LONG_MAX 0X7FFFFFFFFFFFFFFFL
667d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#else
668d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#error "could not set LONG_MAX in pyport.h"
669d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#endif
670d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#endif
671d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake
672d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#ifndef LONG_MIN
673d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#define LONG_MIN (-LONG_MAX-1)
674d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake#endif
675d5fadf75e4d18df61db41205ace0cda28d98eeaaFred Drake
676d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters#ifndef LONG_BIT
677d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters#define LONG_BIT (8 * SIZEOF_LONG)
678d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters#endif
679d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters
680d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters#if LONG_BIT != 8 * SIZEOF_LONG
681d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters/* 04-Oct-2000 LONG_BIT is apparently (mis)defined as 64 on some recent
682d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters * 32-bit platforms using gcc.  We try to catch that here at compile-time
683d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters * rather than waiting for integer multiplication to trigger bogus
684d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters * overflows.
685d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters */
686234fb632a376622ddf8b7c3fd600b9b434e21b14Andrew M. Kuchling#error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)."
687d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters#endif
688d57731f74bdaaf6bb5ce190b5ccebadad218ed2bTim Peters
6897d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#ifdef __cplusplus
6907d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters}
6917d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#endif
6927d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters
693156910851e31d4e7f8d1441a3b05a44b31349adfNeil Schemenauer/*
694156910851e31d4e7f8d1441a3b05a44b31349adfNeil Schemenauer * Hide GCC attributes from compilers that don't support them.
695156910851e31d4e7f8d1441a3b05a44b31349adfNeil Schemenauer */
696bd67d6f32c813eb3c17a07d305db7004c2dcee0aGuido van Rossum#if (!defined(__GNUC__) || __GNUC__ < 2 || \
6977a98be2efbdc44a6271e3bf6117a1e6c77828414Skip Montanaro     (__GNUC__ == 2 && __GNUC_MINOR__ < 7) )
69896aa0acef021f77d6e5b861201ccd952aa6f6469Neil Schemenauer#define Py_GCC_ATTRIBUTE(x)
69996aa0acef021f77d6e5b861201ccd952aa6f6469Neil Schemenauer#else
70096aa0acef021f77d6e5b861201ccd952aa6f6469Neil Schemenauer#define Py_GCC_ATTRIBUTE(x) __attribute__(x)
701156910851e31d4e7f8d1441a3b05a44b31349adfNeil Schemenauer#endif
702156910851e31d4e7f8d1441a3b05a44b31349adfNeil Schemenauer
70389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters/*
704058e31ef2aec3ea079cdf297fc0d4f40d3d9975aBenjamin Peterson * Specify alignment on compilers that support it.
705058e31ef2aec3ea079cdf297fc0d4f40d3d9975aBenjamin Peterson */
706058e31ef2aec3ea079cdf297fc0d4f40d3d9975aBenjamin Peterson#if defined(__GNUC__) && __GNUC__ >= 3
707058e31ef2aec3ea079cdf297fc0d4f40d3d9975aBenjamin Peterson#define Py_ALIGNED(x) __attribute__((aligned(x)))
708058e31ef2aec3ea079cdf297fc0d4f40d3d9975aBenjamin Peterson#else
709058e31ef2aec3ea079cdf297fc0d4f40d3d9975aBenjamin Peterson#define Py_ALIGNED(x)
710058e31ef2aec3ea079cdf297fc0d4f40d3d9975aBenjamin Peterson#endif
711058e31ef2aec3ea079cdf297fc0d4f40d3d9975aBenjamin Peterson
7129ba301e589b47af776294804240cc10e08e38498Nicholas Bastin/* Eliminate end-of-loop code not reached warnings from SunPro C
7139ba301e589b47af776294804240cc10e08e38498Nicholas Bastin * when using do{...}while(0) macros
7149ba301e589b47af776294804240cc10e08e38498Nicholas Bastin */
7159ba301e589b47af776294804240cc10e08e38498Nicholas Bastin#ifdef __SUNPRO_C
7169ba301e589b47af776294804240cc10e08e38498Nicholas Bastin#pragma error_messages (off,E_END_OF_LOOP_CODE_NOT_REACHED)
7179ba301e589b47af776294804240cc10e08e38498Nicholas Bastin#endif
7189ba301e589b47af776294804240cc10e08e38498Nicholas Bastin
719477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#ifndef Py_LL
720477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#define Py_LL(x) x##LL
721477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#endif
722477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
723477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#ifndef Py_ULL
724477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#define Py_ULL(x) Py_LL(x##U)
725477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#endif
726477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters
7270c21214f3e583d541227df2239de377e796b55faBenjamin Peterson#define Py_VA_COPY va_copy
728f0f45142d52436d26ce8ed888c73496949caae90Alexander Belopolsky
729743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes/*
7303962d5e8926e71496d111946cad534860300b437Georg Brandl * Convenient macros to deal with endianness of the platform. WORDS_BIGENDIAN is
731743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes * detected by configure and defined in pyconfig.h. The code in pyconfig.h
7328e7586bd44cf2a117228bb8d2b2de52ae1e88fabTerry Jan Reedy * also takes care of Apple's universal builds.
733743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes */
734743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes
735743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes#ifdef WORDS_BIGENDIAN
736743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes#define PY_BIG_ENDIAN 1
737743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes#define PY_LITTLE_ENDIAN 0
738743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes#else
739743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes#define PY_BIG_ENDIAN 0
740743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes#define PY_LITTLE_ENDIAN 1
741743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes#endif
742743e0cd6b5d59767aae2524700857f188ca1e80eChristian Heimes
743918aa89483817c63c6e34a4cbdae0d17d19372e6Benjamin Peterson#ifdef Py_BUILD_CORE
7448fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower/*
7458fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower * Macros to protect CRT calls against instant termination when passed an
7468fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower * invalid parameter (issue23524).
7478fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower */
7488fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower#if defined _MSC_VER && _MSC_VER >= 1900
7498fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower
7508fc8980c96f58a7f06e4e3133735807bd245c658Steve Dowerextern _invalid_parameter_handler _Py_silent_invalid_parameter_handler;
7518fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower#define _Py_BEGIN_SUPPRESS_IPH { _invalid_parameter_handler _Py_old_handler = \
7528fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower    _set_thread_local_invalid_parameter_handler(_Py_silent_invalid_parameter_handler);
7538fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower#define _Py_END_SUPPRESS_IPH _set_thread_local_invalid_parameter_handler(_Py_old_handler); }
7548fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower
7558fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower#else
7568fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower
7578fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower#define _Py_BEGIN_SUPPRESS_IPH
7588fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower#define _Py_END_SUPPRESS_IPH
7598fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower
7608fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower#endif /* _MSC_VER >= 1900 */
7618fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower#endif /* Py_BUILD_CORE */
7628fc8980c96f58a7f06e4e3133735807bd245c658Steve Dower
7631f9eb879d573454cd3ea321993e72ad2cca65c9dStefan Krah#ifdef __ANDROID__
7641f9eb879d573454cd3ea321993e72ad2cca65c9dStefan Krah#include <android/api-level.h>
7651f9eb879d573454cd3ea321993e72ad2cca65c9dStefan Krah#endif
7661f9eb879d573454cd3ea321993e72ad2cca65c9dStefan Krah
7677d3a511a40a8c90eac66d3d59edbbe3c3d4559b1Tim Peters#endif /* Py_PYPORT_H */
768