1c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef Py_PYPORT_H 2c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_PYPORT_H 3c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 4c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "pyconfig.h" /* include for defines */ 5c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 6c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Some versions of HP-UX & Solaris need inttypes.h for int32_t, 7c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel INT32_MAX, etc. */ 8c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_INTTYPES_H 9c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <inttypes.h> 10c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 11c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 12c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_STDINT_H 13c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <stdint.h> 14c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 15c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 16c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/************************************************************************** 17c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielSymbols and macros to supply platform-independent interfaces to basic 18c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielC language & library operations whose spellings vary across platforms. 19c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 20c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPlease try to make documentation here as clear as possible: by definition, 21c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielthe stuff here is trying to illuminate C's darkest corners. 22c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 23c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielConfig #defines referenced here: 24c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 25c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielSIGNED_RIGHT_SHIFT_ZERO_FILLS 26c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielMeaning: To be defined iff i>>j does not extend the sign bit when i is a 27c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel signed integral type and i < 0. 28c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielUsed in: Py_ARITHMETIC_RIGHT_SHIFT 29c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 30c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPy_DEBUG 31c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielMeaning: Extra checks compiled in for debug mode. 32c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielUsed in: Py_SAFE_DOWNCAST 33c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 34c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielHAVE_UINTPTR_T 35c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielMeaning: The C9X type uintptr_t is supported by the compiler 36c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielUsed in: Py_uintptr_t 37c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 38c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielHAVE_LONG_LONG 39c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielMeaning: The compiler supports the C type "long long" 40c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielUsed in: PY_LONG_LONG 41c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 42c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel**************************************************************************/ 43c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 44c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 45c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* For backward compatibility only. Obsolete, do not use. */ 46c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_PROTOTYPES 47c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_PROTO(x) x 48c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 49c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_PROTO(x) () 50c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 51c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef Py_FPROTO 52c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_FPROTO(x) Py_PROTO(x) 53c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 54c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 55c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* typedefs for some C9X-defined synonyms for integral types. 56c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 57c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * The names in Python are exactly the same as the C9X names, except with a 58c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Py_ prefix. Until C9X is universally implemented, this is the only way 59c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * to ensure that Python gets reliable names that don't conflict with names 60c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * in non-Python code that are playing their own tricks to define the C9X 61c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * names. 62c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 63c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * NOTE: don't go nuts here! Python has no use for *most* of the C9X 64c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * integral synonyms. Only define the ones we actually need. 65c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 66c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 67c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_LONG_LONG 68c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef PY_LONG_LONG 69c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_LONG_LONG long long 70c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(LLONG_MAX) 71c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* If LLONG_MAX is defined in limits.h, use that. */ 72c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_LLONG_MIN LLONG_MIN 73c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_LLONG_MAX LLONG_MAX 74c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_ULLONG_MAX ULLONG_MAX 75c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif defined(__LONG_LONG_MAX__) 76c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Otherwise, if GCC has a builtin define, use that. */ 77c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_LLONG_MAX __LONG_LONG_MAX__ 78c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_LLONG_MIN (-PY_LLONG_MAX-1) 79c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_ULLONG_MAX (__LONG_LONG_MAX__*2ULL + 1ULL) 80c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 81c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Otherwise, rely on two's complement. */ 82c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_ULLONG_MAX (~0ULL) 83c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_LLONG_MAX ((long long)(PY_ULLONG_MAX>>1)) 84c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_LLONG_MIN (-PY_LLONG_MAX-1) 85c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* LLONG_MAX */ 86c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 87c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* HAVE_LONG_LONG */ 88c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 89c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* a build with 30-bit digits for Python long integers needs an exact-width 90c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 32-bit unsigned integer type to store those digits. (We could just use 91c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * type 'unsigned long', but that would be wasteful on a system where longs 92c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * are 64-bits.) On Unix systems, the autoconf macro AC_TYPE_UINT32_T defines 93c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * uint32_t to be such a type unless stdint.h or inttypes.h defines uint32_t. 94c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * However, it doesn't set HAVE_UINT32_T, so we do that here. 95c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 96c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef uint32_t 97c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define HAVE_UINT32_T 1 98c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 99c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 100c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_UINT32_T 101c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef PY_UINT32_T 102c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_UINT32_T uint32_t 103c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 104c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 105c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 106c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Macros for a 64-bit unsigned integer type; used for type 'twodigits' in the 107c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * long integer implementation, when 30-bit digits are enabled. 108c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 109c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef uint64_t 110c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define HAVE_UINT64_T 1 111c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 112c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 113c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_UINT64_T 114c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef PY_UINT64_T 115c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_UINT64_T uint64_t 116c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 117c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 118c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 119c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Signed variants of the above */ 120c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef int32_t 121c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define HAVE_INT32_T 1 122c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 123c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 124c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_INT32_T 125c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef PY_INT32_T 126c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_INT32_T int32_t 127c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 128c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 129c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 130c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef int64_t 131c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define HAVE_INT64_T 1 132c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 133c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 134c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_INT64_T 135c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef PY_INT64_T 136c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_INT64_T int64_t 137c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 138c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 139c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 140c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* If PYLONG_BITS_IN_DIGIT is not defined then we'll use 30-bit digits if all 141c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel the necessary integer types are available, and we're on a 64-bit platform 142c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel (as determined by SIZEOF_VOID_P); otherwise we use 15-bit digits. */ 143c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 144c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef PYLONG_BITS_IN_DIGIT 145c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if (defined HAVE_UINT64_T && defined HAVE_INT64_T && \ 146c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel defined HAVE_UINT32_T && defined HAVE_INT32_T && SIZEOF_VOID_P >= 8) 147c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PYLONG_BITS_IN_DIGIT 30 148c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 149c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PYLONG_BITS_IN_DIGIT 15 150c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 151c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 152c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 153c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* uintptr_t is the C9X name for an unsigned integral type such that a 154c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * legitimate void* can be cast to uintptr_t and then back to void* again 155c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * without loss of information. Similarly for intptr_t, wrt a signed 156c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * integral type. 157c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 158c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_UINTPTR_T 159c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef uintptr_t Py_uintptr_t; 160c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef intptr_t Py_intptr_t; 161c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 162c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif SIZEOF_VOID_P <= SIZEOF_INT 163c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef unsigned int Py_uintptr_t; 164c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef int Py_intptr_t; 165c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 166c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif SIZEOF_VOID_P <= SIZEOF_LONG 167c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef unsigned long Py_uintptr_t; 168c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef long Py_intptr_t; 169c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 170c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif defined(HAVE_LONG_LONG) && (SIZEOF_VOID_P <= SIZEOF_LONG_LONG) 171c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef unsigned PY_LONG_LONG Py_uintptr_t; 172c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef PY_LONG_LONG Py_intptr_t; 173c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 174c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 175c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# error "Python needs a typedef for Py_uintptr_t in pyport.h." 176c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* HAVE_UINTPTR_T */ 177c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 178c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Py_ssize_t is a signed integral type such that sizeof(Py_ssize_t) == 179c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * sizeof(size_t). C99 doesn't define such a thing directly (size_t is an 180c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * unsigned integral type). See PEP 353 for details. 181c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 182c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_SSIZE_T 183c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef ssize_t Py_ssize_t; 184c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif SIZEOF_VOID_P == SIZEOF_SIZE_T 185c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef Py_intptr_t Py_ssize_t; 186c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 187c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# error "Python needs a typedef for Py_ssize_t in pyport.h." 188c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 189c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 190c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Largest possible value of size_t. 191c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel SIZE_MAX is part of C99, so it might be defined on some 192c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel platforms. If it is not defined, (size_t)-1 is a portable 193c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel definition for C89, due to the way signed->unsigned 194c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel conversion is defined. */ 195c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef SIZE_MAX 196c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_SIZE_MAX SIZE_MAX 197c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 198c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_SIZE_MAX ((size_t)-1) 199c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 200c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 201c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Largest positive value of type Py_ssize_t. */ 202c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1)) 203c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Smallest negative value of type Py_ssize_t. */ 204c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1) 205c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 206c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if SIZEOF_PID_T > SIZEOF_LONG 207c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# error "Python doesn't support sizeof(pid_t) > sizeof(long)" 208c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 209c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 210c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf 211c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * format to convert an argument with the width of a size_t or Py_ssize_t. 212c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * C99 introduced "z" for this purpose, but not all platforms support that; 213c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * e.g., MS compilers use "I" instead. 214c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 215c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * These "high level" Python format functions interpret "z" correctly on 216c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * all platforms (Python interprets the format string itself, and does whatever 217c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * the platform C requires to convert a size_t/Py_ssize_t argument): 218c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 219c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * PyString_FromFormat 220c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * PyErr_Format 221c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * PyString_FromFormatV 222c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 223c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Lower-level uses require that you interpolate the correct format modifier 224c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * yourself (e.g., calling printf, fprintf, sprintf, PyOS_snprintf); for 225c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * example, 226c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 227c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Py_ssize_t index; 228c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * fprintf(stderr, "index %" PY_FORMAT_SIZE_T "d sucks\n", index); 229c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 230c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * That will expand to %ld, or %Id, or to something else correct for a 231c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Py_ssize_t on the platform. 232c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 233c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef PY_FORMAT_SIZE_T 234c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# if SIZEOF_SIZE_T == SIZEOF_INT && !defined(__APPLE__) 235c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PY_FORMAT_SIZE_T "" 236c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# elif SIZEOF_SIZE_T == SIZEOF_LONG 237c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PY_FORMAT_SIZE_T "l" 238c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# elif defined(MS_WINDOWS) 239c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PY_FORMAT_SIZE_T "I" 240c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# else 241c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T" 242c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# endif 243c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 244c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 245c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* PY_FORMAT_LONG_LONG is analogous to PY_FORMAT_SIZE_T above, but for 246c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * the long long type instead of the size_t type. It's only available 247c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * when HAVE_LONG_LONG is defined. The "high level" Python format 248c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * functions listed above will interpret "lld" or "llu" correctly on 249c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * all platforms. 250c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 251c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_LONG_LONG 252c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# ifndef PY_FORMAT_LONG_LONG 253c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# if defined(MS_WIN64) || defined(MS_WINDOWS) 254c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PY_FORMAT_LONG_LONG "I64" 255c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# else 256c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# error "This platform's pyconfig.h needs to define PY_FORMAT_LONG_LONG" 257c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# endif 258c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# endif 259c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 260c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 261c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Py_LOCAL can be used instead of static to get the fastest possible calling 262c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * convention for functions that are local to a given module. 263c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 264c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Py_LOCAL_INLINE does the same thing, and also explicitly requests inlining, 265c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * for platforms that support that. 266c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 267c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * If PY_LOCAL_AGGRESSIVE is defined before python.h is included, more 268c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * "aggressive" inlining/optimizaion is enabled for the entire module. This 269c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * may lead to code bloat, and may slow things down for those reasons. It may 270c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * also lead to errors, if the code relies on pointer aliasing. Use with 271c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * care. 272c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 273c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * NOTE: You can only use this for functions that are entirely local to a 274c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * module; functions that are exported via method tables, callbacks, etc, 275c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * should keep using static. 276c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 277c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 278c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef USE_INLINE /* XXX - set via configure? */ 279c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 280c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(_MSC_VER) 281c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(PY_LOCAL_AGGRESSIVE) 282c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* enable more aggressive optimization for visual studio */ 283c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#pragma optimize("agtw", on) 284c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 285c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* ignore warnings if the compiler decides not to inline a function */ 286c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#pragma warning(disable: 4710) 287c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* fastest possible local call under MSVC */ 288c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_LOCAL(type) static type __fastcall 289c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_LOCAL_INLINE(type) static __inline type __fastcall 290c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif defined(USE_INLINE) 291c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_LOCAL(type) static type 292c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_LOCAL_INLINE(type) static inline type 293c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 294c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_LOCAL(type) static type 295c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_LOCAL_INLINE(type) static type 296c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 297c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 298c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Py_MEMCPY can be used instead of memcpy in cases where the copied blocks 299c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * are often very short. While most platforms have highly optimized code for 300c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * large transfers, the setup costs for memcpy are often quite high. MEMCPY 301c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * solves this by doing short copies "in line". 302c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 303c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 304c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(_MSC_VER) 305c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_MEMCPY(target, source, length) do { \ 306c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel size_t i_, n_ = (length); \ 307c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel char *t_ = (void*) (target); \ 308c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel const char *s_ = (void*) (source); \ 309c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (n_ >= 16) \ 310c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel memcpy(t_, s_, n_); \ 311c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else \ 312c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel for (i_ = 0; i_ < n_; i_++) \ 313c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel t_[i_] = s_[i_]; \ 314c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } while (0) 315c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 316c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_MEMCPY memcpy 317c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 318c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 319c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <stdlib.h> 320c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 321c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_IEEEFP_H 322c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <ieeefp.h> /* needed for 'finite' declaration on some platforms */ 323c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 324c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 325c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <math.h> /* Moved here from the math section, before extern "C" */ 326c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 327c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/******************************************** 328c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * WRAPPER FOR <time.h> and/or <sys/time.h> * 329c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ********************************************/ 330c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 331c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef TIME_WITH_SYS_TIME 332c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <sys/time.h> 333c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <time.h> 334c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else /* !TIME_WITH_SYS_TIME */ 335c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_SYS_TIME_H 336c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <sys/time.h> 337c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else /* !HAVE_SYS_TIME_H */ 338c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <time.h> 339c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* !HAVE_SYS_TIME_H */ 340c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* !TIME_WITH_SYS_TIME */ 341c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 342c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 343c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/****************************** 344c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * WRAPPER FOR <sys/select.h> * 345c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ******************************/ 346c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 347c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* NB caller must include <sys/types.h> */ 348c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 349c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_SYS_SELECT_H 350c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 351c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <sys/select.h> 352c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 353c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* !HAVE_SYS_SELECT_H */ 354c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 355c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/******************************* 356c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * stat() and fstat() fiddling * 357c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel *******************************/ 358c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 359c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* We expect that stat and fstat exist on most systems. 360c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * It's confirmed on Unix, Mac and Windows. 361c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * If you don't have them, add 362c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * #define DONT_HAVE_STAT 363c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * and/or 364c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * #define DONT_HAVE_FSTAT 365c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * to your pyconfig.h. Python code beyond this should check HAVE_STAT and 366c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * HAVE_FSTAT instead. 367c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Also 368c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * #define HAVE_SYS_STAT_H 369c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * if <sys/stat.h> exists on your platform, and 370c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * #define HAVE_STAT_H 371c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * if <stat.h> does. 372c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 373c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef DONT_HAVE_STAT 374c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define HAVE_STAT 375c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 376c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 377c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef DONT_HAVE_FSTAT 378c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define HAVE_FSTAT 379c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 380c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 381c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef RISCOS 382c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <sys/types.h> 383c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include "unixstuff.h" 384c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 385c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 386c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_SYS_STAT_H 387c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(PYOS_OS2) && defined(PYCC_GCC) 388c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <sys/types.h> 389c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 390c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <sys/stat.h> 391c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif defined(HAVE_STAT_H) 392c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <stat.h> 393c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 394c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 395c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(PYCC_VACPP) 396c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */ 397c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG) 398c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 399c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 400c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef S_ISREG 401c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) 402c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 403c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 404c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef S_ISDIR 405c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR) 406c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 407c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 408c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 409c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef __cplusplus 410c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Move this down here since some C++ #include's don't like to be included 411c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel inside an extern "C" */ 412c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern "C" { 413c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 414c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 415c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 416c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Py_ARITHMETIC_RIGHT_SHIFT 417c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * C doesn't define whether a right-shift of a signed integer sign-extends 418c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * or zero-fills. Here a macro to force sign extension: 419c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) 420c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Return I >> J, forcing sign extension. Arithmetically, return the 421c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * floor of I/2**J. 422c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Requirements: 423c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * I should have signed integer type. In the terminology of C99, this can 424c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * be either one of the five standard signed integer types (signed char, 425c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * short, int, long, long long) or an extended signed integer type. 426c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * J is an integer >= 0 and strictly less than the number of bits in the 427c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * type of I (because C doesn't define what happens for J outside that 428c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * range either). 429c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * TYPE used to specify the type of I, but is now ignored. It's been left 430c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * in for backwards compatibility with versions <= 2.6 or 3.0. 431c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Caution: 432c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * I may be evaluated more than once. 433c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 434c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS 435c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \ 436c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel ((I) < 0 ? -1-((-1-(I)) >> (J)) : (I) >> (J)) 437c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 438c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J)) 439c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 440c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 441c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Py_FORCE_EXPANSION(X) 442c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * "Simply" returns its argument. However, macro expansions within the 443c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * argument are evaluated. This unfortunate trickery is needed to get 444c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * token-pasting to work as desired in some cases. 445c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 446c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_FORCE_EXPANSION(X) X 447c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 448c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) 449c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Cast VALUE to type NARROW from type WIDE. In Py_DEBUG mode, this 450c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * assert-fails if any information is lost. 451c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Caution: 452c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * VALUE may be evaluated more than once. 453c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 454c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef Py_DEBUG 455c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \ 456c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel (assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE)) 457c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 458c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE) 459c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 460c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 461c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Py_SET_ERRNO_ON_MATH_ERROR(x) 462c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * If a libm function did not set errno, but it looks like the result 463c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * overflowed or not-a-number, set errno to ERANGE or EDOM. Set errno 464c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * to 0 before calling a libm function, and invoke this macro after, 465c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * passing the function result. 466c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Caution: 467c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * This isn't reliable. See Py_OVERFLOWED comments. 468c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * X is evaluated more than once. 469c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 470c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(__FreeBSD__) || defined(__OpenBSD__) || (defined(__hpux) && defined(__ia64)) 471c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define _Py_SET_EDOM_FOR_NAN(X) if (isnan(X)) errno = EDOM; 472c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 473c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define _Py_SET_EDOM_FOR_NAN(X) ; 474c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 475c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_SET_ERRNO_ON_MATH_ERROR(X) \ 476c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel do { \ 477c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (errno == 0) { \ 478c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ 479c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel errno = ERANGE; \ 480c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else _Py_SET_EDOM_FOR_NAN(X) \ 481c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } \ 482c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } while(0) 483c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 484c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Py_SET_ERANGE_ON_OVERFLOW(x) 485c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * An alias of Py_SET_ERRNO_ON_MATH_ERROR for backward-compatibility. 486c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 487c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_SET_ERANGE_IF_OVERFLOW(X) Py_SET_ERRNO_ON_MATH_ERROR(X) 488c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 489c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Py_ADJUST_ERANGE1(x) 490c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Py_ADJUST_ERANGE2(x, y) 491c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Set errno to 0 before calling a libm function, and invoke one of these 492c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * macros after, passing the function result(s) (Py_ADJUST_ERANGE2 is useful 493c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * for functions returning complex results). This makes two kinds of 494c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * adjustments to errno: (A) If it looks like the platform libm set 495c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * errno=ERANGE due to underflow, clear errno. (B) If it looks like the 496c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * platform libm overflowed but didn't set errno, force errno to ERANGE. In 497c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * effect, we're trying to force a useful implementation of C89 errno 498c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * behavior. 499c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Caution: 500c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * This isn't reliable. See Py_OVERFLOWED comments. 501c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * X and Y may be evaluated more than once. 502c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 503c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_ADJUST_ERANGE1(X) \ 504c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel do { \ 505c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (errno == 0) { \ 506c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ 507c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel errno = ERANGE; \ 508c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } \ 509c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (errno == ERANGE && (X) == 0.0) \ 510c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel errno = 0; \ 511c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } while(0) 512c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 513c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_ADJUST_ERANGE2(X, Y) \ 514c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel do { \ 515c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL || \ 516c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel (Y) == Py_HUGE_VAL || (Y) == -Py_HUGE_VAL) { \ 517c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (errno == 0) \ 518c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel errno = ERANGE; \ 519c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } \ 520c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel else if (errno == ERANGE) \ 521c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel errno = 0; \ 522c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } while(0) 523c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 524c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* The functions _Py_dg_strtod and _Py_dg_dtoa in Python/dtoa.c (which are 525c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * required to support the short float repr introduced in Python 3.1) require 526c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * that the floating-point unit that's being used for arithmetic operations 527c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * on C doubles is set to use 53-bit precision. It also requires that the 528c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * FPU rounding mode is round-half-to-even, but that's less often an issue. 529c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 530c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * If your FPU isn't already set to 53-bit precision/round-half-to-even, and 531c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * you want to make use of _Py_dg_strtod and _Py_dg_dtoa, then you should 532c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 533c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * #define HAVE_PY_SET_53BIT_PRECISION 1 534c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 535c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * and also give appropriate definitions for the following three macros: 536c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 537c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * _PY_SET_53BIT_PRECISION_START : store original FPU settings, and 538c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * set FPU to 53-bit precision/round-half-to-even 539c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * _PY_SET_53BIT_PRECISION_END : restore original FPU settings 540c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * _PY_SET_53BIT_PRECISION_HEADER : any variable declarations needed to 541c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * use the two macros above. 542c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 543c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * The macros are designed to be used within a single C function: see 544c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Python/pystrtod.c for an example of their use. 545c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 546c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 547c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* get and set x87 control word for gcc/x86 */ 548c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_GCC_ASM_FOR_X87 549c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define HAVE_PY_SET_53BIT_PRECISION 1 550c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* _Py_get/set_387controlword functions are defined in Python/pymath.c */ 551c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define _Py_SET_53BIT_PRECISION_HEADER \ 552c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel unsigned short old_387controlword, new_387controlword 553c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define _Py_SET_53BIT_PRECISION_START \ 554c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel do { \ 555c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel old_387controlword = _Py_get_387controlword(); \ 556c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel new_387controlword = (old_387controlword & ~0x0f00) | 0x0200; \ 557c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (new_387controlword != old_387controlword) \ 558c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel _Py_set_387controlword(new_387controlword); \ 559c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } while (0) 560c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define _Py_SET_53BIT_PRECISION_END \ 561c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (new_387controlword != old_387controlword) \ 562c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel _Py_set_387controlword(old_387controlword) 563c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 564c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 565c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* get and set x87 control word for VisualStudio/x86 */ 566c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(_MSC_VER) && !defined(_WIN64) /* x87 not supported in 64-bit */ 567c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define HAVE_PY_SET_53BIT_PRECISION 1 568c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define _Py_SET_53BIT_PRECISION_HEADER \ 569c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel unsigned int old_387controlword, new_387controlword, out_387controlword 570c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* We use the __control87_2 function to set only the x87 control word. 571c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel The SSE control word is unaffected. */ 572c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define _Py_SET_53BIT_PRECISION_START \ 573c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel do { \ 574c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel __control87_2(0, 0, &old_387controlword, NULL); \ 575c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel new_387controlword = \ 576c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel (old_387controlword & ~(_MCW_PC | _MCW_RC)) | (_PC_53 | _RC_NEAR); \ 577c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (new_387controlword != old_387controlword) \ 578c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel __control87_2(new_387controlword, _MCW_PC | _MCW_RC, \ 579c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel &out_387controlword, NULL); \ 580c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } while (0) 581c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define _Py_SET_53BIT_PRECISION_END \ 582c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel do { \ 583c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if (new_387controlword != old_387controlword) \ 584c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel __control87_2(old_387controlword, _MCW_PC | _MCW_RC, \ 585c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel &out_387controlword, NULL); \ 586c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel } while (0) 587c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 588c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 589c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* default definitions are empty */ 590c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef HAVE_PY_SET_53BIT_PRECISION 591c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define _Py_SET_53BIT_PRECISION_HEADER 592c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define _Py_SET_53BIT_PRECISION_START 593c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define _Py_SET_53BIT_PRECISION_END 594c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 595c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 596c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* If we can't guarantee 53-bit precision, don't use the code 597c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel in Python/dtoa.c, but fall back to standard code. This 598c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel means that repr of a float will be long (17 sig digits). 599c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 600c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel Realistically, there are two things that could go wrong: 601c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 602c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel (1) doubles aren't IEEE 754 doubles, or 603c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel (2) we're on x86 with the rounding precision set to 64-bits 604c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel (extended precision), and we don't know how to change 605c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel the rounding precision. 606c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 607c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 608c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if !defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) && \ 609c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel !defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) && \ 610c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel !defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754) 611c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_NO_SHORT_FLOAT_REPR 612c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 613c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 614c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* double rounding is symptomatic of use of extended precision on x86. If 615c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel we're seeing double rounding, and we don't have any mechanism available for 616c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel changing the FPU rounding precision, then don't use Python/dtoa.c. */ 617c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(X87_DOUBLE_ROUNDING) && !defined(HAVE_PY_SET_53BIT_PRECISION) 618c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define PY_NO_SHORT_FLOAT_REPR 619c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 620c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 621c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Py_DEPRECATED(version) 622c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Declare a variable, type, or function deprecated. 623c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Usage: 624c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * extern int old_var Py_DEPRECATED(2.3); 625c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * typedef int T1 Py_DEPRECATED(2.4); 626c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * extern int x() Py_DEPRECATED(2.5); 627c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 628c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(__GNUC__) && ((__GNUC__ >= 4) || \ 629c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) 630c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__)) 631c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 632c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_DEPRECATED(VERSION_UNUSED) 633c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 634c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 635c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/************************************************************************** 636c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPrototypes that are missing from the standard include files on some systems 637c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel(and possibly only some versions of such systems.) 638c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 639c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielPlease be conservative with adding new ones, document them and enclose them 640c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielin platform-specific #ifdefs. 641c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel**************************************************************************/ 642c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 643c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef SOLARIS 644c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Unchecked */ 645c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern int gethostname(char *, int); 646c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 647c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 648c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef __BEOS__ 649c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Unchecked */ 650c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* It's in the libs, but not the headers... - [cjh] */ 651c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielint shutdown( int, int ); 652c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 653c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 654c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE__GETPTY 655c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <sys/types.h> /* we need to import mode_t */ 656c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern char * _getpty(int *, int, mode_t, int); 657c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 658c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 659c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* On QNX 6, struct termio must be declared by including sys/termio.h 660c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel if TCGETA, TCSETA, TCSETAW, or TCSETAF are used. sys/termio.h must 661c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel be included before termios.h or it will generate an error. */ 662c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(HAVE_SYS_TERMIO_H) && !defined(__hpux) 663c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <sys/termio.h> 664c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 665c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 666c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) 667c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) && !defined(HAVE_UTIL_H) 668c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* BSDI does not supply a prototype for the 'openpty' and 'forkpty' 669c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel functions, even though they are included in libutil. */ 670c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <termios.h> 671c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern int openpty(int *, int *, char *, struct termios *, struct winsize *); 672c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern pid_t forkpty(int *, char *, struct termios *, struct winsize *); 673c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) */ 674c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */ 675c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 676c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 677c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* These are pulled from various places. It isn't obvious on what platforms 678c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel they are necessary, nor what the exact prototype should look like (which 679c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel is likely to vary between platforms!) If you find you need one of these 680c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel declarations, please move them to a platform-specific block and include 681c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel proper prototypes. */ 682c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if 0 683c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 684c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* From Modules/resource.c */ 685c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern int getrusage(); 686c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern int getpagesize(); 687c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 688c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* From Python/sysmodule.c and Modules/posixmodule.c */ 689c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern int fclose(FILE *); 690c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 691c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* From Modules/posixmodule.c */ 692c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanielextern int fdatasync(int); 693c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* 0 */ 694c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 695c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 696c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* On 4.4BSD-descendants, ctype functions serves the whole range of 697c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * wchar_t character set rather than single byte code points only. 698c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * This characteristic can break some operations of string object 699c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * including str.upper() and str.split() on UTF-8 locales. This 700c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * workaround was provided by Tim Robbins of FreeBSD project. 701c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 702c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 703c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef __FreeBSD__ 704c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <osreldate.h> 705c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if __FreeBSD_version > 500039 706c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define _PY_PORT_CTYPE_UTF8_ISSUE 707c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 708c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 709c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 710c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 711c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(__APPLE__) 712c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define _PY_PORT_CTYPE_UTF8_ISSUE 713c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 714c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 715c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef _PY_PORT_CTYPE_UTF8_ISSUE 716c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <ctype.h> 717c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#include <wctype.h> 718c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef isalnum 719c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define isalnum(c) iswalnum(btowc(c)) 720c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef isalpha 721c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define isalpha(c) iswalpha(btowc(c)) 722c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef islower 723c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define islower(c) iswlower(btowc(c)) 724c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef isspace 725c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define isspace(c) iswspace(btowc(c)) 726c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef isupper 727c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define isupper(c) iswupper(btowc(c)) 728c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef tolower 729c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define tolower(c) towlower(btowc(c)) 730c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#undef toupper 731c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define toupper(c) towupper(btowc(c)) 732c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 733c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 734c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 735c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Declarations for symbol visibility. 736c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 737c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyAPI_FUNC(type): Declares a public Python API function and return type 738c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyAPI_DATA(type): Declares public Python data and its type 739c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel PyMODINIT_FUNC: A Python module init function. If these functions are 740c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel inside the Python core, they are private to the core. 741c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel If in an extension module, it may be declared with 742c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel external linkage depending on the platform. 743c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 744c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel As a number of platforms support/require "__declspec(dllimport/dllexport)", 745c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel we support a HAVE_DECLSPEC_DLL macro to save duplication. 746c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/ 747c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 748c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* 749c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel All windows ports, except cygwin, are handled in PC/pyconfig.h. 750c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 751c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel BeOS and cygwin are the only other autoconf platform requiring special 752c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel linkage handling and both of these use __declspec(). 753c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel*/ 754c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(__CYGWIN__) || defined(__BEOS__) 755c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define HAVE_DECLSPEC_DLL 756c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 757c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 758c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* only get special linkage if built as shared or platform is Cygwin */ 759c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__) 760c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# if defined(HAVE_DECLSPEC_DLL) 761c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# ifdef Py_BUILD_CORE 762c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE 763c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE 764c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* module init functions inside the core need no external linkage */ 765c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* except for Cygwin to handle embedding (FIXME: BeOS too?) */ 766c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# if defined(__CYGWIN__) 767c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PyMODINIT_FUNC __declspec(dllexport) void 768c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# else /* __CYGWIN__ */ 769c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PyMODINIT_FUNC void 770c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# endif /* __CYGWIN__ */ 771c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# else /* Py_BUILD_CORE */ 772c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Building an extension module, or an embedded situation */ 773c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* public Python functions and data are imported */ 774c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* Under Cygwin, auto-import functions to prevent compilation */ 775c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* failures similar to those described at the bottom of 4.1: */ 776c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ 777c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# if !defined(__CYGWIN__) 778c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE 779c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# endif /* !__CYGWIN__ */ 780c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE 781c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel /* module init functions outside the core must be exported */ 782c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# if defined(__cplusplus) 783c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PyMODINIT_FUNC extern "C" __declspec(dllexport) void 784c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# else /* __cplusplus */ 785c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PyMODINIT_FUNC __declspec(dllexport) void 786c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# endif /* __cplusplus */ 787c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# endif /* Py_BUILD_CORE */ 788c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# endif /* HAVE_DECLSPEC */ 789c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* Py_ENABLE_SHARED */ 790c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 791c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* If no external linkage macros defined by now, create defaults */ 792c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef PyAPI_FUNC 793c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PyAPI_FUNC(RTYPE) RTYPE 794c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 795c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef PyAPI_DATA 796c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PyAPI_DATA(RTYPE) extern RTYPE 797c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 798c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef PyMODINIT_FUNC 799c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# if defined(__cplusplus) 800c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PyMODINIT_FUNC extern "C" void 801c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# else /* __cplusplus */ 802c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define PyMODINIT_FUNC void 803c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# endif /* __cplusplus */ 804c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 805c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 806c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Deprecated DL_IMPORT and DL_EXPORT macros */ 807c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(Py_ENABLE_SHARED) && defined (HAVE_DECLSPEC_DLL) 808c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# if defined(Py_BUILD_CORE) 809c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define DL_IMPORT(RTYPE) __declspec(dllexport) RTYPE 810c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE 811c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# else 812c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define DL_IMPORT(RTYPE) __declspec(dllimport) RTYPE 813c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE 814c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# endif 815c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 816c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef DL_EXPORT 817c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define DL_EXPORT(RTYPE) RTYPE 818c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 819c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef DL_IMPORT 820c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel# define DL_IMPORT(RTYPE) RTYPE 821c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 822c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* End of deprecated DL_* macros */ 823c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 824c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* If the fd manipulation macros aren't defined, 825c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel here is a set that should do the job */ 826c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 827c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if 0 /* disabled and probably obsolete */ 828c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 829c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef FD_SETSIZE 830c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define FD_SETSIZE 256 831c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 832c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 833c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef FD_SET 834c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 835c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef long fd_mask; 836c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 837c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */ 838c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef howmany 839c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define howmany(x, y) (((x)+((y)-1))/(y)) 840c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* howmany */ 841c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 842c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDanieltypedef struct fd_set { 843c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)]; 844c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} fd_set; 845c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 846c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) 847c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) 848c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) 849c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define FD_ZERO(p) memset((char *)(p), '\0', sizeof(*(p))) 850c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 851c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* FD_SET */ 852c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 853c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* fd manipulation macros */ 854c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 855c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 856c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* limits.h constants that may be missing */ 857c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 858c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef INT_MAX 859c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define INT_MAX 2147483647 860c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 861c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 862c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef LONG_MAX 863c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if SIZEOF_LONG == 4 864c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define LONG_MAX 0X7FFFFFFFL 865c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#elif SIZEOF_LONG == 8 866c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define LONG_MAX 0X7FFFFFFFFFFFFFFFL 867c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 868c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#error "could not set LONG_MAX in pyport.h" 869c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 870c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 871c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 872c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef LONG_MIN 873c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define LONG_MIN (-LONG_MAX-1) 874c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 875c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 876c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef LONG_BIT 877c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define LONG_BIT (8 * SIZEOF_LONG) 878c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 879c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 880c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if LONG_BIT != 8 * SIZEOF_LONG 881c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* 04-Oct-2000 LONG_BIT is apparently (mis)defined as 64 on some recent 882c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * 32-bit platforms using gcc. We try to catch that here at compile-time 883c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * rather than waiting for integer multiplication to trigger bogus 884c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * overflows. 885c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 886c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)." 887c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 888c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 889c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef __cplusplus 890c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel} 891c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 892c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 893c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* 894c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Hide GCC attributes from compilers that don't support them. 895c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 896c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if (!defined(__GNUC__) || __GNUC__ < 2 || \ 897c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel (__GNUC__ == 2 && __GNUC_MINOR__ < 7) ) && \ 898c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel !defined(RISCOS) 899c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_GCC_ATTRIBUTE(x) 900c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 901c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_GCC_ATTRIBUTE(x) __attribute__(x) 902c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 903c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 904c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* 905c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Add PyArg_ParseTuple format where available. 906c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 907c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef HAVE_ATTRIBUTE_FORMAT_PARSETUPLE 908c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_FORMAT_PARSETUPLE(func,p1,p2) __attribute__((format(func,p1,p2))) 909c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 910c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_FORMAT_PARSETUPLE(func,p1,p2) 911c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 912c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 913c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* 914c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Specify alignment on compilers that support it. 915c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 916c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#if defined(__GNUC__) && __GNUC__ >= 3 917c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_ALIGNED(x) __attribute__((aligned(x))) 918c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#else 919c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_ALIGNED(x) 920c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 921c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 922c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* Eliminate end-of-loop code not reached warnings from SunPro C 923c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * when using do{...}while(0) macros 924c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 925c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifdef __SUNPRO_C 926c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#pragma error_messages (off,E_END_OF_LOOP_CODE_NOT_REACHED) 927c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 928c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 929c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel/* 930c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * Older Microsoft compilers don't support the C99 long long literal suffixes, 931c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel * so these will be defined in PC/pyconfig.h for those compilers. 932c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel */ 933c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef Py_LL 934c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_LL(x) x##LL 935c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 936c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 937c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#ifndef Py_ULL 938c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#define Py_ULL(x) Py_LL(x##U) 939c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif 940c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel 941c8042e10763bca064df257547d04ae3dfcdfaf91Daryl McDaniel#endif /* Py_PYPORT_H */ 942