2000-07-08 04:17:21 +00:00
|
|
|
/***********************************************************
|
|
|
|
Copyright (c) 2000, BeOpen.com.
|
|
|
|
All rights reserved.
|
|
|
|
|
|
|
|
See the file "Misc/COPYRIGHT" for information on usage and
|
|
|
|
redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
|
|
******************************************************************/
|
|
|
|
|
|
|
|
#ifndef Py_PYPORT_H
|
2000-07-10 04:59:49 +00:00
|
|
|
#define Py_PYPORT_H
|
2000-07-08 04:17:21 +00:00
|
|
|
|
|
|
|
/**************************************************************************
|
|
|
|
Symbols and macros to supply platform-independent interfaces to basic
|
2000-07-23 18:10:18 +00:00
|
|
|
C language & library operations whose spellings vary across platforms.
|
2000-07-08 04:17:21 +00:00
|
|
|
|
|
|
|
Please try to make documentation here as clear as possible: by definition,
|
|
|
|
the stuff here is trying to illuminate C's darkest corners.
|
|
|
|
|
|
|
|
Config #defines referenced here:
|
|
|
|
|
|
|
|
SIGNED_RIGHT_SHIFT_ZERO_FILLS
|
|
|
|
Meaning: To be defined iff i>>j does not extend the sign bit when i is a
|
|
|
|
signed integral type and i < 0.
|
|
|
|
Used in: Py_ARITHMETIC_RIGHT_SHIFT
|
2000-07-23 18:10:18 +00:00
|
|
|
|
|
|
|
RETSIGTYPE
|
|
|
|
Meaning: Expands to void or int, depending on what the platform wants
|
|
|
|
signal handlers to return. Note that only void is ANSI!
|
|
|
|
Used in: Py_RETURN_FROM_SIGNAL_HANDLER
|
2000-07-08 04:17:21 +00:00
|
|
|
**************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Py_ARITHMETIC_RIGHT_SHIFT
|
|
|
|
* C doesn't define whether a right-shift of a signed integer sign-extends
|
|
|
|
* or zero-fills. Here a macro to force sign extension:
|
|
|
|
* Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J)
|
|
|
|
* Return I >> J, forcing sign extension.
|
|
|
|
* Requirements:
|
|
|
|
* I is of basic signed type TYPE (char, short, int, long, or long long).
|
|
|
|
* TYPE is one of char, short, int, long, or long long, although long long
|
|
|
|
* must not be used except on platforms that support it.
|
|
|
|
* J is an integer >= 0 and strictly less than the number of bits in TYPE
|
|
|
|
* (because C doesn't define what happens for J outside that range either).
|
|
|
|
* Caution:
|
|
|
|
* I may be evaluated more than once.
|
|
|
|
*/
|
|
|
|
#ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS
|
|
|
|
#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \
|
|
|
|
((I) < 0 ? ~((~(unsigned TYPE)(I)) >> (J)) : (I) >> (J))
|
|
|
|
#else
|
|
|
|
#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J))
|
|
|
|
#endif
|
|
|
|
|
2000-07-23 18:10:18 +00:00
|
|
|
/* Py_FORCE_EXPANSION
|
|
|
|
* "Simply" returns its argument. However, macro expansions within the
|
|
|
|
* argument are evaluated. This unfortunate trickery is needed to get
|
|
|
|
* token-pasting to work as desired in some cases.
|
|
|
|
*/
|
|
|
|
#define Py_FORCE_EXPANSION(X) X
|
|
|
|
|
|
|
|
/* Py_RETURN_FROM_SIGNAL_HANDLER
|
|
|
|
* The return from a signal handler varies depending on whether RETSIGTYPE
|
|
|
|
* is int or void. The macro Py_RETURN_FROM_SIGNAL_HANDLER(VALUE) expands
|
|
|
|
* to
|
|
|
|
* return VALUE
|
|
|
|
* if RETSIGTYPE is int, else to nothing if RETSIGTYPE is void.
|
|
|
|
*/
|
|
|
|
#define int_PySIGRETURN(VALUE) return VALUE
|
|
|
|
#define void_PySIGRETURN(VALUE)
|
|
|
|
#define Py_RETURN_FROM_SIGNAL_HANDLER(VALUE) \
|
|
|
|
Py_FORCE_EXPANSION(RETSIGTYPE) ## _PySIGRETURN(VALUE)
|
|
|
|
|
2000-07-08 04:17:21 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* Py_PYPORT_H */
|