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