home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 May / PCWorld_2002-05_cd.bin / Software / TemaCD / activepython / ActivePython-2.1.1.msi / Python21_include_pyport.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-07-26  |  12.4 KB  |  451 lines

  1. #ifndef Py_PYPORT_H
  2. #define Py_PYPORT_H
  3.  
  4. #include "config.h" /* include for defines */
  5.  
  6. /**************************************************************************
  7. Symbols and macros to supply platform-independent interfaces to basic
  8. C language & library operations whose spellings vary across platforms.
  9.  
  10. Please try to make documentation here as clear as possible:  by definition,
  11. the stuff here is trying to illuminate C's darkest corners.
  12.  
  13. Config #defines referenced here:
  14.  
  15. SIGNED_RIGHT_SHIFT_ZERO_FILLS
  16. Meaning:  To be defined iff i>>j does not extend the sign bit when i is a
  17.           signed integral type and i < 0.
  18. Used in:  Py_ARITHMETIC_RIGHT_SHIFT
  19.  
  20. Py_DEBUG
  21. Meaning:  Extra checks compiled in for debug mode.
  22. Used in:  Py_SAFE_DOWNCAST
  23.  
  24. HAVE_UINTPTR_T
  25. Meaning:  The C9X type uintptr_t is supported by the compiler
  26. Used in:  Py_uintptr_t
  27.  
  28. HAVE_LONG_LONG
  29. Meaning:  The compiler supports the C type "long long"
  30. Used in:  LONG_LONG
  31.  
  32. **************************************************************************/
  33.  
  34.  
  35. /* For backward compatibility only. Obsolete, do not use. */
  36. #define ANY void
  37. #ifdef HAVE_PROTOTYPES
  38. #define Py_PROTO(x) x
  39. #else
  40. #define Py_PROTO(x) ()
  41. #endif
  42. #ifndef Py_FPROTO
  43. #define Py_FPROTO(x) Py_PROTO(x)
  44. #endif
  45.  
  46. /* typedefs for some C9X-defined synonyms for integral types.
  47.  *
  48.  * The names in Python are exactly the same as the C9X names, except with a
  49.  * Py_ prefix.  Until C9X is universally implemented, this is the only way
  50.  * to ensure that Python gets reliable names that don't conflict with names
  51.  * in non-Python code that are playing their own tricks to define the C9X
  52.  * names.
  53.  *
  54.  * NOTE: don't go nuts here!  Python has no use for *most* of the C9X
  55.  * integral synonyms.  Only define the ones we actually need.
  56.  */
  57.  
  58. #ifdef HAVE_LONG_LONG
  59. #ifndef LONG_LONG
  60. #define LONG_LONG long long
  61. #endif
  62. #endif /* HAVE_LONG_LONG */
  63.  
  64. /* uintptr_t is the C9X name for an unsigned integral type such that a
  65.  * legitimate void* can be cast to uintptr_t and then back to void* again
  66.  * without loss of information.
  67.  */
  68. #ifdef HAVE_UINTPTR_T
  69. typedef uintptr_t Py_uintptr_t;
  70. #elif SIZEOF_VOID_P <= SIZEOF_INT
  71. typedef unsigned int Py_uintptr_t;
  72. #elif SIZEOF_VOID_P <= SIZEOF_LONG
  73. typedef unsigned long Py_uintptr_t;
  74. #elif defined(HAVE_LONG_LONG) && (SIZEOF_VOID_P <= SIZEOF_LONG_LONG)
  75. typedef unsigned LONG_LONG Py_uintptr_t;
  76. #else
  77. #   error "Python needs a typedef for Py_uintptr_t in pyport.h."
  78. #endif /* HAVE_UINTPTR_T */
  79.  
  80. #ifdef HAVE_STDLIB_H
  81. #include <stdlib.h>
  82. #endif
  83.  
  84. #include <math.h> /* Moved here from the math section, before extern "C" */
  85.  
  86. /********************************************
  87.  * WRAPPER FOR <time.h> and/or <sys/time.h> *
  88.  ********************************************/
  89.  
  90. #ifdef TIME_WITH_SYS_TIME
  91. #include <sys/time.h>
  92. #include <time.h>
  93. #else /* !TIME_WITH_SYS_TIME */
  94. #ifdef HAVE_SYS_TIME_H
  95. #include <sys/time.h>
  96. #else /* !HAVE_SYS_TIME_H */
  97. #include <time.h>
  98. #endif /* !HAVE_SYS_TIME_H */
  99. #endif /* !TIME_WITH_SYS_TIME */
  100.  
  101.  
  102. /******************************
  103.  * WRAPPER FOR <sys/select.h> *
  104.  ******************************/
  105.  
  106. /* NB caller must include <sys/types.h> */
  107.  
  108. #ifdef HAVE_SYS_SELECT_H
  109.  
  110. #include <sys/select.h>
  111.  
  112. #else /* !HAVE_SYS_SELECT_H */
  113.  
  114. #ifdef USE_GUSI1
  115. /* If we don't have sys/select the definition may be in unistd.h */
  116. #include <GUSI.h>
  117. #endif
  118.  
  119. #endif /* !HAVE_SYS_SELECT_H */
  120.  
  121. /*******************************
  122.  * stat() and fstat() fiddling *
  123.  *******************************/
  124.  
  125. /* We expect that stat and fstat exist on most systems.
  126.  *  It's confirmed on Unix, Mac and Windows.
  127.  *  If you don't have them, add
  128.  *      #define DONT_HAVE_STAT
  129.  * and/or
  130.  *      #define DONT_HAVE_FSTAT
  131.  * to your config.h. Python code beyond this should check HAVE_STAT and
  132.  * HAVE_FSTAT instead.
  133.  * Also
  134.  *      #define DONT_HAVE_SYS_STAT_H
  135.  * if <sys/stat.h> doesn't exist on your platform, and
  136.  *      #define HAVE_STAT_H
  137.  * if <stat.h> does (don't look at me -- ths mess is inherited).
  138.  */
  139. #ifndef DONT_HAVE_STAT
  140. #define HAVE_STAT
  141. #endif
  142.  
  143. #ifndef DONT_HAVE_FSTAT
  144. #define HAVE_FSTAT
  145. #endif
  146.  
  147. #ifndef DONT_HAVE_SYS_STAT_H
  148. #include <sys/stat.h>
  149. #elif defined(HAVE_STAT_H)
  150. #include <stat.h>
  151. #endif
  152.  
  153.  
  154. #ifdef __cplusplus
  155. /* Move this down here since some C++ #include's don't like to be included
  156.    inside an extern "C" */
  157. extern "C" {
  158. #endif
  159.  
  160.  
  161. /* Py_ARITHMETIC_RIGHT_SHIFT
  162.  * C doesn't define whether a right-shift of a signed integer sign-extends
  163.  * or zero-fills.  Here a macro to force sign extension:
  164.  * Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J)
  165.  *    Return I >> J, forcing sign extension.
  166.  * Requirements:
  167.  *    I is of basic signed type TYPE (char, short, int, long, or long long).
  168.  *    TYPE is one of char, short, int, long, or long long, although long long
  169.  *    must not be used except on platforms that support it.
  170.  *    J is an integer >= 0 and strictly less than the number of bits in TYPE
  171.  *    (because C doesn't define what happens for J outside that range either).
  172.  * Caution:
  173.  *    I may be evaluated more than once.
  174.  */
  175. #ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS
  176. #define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \
  177.     ((I) < 0 ? ~((~(unsigned TYPE)(I)) >> (J)) : (I) >> (J))
  178. #else
  179. #define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J))
  180. #endif
  181.  
  182. /* Py_FORCE_EXPANSION(X)
  183.  * "Simply" returns its argument.  However, macro expansions within the
  184.  * argument are evaluated.  This unfortunate trickery is needed to get
  185.  * token-pasting to work as desired in some cases.
  186.  */
  187. #define Py_FORCE_EXPANSION(X) X
  188.  
  189. /* Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW)
  190.  * Cast VALUE to type NARROW from type WIDE.  In Py_DEBUG mode, this
  191.  * assert-fails if any information is lost.
  192.  * Caution:
  193.  *    VALUE may be evaluated more than once.
  194.  */
  195. #ifdef Py_DEBUG
  196. #define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \
  197.     (assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE))
  198. #else
  199. #define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE)
  200. #endif
  201.  
  202. /* Py_IS_INFINITY(X)
  203.  * Return 1 if float or double arg is an infinity, else 0.
  204.  * Caution:
  205.  *    X is evaluated more than once.
  206.  *    This implementation may set the underflow flag if |X| is very small;
  207.  *    it really can't be implemented correctly (& easily) before C99.
  208.  */
  209. #define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X))
  210.  
  211. /**************************************************************************
  212. Prototypes that are missing from the standard include files on some systems
  213. (and possibly only some versions of such systems.)
  214.  
  215. Please be conservative with adding new ones, document them and enclose them
  216. in platform-specific #ifdefs.
  217. **************************************************************************/
  218.  
  219. #ifdef SOLARIS
  220. /* Unchecked */
  221. extern int gethostname(char *, int);
  222. #endif
  223.  
  224. #ifdef __BEOS__
  225. /* Unchecked */
  226. /* It's in the libs, but not the headers... - [cjh] */
  227. int shutdown( int, int );
  228. #endif
  229.  
  230. #ifdef HAVE__GETPTY
  231. #include <sys/types.h>        /* we need to import mode_t */
  232. extern char * _getpty(int *, int, mode_t, int);
  233. #endif
  234.  
  235. #if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY)
  236. #if !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H)
  237. /* BSDI does not supply a prototype for the 'openpty' and 'forkpty'
  238.    functions, even though they are included in libutil. */
  239. #include <termios.h>
  240. extern int openpty(int *, int *, char *, struct termios *, struct winsize *);
  241. extern int forkpty(int *, char *, struct termios *, struct winsize *);
  242. #endif /* !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) */
  243. #endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */
  244.  
  245.  
  246. /* These are pulled from various places. It isn't obvious on what platforms
  247.    they are necessary, nor what the exact prototype should look like (which
  248.    is likely to vary between platforms!) If you find you need one of these
  249.    declarations, please move them to a platform-specific block and include
  250.    proper prototypes. */
  251. #if 0
  252.  
  253. /* From Modules/resource.c */
  254. extern int getrusage();
  255. extern int getpagesize();
  256.  
  257. /* From Python/sysmodule.c and Modules/posixmodule.c */
  258. extern int fclose(FILE *);
  259.  
  260. /* From Modules/posixmodule.c */
  261. extern int fdatasync(int);
  262. /* XXX These are supposedly for SunOS4.1.3 but "shouldn't hurt elsewhere" */
  263. extern int rename(const char *, const char *);
  264. extern int pclose(FILE *);
  265. extern int lstat(const char *, struct stat *);
  266. extern int symlink(const char *, const char *);
  267. extern int fsync(int fd);
  268.  
  269. #endif /* 0 */
  270.  
  271.  
  272. /************************
  273.  * WRAPPER FOR <math.h> *
  274.  ************************/
  275.  
  276. /* On the 68K Mac, when using CFM (Code Fragment Manager),
  277.    <math.h> requires special treatment -- we need to surround it with
  278.    #pragma lib_export off / on...
  279.    This is because MathLib.o is a static library, and exporting its
  280.    symbols doesn't quite work...
  281.    XXX Not sure now...  Seems to be something else going on as well... */
  282.  
  283. #ifndef HAVE_HYPOT
  284. extern double hypot(double, double);
  285. #ifdef MWERKS_BEFORE_PRO4
  286. #define hypot we_dont_want_faulty_hypot_decl
  287. #endif
  288. #endif
  289.  
  290. #ifndef HAVE_HYPOT
  291. #ifdef __MWERKS__
  292. #undef hypot
  293. #endif
  294. #endif
  295.  
  296. #if defined(USE_MSL) && defined(__MC68K__)
  297. /* CodeWarrior MSL 2.1.1 has weird define overrides that don't work
  298. ** when you take the address of math functions. If I interpret the
  299. ** ANSI C standard correctly this is illegal, but I haven't been able
  300. ** to convince the MetroWerks folks of this...
  301. */
  302. #undef acos
  303. #undef asin
  304. #undef atan
  305. #undef atan2
  306. #undef ceil
  307. #undef cos
  308. #undef cosh
  309. #undef exp
  310. #undef fabs
  311. #undef floor
  312. #undef fmod
  313. #undef log
  314. #undef log10
  315. #undef pow
  316. #undef sin
  317. #undef sinh
  318. #undef sqrt
  319. #undef tan
  320. #undef tanh
  321. #define acos acosd
  322. #define asin asind
  323. #define atan atand
  324. #define atan2 atan2d
  325. #define ceil ceild
  326. #define cos cosd
  327. #define cosh coshd
  328. #define exp expd
  329. #define fabs fabsd
  330. #define floor floord
  331. #define fmod fmodd
  332. #define log logd
  333. #define log10 log10d
  334. #define pow powd
  335. #define sin sind
  336. #define sinh sinhd
  337. #define sqrt sqrtd
  338. #define tan tand
  339. #define tanh tanhd
  340. #endif
  341.  
  342.  
  343. /************************************
  344.  * MALLOC COMPATIBILITY FOR pymem.h *
  345.  ************************************/
  346.  
  347. #ifndef DL_IMPORT       /* declarations for DLL import */
  348. #define DL_IMPORT(RTYPE) RTYPE
  349. #endif
  350.  
  351. #ifdef MALLOC_ZERO_RETURNS_NULL
  352. /* XXX Always allocate one extra byte, since some malloc's return NULL
  353.    XXX for malloc(0) or realloc(p, 0). */
  354. #define _PyMem_EXTRA 1
  355. #else
  356. #define _PyMem_EXTRA 0
  357. #endif
  358.  
  359.  
  360. /* If the fd manipulation macros aren't defined,
  361.    here is a set that should do the job */
  362.  
  363. #if 0 /* disabled and probably obsolete */
  364.  
  365. #ifndef    FD_SETSIZE
  366. #define    FD_SETSIZE    256
  367. #endif
  368.  
  369. #ifndef FD_SET
  370.  
  371. typedef long fd_mask;
  372.  
  373. #define NFDBITS    (sizeof(fd_mask) * NBBY)    /* bits per mask */
  374. #ifndef howmany
  375. #define    howmany(x, y)    (((x)+((y)-1))/(y))
  376. #endif /* howmany */
  377.  
  378. typedef    struct fd_set {
  379.     fd_mask    fds_bits[howmany(FD_SETSIZE, NFDBITS)];
  380. } fd_set;
  381.  
  382. #define    FD_SET(n, p)    ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
  383. #define    FD_CLR(n, p)    ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
  384. #define    FD_ISSET(n, p)    ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
  385. #define FD_ZERO(p)    memset((char *)(p), '\0', sizeof(*(p)))
  386.  
  387. #endif /* FD_SET */
  388.  
  389. #endif /* fd manipulation macros */
  390.  
  391.  
  392. /* limits.h constants that may be missing */
  393.  
  394. #ifndef INT_MAX
  395. #define INT_MAX 2147483647
  396. #endif
  397.  
  398. #ifndef LONG_MAX
  399. #if SIZEOF_LONG == 4
  400. #define LONG_MAX 0X7FFFFFFFL
  401. #elif SIZEOF_LONG == 8
  402. #define LONG_MAX 0X7FFFFFFFFFFFFFFFL
  403. #else
  404. #error "could not set LONG_MAX in pyport.h"
  405. #endif
  406. #endif
  407.  
  408. #ifndef LONG_MIN
  409. #define LONG_MIN (-LONG_MAX-1)
  410. #endif
  411.  
  412. #ifndef LONG_BIT
  413. #define LONG_BIT (8 * SIZEOF_LONG)
  414. #endif
  415.  
  416. #if LONG_BIT != 8 * SIZEOF_LONG
  417. /* 04-Oct-2000 LONG_BIT is apparently (mis)defined as 64 on some recent
  418.  * 32-bit platforms using gcc.  We try to catch that here at compile-time
  419.  * rather than waiting for integer multiplication to trigger bogus
  420.  * overflows.
  421.  */
  422. #error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)."
  423. #endif
  424.  
  425. #ifdef __NeXT__
  426. #ifdef __sparc__
  427. /*
  428.  * This works around a bug in the NS/Sparc 3.3 pre-release
  429.  * limits.h header file.
  430.  * 10-Feb-1995 bwarsaw@cnri.reston.va.us
  431.  */
  432. #undef LONG_MIN
  433. #define LONG_MIN (-LONG_MAX-1)
  434. #endif
  435. #endif
  436.  
  437. /*
  438.  * Rename some functions for the Borland compiler
  439.  */
  440. #ifdef __BORLANDC__
  441. #  include <io.h>
  442. #  define _chsize chsize
  443. #  define _setmode setmode
  444. #endif
  445.  
  446. #ifdef __cplusplus
  447. }
  448. #endif
  449.  
  450. #endif /* Py_PYPORT_H */
  451.