home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 April / PCWorld_2001-04_cd.bin / Software / TemaCD / webclean / !!!python!!! / BeOpen-Python-2.0.exe / PYPORT.H < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-05  |  11.4 KB  |  410 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. #ifdef __cplusplus
  123. /* Move this down here since some C++ #include's don't like to be included
  124.    inside an extern "C" */
  125. extern "C" {
  126. #endif
  127.  
  128.  
  129. /* Py_ARITHMETIC_RIGHT_SHIFT
  130.  * C doesn't define whether a right-shift of a signed integer sign-extends
  131.  * or zero-fills.  Here a macro to force sign extension:
  132.  * Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J)
  133.  *    Return I >> J, forcing sign extension.
  134.  * Requirements:
  135.  *    I is of basic signed type TYPE (char, short, int, long, or long long).
  136.  *    TYPE is one of char, short, int, long, or long long, although long long
  137.  *    must not be used except on platforms that support it.
  138.  *    J is an integer >= 0 and strictly less than the number of bits in TYPE
  139.  *    (because C doesn't define what happens for J outside that range either).
  140.  * Caution:
  141.  *    I may be evaluated more than once.
  142.  */
  143. #ifdef SIGNED_RIGHT_SHIFT_ZERO_FILLS
  144. #define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) \
  145.     ((I) < 0 ? ~((~(unsigned TYPE)(I)) >> (J)) : (I) >> (J))
  146. #else
  147. #define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J))
  148. #endif
  149.  
  150. /* Py_FORCE_EXPANSION(X)
  151.  * "Simply" returns its argument.  However, macro expansions within the
  152.  * argument are evaluated.  This unfortunate trickery is needed to get
  153.  * token-pasting to work as desired in some cases.
  154.  */
  155. #define Py_FORCE_EXPANSION(X) X
  156.  
  157. /* Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW)
  158.  * Cast VALUE to type NARROW from type WIDE.  In Py_DEBUG mode, this
  159.  * assert-fails if any information is lost.
  160.  * Caution:
  161.  *    VALUE may be evaluated more than once.
  162.  */
  163. #ifdef Py_DEBUG
  164. #define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) \
  165.     (assert((WIDE)(NARROW)(VALUE) == (VALUE)), (NARROW)(VALUE))
  166. #else
  167. #define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE)
  168. #endif
  169.  
  170. /* Py_IS_INFINITY(X)
  171.  * Return 1 if float or double arg is an infinity, else 0.
  172.  * Caution:
  173.  *    X is evaluated more than once.
  174.  *    This implementation may set the underflow flag if |X| is very small;
  175.  *    it really can't be implemented correctly (& easily) before C99.
  176.  */
  177. #define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X))
  178.  
  179. /**************************************************************************
  180. Prototypes that are missing from the standard include files on some systems
  181. (and possibly only some versions of such systems.)
  182.  
  183. Please be conservative with adding new ones, document them and enclose them
  184. in platform-specific #ifdefs.
  185. **************************************************************************/
  186.  
  187. #ifdef SOLARIS
  188. /* Unchecked */
  189. extern int gethostname(char *, int);
  190. #endif
  191.  
  192. #ifdef __BEOS__
  193. /* Unchecked */
  194. /* It's in the libs, but not the headers... - [cjh] */
  195. int shutdown( int, int ); 
  196. #endif
  197.  
  198. #ifdef HAVE__GETPTY
  199. #include <sys/types.h>        /* we need to import mode_t */
  200. extern char * _getpty(int *, int, mode_t, int);
  201. #endif
  202.  
  203. #if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY)
  204. #if !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H)
  205. /* BSDI does not supply a prototype for the 'openpty' and 'forkpty'
  206.    functions, even though they are included in libutil. */
  207. #include <termios.h>
  208. extern int openpty(int *, int *, char *, struct termios *, struct winsize *);
  209. extern int forkpty(int *, char *, struct termios *, struct winsize *);
  210. #endif /* !defined(HAVE_PTY_H) && !defined(HAVE_LIBUTIL_H) */
  211. #endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) */
  212.  
  213.  
  214. /* These are pulled from various places. It isn't obvious on what platforms
  215.    they are necessary, nor what the exact prototype should look like (which
  216.    is likely to vary between platforms!) If you find you need one of these
  217.    declarations, please move them to a platform-specific block and include
  218.    proper prototypes. */
  219. #if 0
  220.  
  221. /* From Modules/resource.c */
  222. extern int getrusage();
  223. extern int getpagesize();
  224.  
  225. /* From Python/sysmodule.c and Modules/posixmodule.c */
  226. extern int fclose(FILE *);
  227.  
  228. /* From Modules/posixmodule.c */
  229. extern int fdatasync(int);
  230. /* XXX These are supposedly for SunOS4.1.3 but "shouldn't hurt elsewhere" */
  231. extern int rename(const char *, const char *);
  232. extern int pclose(FILE *);
  233. extern int lstat(const char *, struct stat *);
  234. extern int symlink(const char *, const char *);
  235. extern int fsync(int fd);
  236.  
  237. #endif /* 0 */
  238.  
  239.  
  240. /************************
  241.  * WRAPPER FOR <math.h> *
  242.  ************************/
  243.  
  244. /* On the 68K Mac, when using CFM (Code Fragment Manager),
  245.    <math.h> requires special treatment -- we need to surround it with
  246.    #pragma lib_export off / on...
  247.    This is because MathLib.o is a static library, and exporting its
  248.    symbols doesn't quite work...
  249.    XXX Not sure now...  Seems to be something else going on as well... */
  250.  
  251. #ifndef HAVE_HYPOT
  252. extern double hypot(double, double);
  253. #ifdef MWERKS_BEFORE_PRO4
  254. #define hypot we_dont_want_faulty_hypot_decl
  255. #endif
  256. #endif
  257.  
  258. #ifndef HAVE_HYPOT
  259. #ifdef __MWERKS__
  260. #undef hypot
  261. #endif
  262. #endif
  263.  
  264. #if defined(USE_MSL) && defined(__MC68K__)
  265. /* CodeWarrior MSL 2.1.1 has weird define overrides that don't work
  266. ** when you take the address of math functions. If I interpret the
  267. ** ANSI C standard correctly this is illegal, but I haven't been able
  268. ** to convince the MetroWerks folks of this...
  269. */
  270. #undef acos
  271. #undef asin
  272. #undef atan
  273. #undef atan2
  274. #undef ceil
  275. #undef cos
  276. #undef cosh
  277. #undef exp
  278. #undef fabs
  279. #undef floor
  280. #undef fmod
  281. #undef log
  282. #undef log10
  283. #undef pow
  284. #undef sin
  285. #undef sinh
  286. #undef sqrt
  287. #undef tan
  288. #undef tanh
  289. #define acos acosd
  290. #define asin asind
  291. #define atan atand
  292. #define atan2 atan2d
  293. #define ceil ceild
  294. #define cos cosd
  295. #define cosh coshd
  296. #define exp expd
  297. #define fabs fabsd
  298. #define floor floord
  299. #define fmod fmodd
  300. #define log logd
  301. #define log10 log10d
  302. #define pow powd
  303. #define sin sind
  304. #define sinh sinhd
  305. #define sqrt sqrtd
  306. #define tan tand
  307. #define tanh tanhd
  308. #endif 
  309.  
  310.  
  311. /************************************
  312.  * MALLOC COMPATIBILITY FOR pymem.h *
  313.  ************************************/
  314.  
  315. #ifndef DL_IMPORT       /* declarations for DLL import */
  316. #define DL_IMPORT(RTYPE) RTYPE
  317. #endif
  318.  
  319. #ifdef MALLOC_ZERO_RETURNS_NULL
  320. /* XXX Always allocate one extra byte, since some malloc's return NULL
  321.    XXX for malloc(0) or realloc(p, 0). */
  322. #define _PyMem_EXTRA 1
  323. #else
  324. #define _PyMem_EXTRA 0
  325. #endif
  326.  
  327.  
  328. /* If the fd manipulation macros aren't defined,
  329.    here is a set that should do the job */
  330.  
  331. #if 0 /* disabled and probably obsolete */
  332.  
  333. #ifndef    FD_SETSIZE
  334. #define    FD_SETSIZE    256
  335. #endif
  336.  
  337. #ifndef FD_SET
  338.  
  339. typedef long fd_mask;
  340.  
  341. #define NFDBITS    (sizeof(fd_mask) * NBBY)    /* bits per mask */
  342. #ifndef howmany
  343. #define    howmany(x, y)    (((x)+((y)-1))/(y))
  344. #endif /* howmany */
  345.  
  346. typedef    struct fd_set {
  347.     fd_mask    fds_bits[howmany(FD_SETSIZE, NFDBITS)];
  348. } fd_set;
  349.  
  350. #define    FD_SET(n, p)    ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
  351. #define    FD_CLR(n, p)    ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
  352. #define    FD_ISSET(n, p)    ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
  353. #define FD_ZERO(p)    memset((char *)(p), '\0', sizeof(*(p)))
  354.  
  355. #endif /* FD_SET */
  356.  
  357. #endif /* fd manipulation macros */
  358.  
  359.  
  360. /* limits.h constants that may be missing */
  361.  
  362. #ifndef INT_MAX
  363. #define INT_MAX 2147483647
  364. #endif
  365.  
  366. #ifndef LONG_MAX
  367. #if SIZEOF_LONG == 4
  368. #define LONG_MAX 0X7FFFFFFFL
  369. #elif SIZEOF_LONG == 8
  370. #define LONG_MAX 0X7FFFFFFFFFFFFFFFL
  371. #else
  372. #error "could not set LONG_MAX in pyport.h"
  373. #endif
  374. #endif
  375.  
  376. #ifndef LONG_MIN
  377. #define LONG_MIN (-LONG_MAX-1)
  378. #endif
  379.  
  380. #ifndef LONG_BIT
  381. #define LONG_BIT (8 * SIZEOF_LONG)
  382. #endif
  383.  
  384. #if LONG_BIT != 8 * SIZEOF_LONG
  385. /* 04-Oct-2000 LONG_BIT is apparently (mis)defined as 64 on some recent
  386.  * 32-bit platforms using gcc.  We try to catch that here at compile-time
  387.  * rather than waiting for integer multiplication to trigger bogus
  388.  * overflows.
  389.  */
  390. #error "LONG_BIT definition appears wrong for platform (bad gcc config?)."
  391. #endif
  392.  
  393. #ifdef __NeXT__
  394. #ifdef __sparc__
  395. /*
  396.  * This works around a bug in the NS/Sparc 3.3 pre-release
  397.  * limits.h header file.
  398.  * 10-Feb-1995 bwarsaw@cnri.reston.va.us
  399.  */
  400. #undef LONG_MIN
  401. #define LONG_MIN (-LONG_MAX-1)
  402. #endif
  403. #endif
  404.  
  405. #ifdef __cplusplus
  406. }
  407. #endif
  408.  
  409. #endif /* Py_PYPORT_H */
  410.