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