14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/** @file 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Symbols and macros to supply platform-independent interfaces to basic 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm C language & library operations whose spellings vary across platforms. 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Copyright (c) 2011, Intel Corporation. All rights reserved.<BR> 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm This program and the accompanying materials are licensed and made available under 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm the terms and conditions of the BSD License that accompanies this distribution. 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The full text of the license may be found at 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm http://opensource.org/licenses/bsd-license. 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm**/ 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef Py_PYPORT_H 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_PYPORT_H 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "pyconfig.h" /* include for defines */ 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Some versions of HP-UX & Solaris need inttypes.h for int32_t, 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm INT32_MAX, etc. */ 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_INTTYPES_H 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <inttypes.h> 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_STDINT_H 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <stdint.h> 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/************************************************************************** 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSymbols and macros to supply platform-independent interfaces to basic 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmC language & library operations whose spellings vary across platforms. 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPlease try to make documentation here as clear as possible: by definition, 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmthe stuff here is trying to illuminate C's darkest corners. 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmConfig #defines referenced here: 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmSIGNED_RIGHT_SHIFT_ZERO_FILLS 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmMeaning: To be defined iff i>>j does not extend the sign bit when i is a 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm signed integral type and i < 0. 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUsed in: Py_ARITHMETIC_RIGHT_SHIFT 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPy_DEBUG 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmMeaning: Extra checks compiled in for debug mode. 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUsed in: Py_SAFE_DOWNCAST 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmHAVE_UINTPTR_T 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmMeaning: The C9X type uintptr_t is supported by the compiler 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUsed in: Py_uintptr_t 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmHAVE_LONG_LONG 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmMeaning: The compiler supports the C type "long long" 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmUsed in: PY_LONG_LONG 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm**************************************************************************/ 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* For backward compatibility only. Obsolete, do not use. */ 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_PROTOTYPES 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_PROTO(x) x 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_PROTO(x) () 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef Py_FPROTO 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_FPROTO(x) Py_PROTO(x) 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* typedefs for some C9X-defined synonyms for integral types. 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * The names in Python are exactly the same as the C9X names, except with a 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Py_ prefix. Until C9X is universally implemented, this is the only way 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * to ensure that Python gets reliable names that don't conflict with names 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * in non-Python code that are playing their own tricks to define the C9X 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * names. 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * NOTE: don't go nuts here! Python has no use for *most* of the C9X 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * integral synonyms. Only define the ones we actually need. 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef PY_LONG_LONG 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_LONG_LONG long long 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(LLONG_MAX) 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* If LLONG_MAX is defined in limits.h, use that. */ 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_LLONG_MIN LLONG_MIN 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_LLONG_MAX LLONG_MAX 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_ULLONG_MAX ULLONG_MAX 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(__LONG_LONG_MAX__) 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Otherwise, if GCC has a builtin define, use that. */ 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_LLONG_MAX __LONG_LONG_MAX__ 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_LLONG_MIN (-PY_LLONG_MAX-1) 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_ULLONG_MAX (__LONG_LONG_MAX__*2ULL + 1ULL) 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Otherwise, rely on two's complement. */ 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_ULLONG_MAX (~0ULL) 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_LLONG_MAX ((long long)(PY_ULLONG_MAX>>1)) 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_LLONG_MIN (-PY_LLONG_MAX-1) 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* LLONG_MAX */ 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* HAVE_LONG_LONG */ 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* a build with 30-bit digits for Python long integers needs an exact-width 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 32-bit unsigned integer type to store those digits. (We could just use 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * type 'unsigned long', but that would be wasteful on a system where longs 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * are 64-bits.) On Unix systems, the autoconf macro AC_TYPE_UINT32_T defines 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * uint32_t to be such a type unless stdint.h or inttypes.h defines uint32_t. 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * However, it doesn't set HAVE_UINT32_T, so we do that here. 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if (defined UINT32_MAX || defined uint32_t) 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef PY_UINT32_T 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define HAVE_UINT32_T 1 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_UINT32_T uint32_t 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Macros for a 64-bit unsigned integer type; used for type 'twodigits' in the 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * long integer implementation, when 30-bit digits are enabled. 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if (defined UINT64_MAX || defined uint64_t) 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef PY_UINT64_T 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define HAVE_UINT64_T 1 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_UINT64_T uint64_t 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Signed variants of the above */ 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if (defined INT32_MAX || defined int32_t) 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef PY_INT32_T 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define HAVE_INT32_T 1 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_INT32_T int32_t 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if (defined INT64_MAX || defined int64_t) 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef PY_INT64_T 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define HAVE_INT64_T 1 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_INT64_T int64_t 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* If PYLONG_BITS_IN_DIGIT is not defined then we'll use 30-bit digits if all 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm the necessary integer types are available, and we're on a 64-bit platform 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (as determined by SIZEOF_VOID_P); otherwise we use 15-bit digits. */ 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef PYLONG_BITS_IN_DIGIT 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if (defined HAVE_UINT64_T && defined HAVE_INT64_T && \ 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm defined HAVE_UINT32_T && defined HAVE_INT32_T && SIZEOF_VOID_P >= 8) 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PYLONG_BITS_IN_DIGIT 30 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PYLONG_BITS_IN_DIGIT 15 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* uintptr_t is the C9X name for an unsigned integral type such that a 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * legitimate void* can be cast to uintptr_t and then back to void* again 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * without loss of information. Similarly for intptr_t, wrt a signed 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * integral type. 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_UINTPTR_T 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef uintptr_t Py_uintptr_t; 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef intptr_t Py_intptr_t; 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif SIZEOF_VOID_P <= SIZEOF_INT 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef unsigned int Py_uintptr_t; 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef int Py_intptr_t; 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif SIZEOF_VOID_P <= SIZEOF_LONG 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef unsigned long Py_uintptr_t; 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef long Py_intptr_t; 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(HAVE_LONG_LONG) && (SIZEOF_VOID_P <= SIZEOF_LONG_LONG) 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef unsigned PY_LONG_LONG Py_uintptr_t; 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef PY_LONG_LONG Py_intptr_t; 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# error "Python needs a typedef for Py_uintptr_t in pyport.h." 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* HAVE_UINTPTR_T */ 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Py_ssize_t is a signed integral type such that sizeof(Py_ssize_t) == 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * sizeof(size_t). C99 doesn't define such a thing directly (size_t is an 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * unsigned integral type). See PEP 353 for details. 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SSIZE_T 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef ssize_t Py_ssize_t; 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif SIZEOF_VOID_P == SIZEOF_SIZE_T 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef Py_intptr_t Py_ssize_t; 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# error "Python needs a typedef for Py_ssize_t in pyport.h." 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Largest possible value of size_t. 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SIZE_MAX is part of C99, so it might be defined on some 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm platforms. If it is not defined, (size_t)-1 is a portable 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm definition for C89, due to the way signed->unsigned 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm conversion is defined. */ 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef SIZE_MAX 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_SIZE_MAX SIZE_MAX 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_SIZE_MAX ((size_t)-1) 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Largest positive value of type Py_ssize_t. */ 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_SSIZE_T_MAX ((Py_ssize_t)(((size_t)-1)>>1)) 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Smallest negative value of type Py_ssize_t. */ 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1) 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if SIZEOF_PID_T > SIZEOF_LONG 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# error "Python doesn't support sizeof(pid_t) > sizeof(long)" 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * format to convert an argument with the width of a size_t or Py_ssize_t. 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * C99 introduced "z" for this purpose, but not all platforms support that; 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * e.g., MS compilers use "I" instead. 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * These "high level" Python format functions interpret "z" correctly on 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * all platforms (Python interprets the format string itself, and does whatever 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the platform C requires to convert a size_t/Py_ssize_t argument): 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * PyString_FromFormat 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * PyErr_Format 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * PyString_FromFormatV 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Lower-level uses require that you interpolate the correct format modifier 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * yourself (e.g., calling printf, fprintf, sprintf, PyOS_snprintf); for 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * example, 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Py_ssize_t index; 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * fprintf(stderr, "index %" PY_FORMAT_SIZE_T "d sucks\n", index); 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * That will expand to %ld, or %Id, or to something else correct for a 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Py_ssize_t on the platform. 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef PY_FORMAT_SIZE_T 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# if SIZEOF_SIZE_T == SIZEOF_INT && !defined(__APPLE__) 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PY_FORMAT_SIZE_T "" 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# elif SIZEOF_SIZE_T == SIZEOF_LONG 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PY_FORMAT_SIZE_T "l" 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# elif defined(MS_WINDOWS) 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PY_FORMAT_SIZE_T "I" 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# else 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# error "This platform's pyconfig.h needs to define PY_FORMAT_SIZE_T" 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# endif 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* PY_FORMAT_LONG_LONG is analogous to PY_FORMAT_SIZE_T above, but for 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * the long long type instead of the size_t type. It's only available 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * when HAVE_LONG_LONG is defined. The "high level" Python format 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * functions listed above will interpret "lld" or "llu" correctly on 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * all platforms. 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_LONG_LONG 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ifndef PY_FORMAT_LONG_LONG 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# if defined(MS_WIN64) || defined(MS_WINDOWS) 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PY_FORMAT_LONG_LONG "I64" 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# else 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# error "This platform's pyconfig.h needs to define PY_FORMAT_LONG_LONG" 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# endif 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# endif 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Py_LOCAL can be used instead of static to get the fastest possible calling 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * convention for functions that are local to a given module. 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Py_LOCAL_INLINE does the same thing, and also explicitly requests inlining, 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * for platforms that support that. 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * If PY_LOCAL_AGGRESSIVE is defined before python.h is included, more 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * "aggressive" inlining/optimizaion is enabled for the entire module. This 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * may lead to code bloat, and may slow things down for those reasons. It may 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * also lead to errors, if the code relies on pointer aliasing. Use with 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * care. 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * NOTE: You can only use this for functions that are entirely local to a 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * module; functions that are exported via method tables, callbacks, etc, 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * should keep using static. 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef USE_INLINE /* XXX - set via configure? */ 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(_MSC_VER) 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(PY_LOCAL_AGGRESSIVE) 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* enable more aggressive optimization for visual studio */ 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm//#pragma optimize("agtw", on) 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#pragma optimize("gt", on) // a and w are not legal for VS2005 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* ignore warnings if the compiler decides not to inline a function */ 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#pragma warning(disable: 4710) 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* fastest possible local call under MSVC */ 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_LOCAL(type) static type __fastcall 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_LOCAL_INLINE(type) static __inline type __fastcall 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(USE_INLINE) 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_LOCAL(type) static type 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_LOCAL_INLINE(type) static inline type 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_LOCAL(type) static type 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_LOCAL_INLINE(type) static type 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Py_MEMCPY can be used instead of memcpy in cases where the copied blocks 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * are often very short. While most platforms have highly optimized code for 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * large transfers, the setup costs for memcpy are often quite high. MEMCPY 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * solves this by doing short copies "in line". 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(_MSC_VER) 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_MEMCPY(target, source, length) do { \ 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size_t i_, n_ = (length); \ 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm char *t_ = (void*) (target); \ 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm const char *s_ = (void*) (source); \ 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (n_ >= 16) \ 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm memcpy(t_, s_, n_); \ 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else \ 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for (i_ = 0; i_ < n_; i_++) \ 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm t_[i_] = s_[i_]; \ 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } while (0) 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_MEMCPY memcpy 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <stdlib.h> 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_IEEEFP_H 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <ieeefp.h> /* needed for 'finite' declaration on some platforms */ 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <math.h> /* Moved here from the math section, before extern "C" */ 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/******************************************** 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * WRAPPER FOR <time.h> and/or <sys/time.h> * 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ********************************************/ 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef TIME_WITH_SYS_TIME 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <sys/time.h> 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <time.h> 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else /* !TIME_WITH_SYS_TIME */ 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SYS_TIME_H 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <sys/time.h> 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else /* !HAVE_SYS_TIME_H */ 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <time.h> 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* !HAVE_SYS_TIME_H */ 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* !TIME_WITH_SYS_TIME */ 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/****************************** 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * WRAPPER FOR <sys/select.h> * 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ******************************/ 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* NB caller must include <sys/types.h> */ 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SYS_SELECT_H 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <sys/select.h> 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* !HAVE_SYS_SELECT_H */ 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/******************************* 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * stat() and fstat() fiddling * 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm *******************************/ 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* We expect that stat and fstat exist on most systems. 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * It's confirmed on Unix, Mac and Windows. 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * If you don't have them, add 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * #define DONT_HAVE_STAT 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * and/or 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * #define DONT_HAVE_FSTAT 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * to your pyconfig.h. Python code beyond this should check HAVE_STAT and 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * HAVE_FSTAT instead. 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Also 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * #define HAVE_SYS_STAT_H 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * if <sys/stat.h> exists on your platform, and 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * #define HAVE_STAT_H 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * if <stat.h> does. 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef DONT_HAVE_STAT 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define HAVE_STAT 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef DONT_HAVE_FSTAT 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define HAVE_FSTAT 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef RISCOS 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <sys/types.h> 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include "unixstuff.h" 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SYS_STAT_H 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(PYOS_OS2) && defined(PYCC_GCC) 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <sys/types.h> 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <sys/stat.h> 3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif defined(HAVE_STAT_H) 3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <stat.h> 3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(PYCC_VACPP) 3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* VisualAge C/C++ Failed to Define MountType Field in sys/stat.h */ 3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define S_IFMT (S_IFDIR|S_IFCHR|S_IFREG) 3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef S_ISREG 4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) 4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef S_ISDIR 4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR) 4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __cplusplus 4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Move this down here since some C++ #include's don't like to be included 4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm inside an extern "C" */ 4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern "C" { 4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Py_ARITHMETIC_RIGHT_SHIFT 4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * C doesn't define whether a right-shift of a signed integer sign-extends 4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * or zero-fills. Here a macro to force sign extension: 4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) 4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Return I >> J, forcing sign extension. Arithmetically, return the 4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * floor of I/2**J. 4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Requirements: 4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * I should have signed integer type. In the terminology of C99, this can 4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * be either one of the five standard signed integer types (signed char, 4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * short, int, long, long long) or an extended signed integer type. 4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * J is an integer >= 0 and strictly less than the number of bits in the 4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * type of I (because C doesn't define what happens for J outside that 4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * range either). 4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * TYPE used to specify the type of I, but is now ignored. It's been left 4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * in for backwards compatibility with versions <= 2.6 or 3.0. 4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Caution: 4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * I may be evaluated more than once. 4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS 4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \ 4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ((I) < 0 ? -1-((-1-(I)) >> (J)) : (I) >> (J)) 4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J)) 4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Py_FORCE_EXPANSION(X) 4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * "Simply" returns its argument. However, macro expansions within the 4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * argument are evaluated. This unfortunate trickery is needed to get 4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * token-pasting to work as desired in some cases. 4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_FORCE_EXPANSION(X) X 4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) 4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Cast VALUE to type NARROW from type WIDE. In Py_DEBUG mode, this 4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * assert-fails if any information is lost. 4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Caution: 4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * VALUE may be evaluated more than once. 4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef Py_DEBUG 4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \ 4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE)) 4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE) 4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Py_SET_ERRNO_ON_MATH_ERROR(x) 4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * If a libm function did not set errno, but it looks like the result 4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * overflowed or not-a-number, set errno to ERANGE or EDOM. Set errno 4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * to 0 before calling a libm function, and invoke this macro after, 4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * passing the function result. 4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Caution: 4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * This isn't reliable. See Py_OVERFLOWED comments. 4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * X is evaluated more than once. 4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(__FreeBSD__) || defined(__OpenBSD__) || (defined(__hpux) && defined(__ia64)) 4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _Py_SET_EDOM_FOR_NAN(X) if (isnan(X)) errno = EDOM; 4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _Py_SET_EDOM_FOR_NAN(X) ; 4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_SET_ERRNO_ON_MATH_ERROR(X) \ 4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm do { \ 4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (errno == 0) { \ 4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ 4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errno = ERANGE; \ 4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else _Py_SET_EDOM_FOR_NAN(X) \ 4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } \ 4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } while(0) 4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Py_SET_ERANGE_ON_OVERFLOW(x) 4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * An alias of Py_SET_ERRNO_ON_MATH_ERROR for backward-compatibility. 4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_SET_ERANGE_IF_OVERFLOW(X) Py_SET_ERRNO_ON_MATH_ERROR(X) 4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Py_ADJUST_ERANGE1(x) 4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Py_ADJUST_ERANGE2(x, y) 4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Set errno to 0 before calling a libm function, and invoke one of these 4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * macros after, passing the function result(s) (Py_ADJUST_ERANGE2 is useful 4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * for functions returning complex results). This makes two kinds of 4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * adjustments to errno: (A) If it looks like the platform libm set 4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * errno=ERANGE due to underflow, clear errno. (B) If it looks like the 4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * platform libm overflowed but didn't set errno, force errno to ERANGE. In 4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * effect, we're trying to force a useful implementation of C89 errno 4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * behavior. 5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Caution: 5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * This isn't reliable. See Py_OVERFLOWED comments. 5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * X and Y may be evaluated more than once. 5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_ADJUST_ERANGE1(X) \ 5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm do { \ 5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (errno == 0) { \ 5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL) \ 5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errno = ERANGE; \ 5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } \ 5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (errno == ERANGE && (X) == 0.0) \ 5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errno = 0; \ 5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } while(0) 5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_ADJUST_ERANGE2(X, Y) \ 5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm do { \ 5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if ((X) == Py_HUGE_VAL || (X) == -Py_HUGE_VAL || \ 5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (Y) == Py_HUGE_VAL || (Y) == -Py_HUGE_VAL) { \ 5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (errno == 0) \ 5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errno = ERANGE; \ 5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } \ 5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else if (errno == ERANGE) \ 5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm errno = 0; \ 5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } while(0) 5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* The functions _Py_dg_strtod and _Py_dg_dtoa in Python/dtoa.c (which are 5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * required to support the short float repr introduced in Python 3.1) require 5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * that the floating-point unit that's being used for arithmetic operations 5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * on C doubles is set to use 53-bit precision. It also requires that the 5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * FPU rounding mode is round-half-to-even, but that's less often an issue. 5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * If your FPU isn't already set to 53-bit precision/round-half-to-even, and 5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * you want to make use of _Py_dg_strtod and _Py_dg_dtoa, then you should 5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * #define HAVE_PY_SET_53BIT_PRECISION 1 5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * and also give appropriate definitions for the following three macros: 5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * _PY_SET_53BIT_PRECISION_START : store original FPU settings, and 5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * set FPU to 53-bit precision/round-half-to-even 5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * _PY_SET_53BIT_PRECISION_END : restore original FPU settings 5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * _PY_SET_53BIT_PRECISION_HEADER : any variable declarations needed to 5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * use the two macros above. 5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * The macros are designed to be used within a single C function: see 5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Python/pystrtod.c for an example of their use. 5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* get and set x87 control word for gcc/x86 */ 5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_GCC_ASM_FOR_X87 5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define HAVE_PY_SET_53BIT_PRECISION 1 5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* _Py_get/set_387controlword functions are defined in Python/pymath.c */ 5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _Py_SET_53BIT_PRECISION_HEADER \ 5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unsigned short old_387controlword, new_387controlword 5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _Py_SET_53BIT_PRECISION_START \ 5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm do { \ 5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm old_387controlword = _Py_get_387controlword(); \ 5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm new_387controlword = (old_387controlword & ~0x0f00) | 0x0200; \ 5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (new_387controlword != old_387controlword) \ 5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _Py_set_387controlword(new_387controlword); \ 5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm } while (0) 5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _Py_SET_53BIT_PRECISION_END \ 5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if (new_387controlword != old_387controlword) \ 5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _Py_set_387controlword(old_387controlword) 5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* default definitions are empty */ 5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef HAVE_PY_SET_53BIT_PRECISION 5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _Py_SET_53BIT_PRECISION_HEADER 5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _Py_SET_53BIT_PRECISION_START 5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define _Py_SET_53BIT_PRECISION_END 5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* If we can't guarantee 53-bit precision, don't use the code 5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm in Python/dtoa.c, but fall back to standard code. This 5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm means that repr of a float will be long (17 sig digits). 5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Realistically, there are two things that could go wrong: 5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (1) doubles aren't IEEE 754 doubles, or 5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (2) we're on x86 with the rounding precision set to 64-bits 5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (extended precision), and we don't know how to change 5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm the rounding precision. 5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(DOUBLE_IS_LITTLE_ENDIAN_IEEE754) && \ 5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm !defined(DOUBLE_IS_BIG_ENDIAN_IEEE754) && \ 5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm !defined(DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754) 5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_NO_SHORT_FLOAT_REPR 5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* double rounding is symptomatic of use of extended precision on x86. If 5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm we're seeing double rounding, and we don't have any mechanism available for 5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm changing the FPU rounding precision, then don't use Python/dtoa.c. */ 5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(X87_DOUBLE_ROUNDING) && !defined(HAVE_PY_SET_53BIT_PRECISION) 5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define PY_NO_SHORT_FLOAT_REPR 5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Py_DEPRECATED(version) 5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Declare a variable, type, or function deprecated. 6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Usage: 6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * extern int old_var Py_DEPRECATED(2.3); 6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * typedef int T1 Py_DEPRECATED(2.4); 6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * extern int x() Py_DEPRECATED(2.5); 6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(__GNUC__) && ((__GNUC__ >= 4) || \ 6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)) 6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__)) 6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_DEPRECATED(VERSION_UNUSED) 6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/************************************************************************** 6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPrototypes that are missing from the standard include files on some systems 6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm(and possibly only some versions of such systems.) 6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmPlease be conservative with adding new ones, document them and enclose them 6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmin platform-specific #ifdefs. 6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm**************************************************************************/ 6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef SOLARIS 6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Unchecked */ 6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern int gethostname(char *, int); 6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __BEOS__ 6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Unchecked */ 6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* It's in the libs, but not the headers... - [cjh] */ 6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmint shutdown( int, int ); 6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE__GETPTY 6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <sys/types.h> /* we need to import mode_t */ 6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern char * _getpty(int *, int, mode_t, int); 6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* On QNX 6, struct termio must be declared by including sys/termio.h 6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if TCGETA, TCSETA, TCSETAW, or TCSETAF are used. sys/termio.h must 6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm be included before termios.h or it will generate an error. */ 6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_SYS_TERMIO_H 6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <sys/termio.h> 6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) 6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) && !defined(HAVE_UTIL_H) 6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* BSDI does not supply a prototype for the 'openpty' and 'forkpty' 6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm functions, even though they are included in libutil. */ 6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <termios.h> 6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern int openpty(int *, int *, char *, struct termios *, struct winsize *); 6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern pid_t forkpty(int *, char *, struct termios *, struct winsize *); 6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) */ 6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */ 6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* These are pulled from various places. It isn't obvious on what platforms 6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm they are necessary, nor what the exact prototype should look like (which 6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm is likely to vary between platforms!) If you find you need one of these 6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm declarations, please move them to a platform-specific block and include 6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm proper prototypes. */ 6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if 0 6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* From Modules/resource.c */ 6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern int getrusage(); 6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern int getpagesize(); 6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* From Python/sysmodule.c and Modules/posixmodule.c */ 6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern int fclose(FILE *); 6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* From Modules/posixmodule.c */ 6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmextern int fdatasync(int); 6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* 0 */ 6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* On 4.4BSD-descendants, ctype functions serves the whole range of 6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * wchar_t character set rather than single byte code points only. 6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * This characteristic can break some operations of string object 6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * including str.upper() and str.split() on UTF-8 locales. This 6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * workaround was provided by Tim Robbins of FreeBSD project. 6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __FreeBSD__ 6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <osreldate.h> 6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if __FreeBSD_version > 500039 6834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define _PY_PORT_CTYPE_UTF8_ISSUE 6844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 6854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 6864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(__APPLE__) 6894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define _PY_PORT_CTYPE_UTF8_ISSUE 6904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 6914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef _PY_PORT_CTYPE_UTF8_ISSUE 6934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <ctype.h> 6944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#include <wctype.h> 6954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef isalnum 6964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define isalnum(c) iswalnum(btowc(c)) 6974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef isalpha 6984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define isalpha(c) iswalpha(btowc(c)) 6994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef islower 7004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define islower(c) iswlower(btowc(c)) 7014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef isspace 7024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define isspace(c) iswspace(btowc(c)) 7034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef isupper 7044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define isupper(c) iswupper(btowc(c)) 7054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef tolower 7064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define tolower(c) towlower(btowc(c)) 7074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#undef toupper 7084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define toupper(c) towupper(btowc(c)) 7094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 7104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Declarations for symbol visibility. 7134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyAPI_FUNC(type): Declares a public Python API function and return type 7154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyAPI_DATA(type): Declares public Python data and its type 7164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PyMODINIT_FUNC: A Python module init function. If these functions are 7174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm inside the Python core, they are private to the core. 7184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm If in an extension module, it may be declared with 7194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm external linkage depending on the platform. 7204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm As a number of platforms support/require "__declspec(dllimport/dllexport)", 7224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm we support a HAVE_DECLSPEC_DLL macro to save duplication. 7234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/ 7244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* 7264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm All windows ports, except cygwin, are handled in PC/pyconfig.h. 7274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm BeOS and cygwin are the only other autoconf platform requiring special 7294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm linkage handling and both of these use __declspec(). 7304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm*/ 7314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(__CYGWIN__) || defined(__BEOS__) 7324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define HAVE_DECLSPEC_DLL 7334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 7344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* only get special linkage if built as shared or platform is Cygwin */ 7364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(Py_ENABLE_SHARED) || defined(__CYGWIN__) 7374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# if defined(HAVE_DECLSPEC_DLL) 7384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# ifdef Py_BUILD_CORE 7394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE 7404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE 7414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* module init functions inside the core need no external linkage */ 7424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* except for Cygwin to handle embedding (FIXME: BeOS too?) */ 7434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# if defined(__CYGWIN__) 7444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PyMODINIT_FUNC __declspec(dllexport) void 7454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# else /* __CYGWIN__ */ 7464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PyMODINIT_FUNC void 7474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# endif /* __CYGWIN__ */ 7484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# else /* Py_BUILD_CORE */ 7494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Building an extension module, or an embedded situation */ 7504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* public Python functions and data are imported */ 7514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* Under Cygwin, auto-import functions to prevent compilation */ 7524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* failures similar to those described at the bottom of 4.1: */ 7534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* http://docs.python.org/extending/windows.html#a-cookbook-approach */ 7544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# if !defined(__CYGWIN__) 7554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PyAPI_FUNC(RTYPE) __declspec(dllimport) RTYPE 7564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# endif /* !__CYGWIN__ */ 7574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PyAPI_DATA(RTYPE) extern __declspec(dllimport) RTYPE 7584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm /* module init functions outside the core must be exported */ 7594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# if defined(__cplusplus) 7604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PyMODINIT_FUNC extern "C" __declspec(dllexport) void 7614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# else /* __cplusplus */ 7624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PyMODINIT_FUNC __declspec(dllexport) void 7634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# endif /* __cplusplus */ 7644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# endif /* Py_BUILD_CORE */ 7654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# endif /* HAVE_DECLSPEC */ 7664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* Py_ENABLE_SHARED */ 7674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* If no external linkage macros defined by now, create defaults */ 7694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef PyAPI_FUNC 7704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PyAPI_FUNC(RTYPE) RTYPE 7714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 7724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef PyAPI_DATA 7734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PyAPI_DATA(RTYPE) extern RTYPE 7744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 7754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef PyMODINIT_FUNC 7764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# if defined(__cplusplus) 7774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PyMODINIT_FUNC extern "C" void 7784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# else /* __cplusplus */ 7794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define PyMODINIT_FUNC void 7804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# endif /* __cplusplus */ 7814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 7824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 7834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Deprecated DL_IMPORT and DL_EXPORT macros */ 7844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(Py_ENABLE_SHARED) && defined (HAVE_DECLSPEC_DLL) 7854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# if defined(Py_BUILD_CORE) 7864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define DL_IMPORT(RTYPE) __declspec(dllexport) RTYPE 7874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE 7884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# else 7894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define DL_IMPORT(RTYPE) __declspec(dllimport) RTYPE 7904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define DL_EXPORT(RTYPE) __declspec(dllexport) RTYPE 7914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# endif 7924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 7934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef DL_EXPORT 7944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define DL_EXPORT(RTYPE) RTYPE 7954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 7964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef DL_IMPORT 7974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# define DL_IMPORT(RTYPE) RTYPE 7984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 7994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* End of deprecated DL_* macros */ 8004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* If the fd manipulation macros aren't defined, 8024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm here is a set that should do the job */ 8034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if 0 /* disabled and probably obsolete */ 8054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef FD_SETSIZE 8074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define FD_SETSIZE 256 8084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef FD_SET 8114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef long fd_mask; 8134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define NFDBITS (sizeof(fd_mask) * NBBY) /* bits per mask */ 8154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef howmany 8164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define howmany(x, y) (((x)+((y)-1))/(y)) 8174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* howmany */ 8184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtypedef struct fd_set { 8204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)]; 8214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} fd_set; 8224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) 8244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) 8254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) 8264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define FD_ZERO(p) memset((char *)(p), '\0', sizeof(*(p))) 8274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* FD_SET */ 8294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* fd manipulation macros */ 8314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* limits.h constants that may be missing */ 8344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef INT_MAX 8364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define INT_MAX 2147483647 8374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef LONG_MAX 8404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if SIZEOF_LONG == 4 8414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define LONG_MAX 0X7FFFFFFFL 8424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#elif SIZEOF_LONG == 8 8434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define LONG_MAX 0X7FFFFFFFFFFFFFFFL 8444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 8454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#error "could not set LONG_MAX in pyport.h" 8464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef LONG_MIN 8504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define LONG_MIN (-LONG_MAX-1) 8514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef LONG_BIT 8544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define LONG_BIT (8 * SIZEOF_LONG) 8554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if LONG_BIT != 8 * SIZEOF_LONG 8584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* 04-Oct-2000 LONG_BIT is apparently (mis)defined as 64 on some recent 8594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * 32-bit platforms using gcc. We try to catch that here at compile-time 8604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * rather than waiting for integer multiplication to trigger bogus 8614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * overflows. 8624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 8634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)." 8644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __cplusplus 8674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm} 8684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* 8714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Hide GCC attributes from compilers that don't support them. 8724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 8734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if (!defined(__GNUC__) || __GNUC__ < 2 || \ 8744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (__GNUC__ == 2 && __GNUC_MINOR__ < 7) ) && \ 8754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm !defined(RISCOS) 8764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_GCC_ATTRIBUTE(x) 8774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 8784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_GCC_ATTRIBUTE(x) __attribute__(x) 8794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* 8824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Add PyArg_ParseTuple format where available. 8834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 8844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef HAVE_ATTRIBUTE_FORMAT_PARSETUPLE 8854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_FORMAT_PARSETUPLE(func,p1,p2) __attribute__((format(func,p1,p2))) 8864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 8874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_FORMAT_PARSETUPLE(func,p1,p2) 8884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* 8914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Specify alignment on compilers that support it. 8924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 8934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#if defined(__GNUC__) && __GNUC__ >= 3 8944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_ALIGNED(x) __attribute__((aligned(x))) 8954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#else 8964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_ALIGNED(x) 8974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 8984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 8994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* Eliminate end-of-loop code not reached warnings from SunPro C 9004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * when using do{...}while(0) macros 9014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 9024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifdef __SUNPRO_C 9034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#pragma error_messages (off,E_END_OF_LOOP_CODE_NOT_REACHED) 9044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 9054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm/* 9074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * Older Microsoft compilers don't support the C99 long long literal suffixes, 9084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm * so these will be defined in PC/pyconfig.h for those compilers. 9094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm */ 9104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef Py_LL 9114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_LL(x) x##LL 9124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 9134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#ifndef Py_ULL 9154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#define Py_ULL(x) Py_LL(x##U) 9164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif 9174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 9184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#endif /* Py_PYPORT_H */ 919