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