00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #ifndef __PY_CPythonAPI_h__
00050 #define __PY_CPythonAPI_h__
00051
00052 #include "PY_API.h"
00053 #include <SYS/SYS_Types.h>
00054 #include <boost/preprocessor/seq/for_each.hpp>
00055 #include <boost/preprocessor/seq/for_each_i.hpp>
00056 #include <boost/preprocessor/seq/seq.hpp>
00057 #include <boost/preprocessor/punctuation/comma_if.hpp>
00058 #include <boost/preprocessor/cat.hpp>
00059 #include <boost/preprocessor/stringize.hpp>
00060 #include <string.h>
00061 #include <stdarg.h>
00062
00063 #ifdef WIN32
00064
00065
00066
00067 #pragma warning(disable:4003)
00068 #endif
00069
00070
00071
00072
00073
00074 #define PY_WRAPPED_FUNCTIONS \
00075 ((Py_InitializeEx)(void)((int))) \
00076 ((Py_IsInitialized)(int)()) \
00077 ((Py_SetPythonHome)(void)((char*))) \
00078 ((Py_SetProgramName)(void)((char*))) \
00079 ((PyGILState_Ensure)(PY_PyGILState_STATE)()) \
00080 ((PyGILState_Release)(void)((PY_PyGILState_STATE))) \
00081 ((PyGILState_GetThisThreadState)(PY_PyThreadState *)()) \
00082 ((PyRun_SimpleStringFlags)(int)((const char *)(PY_PyCompilerFlags *))) \
00083 ((Py_CompileStringFlags)(PY_PyObject *) \
00084 ((const char *)(const char *)(int)(PY_PyCompilerFlags *))) \
00085 ((PyEval_InitThreads)(void)()) \
00086 ((PyEval_SaveThread)(PY_PyThreadState *)()) \
00087 ((PyEval_RestoreThread)(void)((PY_PyThreadState *))) \
00088 ((PyEval_GetFrame)(PY_PyFrameObject *)()) \
00089 ((PyEval_EvalCode)(PY_PyObject *) \
00090 ((PY_PyCodeObject *)(PY_PyObject *)(PY_PyObject *))) \
00091 ((PyThread_get_thread_ident)(long)()) \
00092 ((PyThreadState_SetAsyncExc)(int)((long)(PY_PyObject *))) \
00093 ((PyMem_Malloc)(void *)((size_t))) \
00094 ((Py_Main)(int)((int)(char **))) \
00095 ((Py_IncRef)(void)((PY_PyObject *))) \
00096 ((Py_DecRef)(void)((PY_PyObject *))) \
00097 ((PyObject_GetAttr)(PY_PyObject *)((PY_PyObject *)(PY_PyObject *))) \
00098 ((PyObject_GetAttrString)(PY_PyObject *)((PY_PyObject *)(const char *))) \
00099 ((PyObject_SetAttr)(int)((PY_PyObject *)(PY_PyObject *)(PY_PyObject *))) \
00100 ((PyObject_Str)(PY_PyObject *)((PY_PyObject *))) \
00101 ((PyObject_IsTrue)(int)((PY_PyObject *))) \
00102 ((PyObject_CallObject)(PY_PyObject *)((PY_PyObject *)(PY_PyObject *))) \
00103 ((PyObject_Call)(PY_PyObject *) \
00104 ((PY_PyObject *)(PY_PyObject *)(PY_PyObject *))) \
00105 ((PyObject_GetIter)(PY_PyObject *)((PY_PyObject *))) \
00106 ((PyObject_RichCompareBool)(int)((PY_PyObject *)(PY_PyObject *)(int))) \
00107 ((Py_VaBuildValue)(PY_PyObject *)((const char *)(va_list))) \
00108 ((PyArg_VaParse)(int)((PY_PyObject *)(const char *)(va_list))) \
00109 ((PyType_IsSubtype)(int)((PY_PyTypeObject *)(PY_PyTypeObject *))) \
00110 ((PyType_Ready)(int)((PY_PyTypeObject *))) \
00111 ((PyErr_Occurred)(PY_PyObject *)()) \
00112 ((PyErr_ExceptionMatches)(int)((PY_PyObject *))) \
00113 ((PyErr_Fetch)(void)((PY_PyObject **)(PY_PyObject **)(PY_PyObject **))) \
00114 ((PyErr_Clear)(void)()) \
00115 ((PyErr_SetString)(void)((PY_PyObject *)(const char *))) \
00116 ((PyErr_SetNone)(void)((PY_PyObject *))) \
00117 ((PyErr_SetObject)(void)((PY_PyObject *)(PY_PyObject *))) \
00118 ((PyErr_CheckSignals)(int)()) \
00119 ((PyCObject_GetDesc)(void *)((PY_PyObject *))) \
00120 ((PyCObject_AsVoidPtr)(void *)((PY_PyObject *))) \
00121 ((PyLong_FromLongLong)(PY_PyObject *)((int64))) \
00122 ((PyLong_FromLong)(PY_PyObject *)((long))) \
00123 ((PyLong_AsLong)(long)((PY_PyObject *))) \
00124 ((PyFloat_AsDouble)(double)((PY_PyObject *))) \
00125 ((PyFloat_FromDouble)(PY_PyObject *)((double))) \
00126 ((PySequence_Check)(int)((PY_PyObject *))) \
00127 ((PySequence_Size)(PY_Py_ssize_t)((PY_PyObject *))) \
00128 ((PySequence_GetItem)(PY_PyObject *)((PY_PyObject *)(PY_Py_ssize_t))) \
00129 ((PyList_New)(PY_PyObject *)((PY_Py_ssize_t))) \
00130 ((PyList_Size)(PY_Py_ssize_t)((PY_PyObject *))) \
00131 ((PyList_GetItem)(PY_PyObject *)((PY_PyObject *)(PY_Py_ssize_t))) \
00132 ((PyList_SetItem)(int)((PY_PyObject *)(PY_Py_ssize_t)(PY_PyObject *))) \
00133 ((PyList_Append)(int)((PY_PyObject *)(PY_PyObject *))) \
00134 ((PyTuple_New)(PY_PyObject *)((PY_Py_ssize_t))) \
00135 ((PyTuple_SetItem)(int)((PY_PyObject *)(PY_Py_ssize_t)(PY_PyObject *))) \
00136 ((PyDict_New)(PY_PyObject *)()) \
00137 ((PyDict_Clear)(void)((PY_PyObject *))) \
00138 ((PyDict_Next)(int) \
00139 ((PY_PyObject *)(PY_Py_ssize_t *)(PY_PyObject **)(PY_PyObject **))) \
00140 ((PyDict_GetItemString)(PY_PyObject *)((PY_PyObject *)(const char *))) \
00141 ((PyDict_SetItemString)(int) \
00142 ((PY_PyObject *)(const char *)(PY_PyObject *))) \
00143 ((PyDict_SetItem)(int)((PY_PyObject *)(PY_PyObject *)(PY_PyObject *))) \
00144 ((PyIter_Next)(PY_PyObject *)((PY_PyObject *))) \
00145 ((PyFunction_GetCode)(PY_PyObject *)((PY_PyObject *))) \
00146 ((PyCallable_Check)(int)((PY_PyObject *))) \
00147 ((PyImport_ImportModule)(PY_PyObject *)((const char *))) \
00148 ((PyImport_ExecCodeModule)(PY_PyObject *)((char *)(PY_PyObject *))) \
00149 ((PyImport_AddModule)(PY_PyObject *)((const char *))) \
00150 ((PyModule_GetDict)(PY_PyObject *)((PY_PyObject *))) \
00151 ((PyModule_AddObject)(int)((PY_PyObject *)(const char *)(PY_PyObject *))) \
00152 ((PySys_SetArgv)(void)((int)(char **))) \
00153 ((PySys_GetObject)(PY_PyObject *)((char *))) \
00154 ((PyOS_InitInterrupts)(void)()) \
00155 ((PyMarshal_ReadObjectFromString)(PY_PyObject *)((char *)(PY_Py_ssize_t))) \
00156 ((PyMarshal_WriteObjectToString)(PY_PyObject *)((PY_PyObject *)(int))) \
00157 ((PyRun_InteractiveLoopFlags)(int) \
00158 ((FILE *)(const char *)(PY_PyCompilerFlags *)))
00159
00160
00161
00162
00163 typedef char *(*PY_PyOS_ReadlineFunctionPointerType)(FILE *, FILE *, char *);
00164 #define PY_WRAPPED_CONSTANTS \
00165 ((_Py_NoneStruct)(PY_PyObject)) \
00166 ((_PyOS_ReadlineTState)(PY_PyThreadState *)) \
00167 ((_PyThreadState_Current)(PY_PyThreadState *)) \
00168 ((PyOS_ReadlineFunctionPointer)(PY_PyOS_ReadlineFunctionPointerType)) \
00169 ((PyExc_RuntimeError)(PY_PyObject *)) \
00170 ((PyExc_IndexError)(PY_PyObject *)) \
00171 ((PyExc_AttributeError)(PY_PyObject *)) \
00172 ((PyExc_TypeError)(PY_PyObject *)) \
00173 ((PyExc_KeyboardInterrupt)(PY_PyObject *)) \
00174 ((PyExc_SystemExit)(PY_PyObject *)) \
00175 ((PyExc_BaseException)(PY_PyObject *)) \
00176 ((PyLong_Type)(PY_PyTypeObject)) \
00177 ((PyFloat_Type)(PY_PyTypeObject)) \
00178 ((PyUnicode_Type)(PY_PyTypeObject)) \
00179 ((PyTuple_Type)(PY_PyTypeObject)) \
00180 ((PyList_Type)(PY_PyTypeObject)) \
00181 ((PyDict_Type)(PY_PyTypeObject)) \
00182 ((PyFunction_Type)(PY_PyTypeObject))
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 #define PY_FOR_EACH_SEQ_OF_2(macro, seq) \
00206 BOOST_PP_SEQ_FOR_EACH(PY_CALLBACK_SEQ_OF_2, macro, seq)
00207
00208
00209
00210 #define PY_CALLBACK_SEQ_OF_2(r, macro, seq) \
00211 macro(PY_SEQ_ELEM_0(seq), PY_SEQ_ELEM_1(seq))
00212
00213
00214
00215
00216 #define PY_FOR_EACH_SEQ_OF_3(macro, seq) \
00217 BOOST_PP_SEQ_FOR_EACH(PY_CALLBACK_SEQ_OF_3, macro, seq)
00218 #define PY_CALLBACK_SEQ_OF_3(r, macro, seq) \
00219 macro(PY_SEQ_ELEM_0(seq), PY_SEQ_ELEM_1(seq), PY_SEQ_ELEM_2(seq))
00220
00221
00222
00223
00224 #define PY_SEQ_ELEM_0(seq) \
00225 BOOST_PP_SEQ_HEAD(seq)
00226 #define PY_SEQ_ELEM_1(seq) \
00227 BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq))
00228 #define PY_SEQ_ELEM_2(seq) \
00229 BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(BOOST_PP_SEQ_TAIL(seq)))
00230
00231
00232
00233
00234
00235
00236 #define PY_MAKE_PARM_LIST(parm_types) \
00237 BOOST_PP_SEQ_FOR_EACH_I(PY_MAKE_PARM, _, parm_types)
00238
00239
00240
00241
00242
00243 #define PY_MAKE_PARM(r, unused_data, i, elem) \
00244 BOOST_PP_COMMA_IF(i) elem BOOST_PP_CAT(arg, i)
00245
00246
00247
00248
00249
00250
00251 #define PY_MAKE_ARG_LIST(parm_types) \
00252 BOOST_PP_SEQ_FOR_EACH_I(PY_MAKE_ARG, _, parm_types)
00253
00254 #define PY_MAKE_ARG(r, unused_data, i, unused_elem) \
00255 BOOST_PP_COMMA_IF(i) BOOST_PP_CAT(arg, i)
00256
00257
00258
00259
00260 class PY_API PY_PyTypeObject;
00261 class PY_API PY_PyCodeObject;
00262 class PY_API PY_PyCompilerFlags;
00263 class PY_API PY_PyThreadState;
00264 class PY_API PY_PyMethodDef;
00265 typedef int PY_PyGILState_STATE;
00266
00267 #if defined(WIN32)
00268
00269
00270
00271
00272 #if SIZEOF_VOID_P == 8
00273 typedef int64 PY_Py_ssize_t;
00274 #else
00275 typedef int32 PY_Py_ssize_t;
00276 #endif
00277 #else
00278 typedef ssize_t PY_Py_ssize_t;
00279 #endif
00280
00281
00282
00283
00284
00285
00286 template <typename RETURN_TYPE>
00287 static inline RETURN_TYPE &
00288 pyAccessStructMember(void *c_struct, int offset)
00289 { return *(RETURN_TYPE *)((char *)c_struct + offset); }
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310 class PY_API PY_PyObject_HEAD_EXTRA
00311 {
00312 public:
00313 static int theStructSize;
00314 private:
00315 PY_PyObject_HEAD_EXTRA();
00316 };
00317
00318
00319 #define PY_ADD_SUBCLASS_1(subclass, base_class, member1_type, member1_name) \
00320 class PY_API subclass : public base_class \
00321 { \
00322 public: \
00323 member1_type member1_name() \
00324 { return pyAccessStructMember<member1_type>( \
00325 this, base_class::theStructSize); } \
00326 \
00327 static void computeStructSize() \
00328 { theStructSize = base_class::theStructSize + sizeof(member1_type); } \
00329 \
00330 static int theStructSize; \
00331 };
00332
00333
00334 #define PY_ADD_SUBCLASS_2(subclass, base_class, \
00335 member1_type, member1_name, member2_type, member2_name) \
00336 class PY_API subclass : public base_class \
00337 { \
00338 public: \
00339 member1_type member1_name() \
00340 { return pyAccessStructMember<member1_type>( \
00341 this, base_class::theStructSize); } \
00342 \
00343 member2_type member2_name() \
00344 { return pyAccessStructMember<member2_type>( \
00345 this, base_class::theStructSize + sizeof(member1_type)); } \
00346 \
00347 static void computeStructSize() \
00348 { theStructSize = base_class::theStructSize + \
00349 sizeof(member1_type) + sizeof(member2_type); } \
00350 \
00351 static int theStructSize; \
00352 };
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389 PY_ADD_SUBCLASS_2(PY_PyObject, PY_PyObject_HEAD_EXTRA,
00390 PY_Py_ssize_t, ob_refcnt,
00391 PY_PyTypeObject *, ob_type)
00392
00393 PY_ADD_SUBCLASS_1(PY_PyVarObject, PY_PyObject,
00394 PY_Py_ssize_t, ob_size)
00395
00396 PY_ADD_SUBCLASS_1(PY_PyTypeObject, PY_PyVarObject,
00397 const char *, tp_name)
00398
00399 PY_ADD_SUBCLASS_2(PY_PyFrameObject, PY_PyVarObject,
00400 PY_PyFrameObject *, f_back,
00401 PY_PyCodeObject *, f_code)
00402
00403 PY_ADD_SUBCLASS_1(PY_PyListObject, PY_PyVarObject,
00404 PY_PyObject **, ob_item)
00405
00406
00407
00408
00409
00410 class PY_API PY_PyTupleObject : public PY_PyVarObject
00411 {
00412 public:
00413 PY_PyObject **ob_item()
00414 { return (PY_PyObject **)((char *)this + PY_PyVarObject::theStructSize); }
00415 };
00416
00417
00418
00419
00420
00421
00422
00423
00424 typedef PY_PyObject *(*PY_PyCFunction)(PY_PyObject *, PY_PyObject *);
00425
00426 struct PY_API PY_PyMethodDef
00427 {
00428 const char *ml_name;
00429 PY_PyCFunction ml_meth;
00430 int ml_flags;
00431 const char *ml_doc;
00432 };
00433
00434
00435
00436
00437
00438 #define PY_DECLARE_FUNCTION_FROM_SEQ(seq) \
00439 PY_CALLBACK_SEQ_OF_3(_, PY_DECLARE_FUNCTION, seq)
00440
00441
00442
00443 #define PY_DECLARE_FUNCTION(function_name, return_type, parm_types) \
00444 PY_API return_type BOOST_PP_CAT(PY_, function_name)( \
00445 PY_MAKE_PARM_LIST(parm_types));
00446
00447
00448
00449 #define PY_DECLARE_WRAPPED_CONSTANT(constant_name, type) \
00450 PY_API type &BOOST_PP_CAT(PY_, constant_name)();
00451
00452
00453
00454
00455 PY_FOR_EACH_SEQ_OF_3(PY_DECLARE_FUNCTION, PY_WRAPPED_FUNCTIONS)
00456 PY_FOR_EACH_SEQ_OF_2(PY_DECLARE_WRAPPED_CONSTANT, PY_WRAPPED_CONSTANTS)
00457
00458
00459
00460
00461 PY_API PY_PyObject *PY_Py_InitModule(const char *name, PY_PyMethodDef *methods);
00462 PY_API int PY_PyArg_ParseTuple(PY_PyObject *args, const char *format, ...);
00463 PY_API PY_PyObject *PY_Py_BuildValue(const char *format, ...);
00464 PY_API PY_PyObject *PY_PyObject_CallMethod(
00465 PY_PyObject *o, const char *name, const char *format, ...);
00466
00467 #define PY_FUNC_SEQ_PyInt_AsLong (PyInt_AsLong)(long)((PY_PyObject *))
00468 #define PY_FUNC_SEQ_PyInt_FromLong (PyInt_FromLong)(PY_PyObject *)((long))
00469 #define PY_FUNC_SEQ_PyString_AsString \
00470 (PyString_AsString)(char *)((PY_PyObject *))
00471 #define PY_FUNC_SEQ_PyString_AsStringAndSize \
00472 (PyString_AsStringAndSize)(int)((PY_PyObject *)(char **)(PY_Py_ssize_t *))
00473 #define PY_FUNC_SEQ_PyString_FromString \
00474 (PyString_FromString)(PY_PyObject *)((const char *))
00475 #define PY_FUNC_SEQ_PyString_FromStringAndSize \
00476 (PyString_FromStringAndSize)(PY_PyObject *)((const char *)(PY_Py_ssize_t))
00477
00478 PY_DECLARE_FUNCTION_FROM_SEQ(PY_FUNC_SEQ_PyInt_AsLong)
00479 PY_DECLARE_FUNCTION_FROM_SEQ(PY_FUNC_SEQ_PyInt_FromLong)
00480 PY_DECLARE_FUNCTION_FROM_SEQ(PY_FUNC_SEQ_PyString_AsString)
00481 PY_DECLARE_FUNCTION_FROM_SEQ(PY_FUNC_SEQ_PyString_AsStringAndSize)
00482 PY_DECLARE_FUNCTION_FROM_SEQ(PY_FUNC_SEQ_PyString_FromString)
00483 PY_DECLARE_FUNCTION_FROM_SEQ(PY_FUNC_SEQ_PyString_FromStringAndSize)
00484
00485
00486
00487
00488
00489
00490
00491 static inline int PY_Py_single_input() { return 256; }
00492 static inline int PY_Py_file_input() { return 257; }
00493 static inline int PY_Py_eval_input() { return 258; }
00494 static inline int PY_Py_MARSHAL_VERSION() { return 2; }
00495 static inline int PY_METH_VARARGS() { return 0x0001; }
00496 static inline int PY_Py_EQ() { return 2; }
00497 static inline int PY_PyGILState_LOCKED() { return 0; }
00498 static inline int PY_PyGILState_UNLOCKED() { return 1; }
00499
00500
00501
00502
00503
00504
00505
00506
00507 PY_DECLARE_WRAPPED_CONSTANT(_Py_TrueStruct, PY_PyObject)
00508 PY_DECLARE_WRAPPED_CONSTANT(_Py_ZeroStruct, PY_PyObject)
00509
00510
00511
00512
00513
00514 PY_DECLARE_WRAPPED_CONSTANT(PyInt_Type, PY_PyTypeObject)
00515 PY_DECLARE_WRAPPED_CONSTANT(PyString_Type, PY_PyTypeObject)
00516 #define PY_PyInt_Check(op) PY_PyObject_TypeCheck(op, &PY_PyInt_Type())
00517 #define PY_PyString_Check(op) PY_PyObject_TypeCheck(op, &PY_PyString_Type())
00518
00519
00520
00521
00522
00523 #define PY_Py_INCREF PY_Py_IncRef
00524 #define PY_Py_DECREF PY_Py_DecRef
00525 #define PY_Py_XDECREF(op) if ((op) == NULL) ; else PY_Py_DECREF(op)
00526
00527 #define PY_Py_False() (&PY__Py_ZeroStruct())
00528 #define PY_Py_True() (&PY__Py_TrueStruct())
00529 #define PY_Py_None() (&PY__Py_NoneStruct())
00530
00531 #define PY_Py_RETURN_NONE return PY_Py_INCREF(PY_Py_None()), PY_Py_None()
00532 #define PY_PyMODINIT_FUNC extern "C" SYS_VISIBILITY_EXPORT void
00533
00534 #define PY_PyRun_SimpleString(s) PY_PyRun_SimpleStringFlags(s, NULL)
00535 #define PY_Py_CompileString(str, p, s) PY_Py_CompileStringFlags(str, p, s, NULL)
00536 #define PY_PyRun_InteractiveLoop(f, p) PY_PyRun_InteractiveLoopFlags(f, p, NULL)
00537
00538 #define PY_PyList_SET_ITEM(op, i, v) \
00539 (((PY_PyListObject *)(op))->ob_item()[i] = (v))
00540 #define PY_PyTuple_SET_ITEM(op, i, v) \
00541 (((PY_PyTupleObject *)(op))->ob_item()[i] = (v))
00542
00543
00544 #define PY_PyObject_TypeCheck(ob, tp) \
00545 ((ob)->ob_type() == (tp) || PY_PyType_IsSubtype((ob)->ob_type(), (tp)))
00546 #define PY_PyCObject_Check(op) (op->ob_type() == &PY_PyCObject_Type())
00547 #define PY_PyFloat_Check(op) PY_PyObject_TypeCheck(op, &PY_PyFloat_Type())
00548 #define PY_PyLong_Check(op) PY_PyObject_TypeCheck(op, &PY_PyLong_Type())
00549 #define PY_PyUnicode_Check(op) PY_PyObject_TypeCheck(op, &PY_PyUnicode_Type())
00550 #define PY_PyTuple_Check(op) PY_PyObject_TypeCheck(op, &PY_PyTuple_Type())
00551 #define PY_PyList_Check(op) PY_PyObject_TypeCheck(op, &PY_PyList_Type())
00552 #define PY_PyDict_Check(op) PY_PyObject_TypeCheck(op, &PY_PyDict_Type())
00553 #define PY_PyFunction_Check(op) ((op)->ob_type() == &PY_PyFunction_Type())
00554
00555
00556
00557
00558
00559 #define PY_PyExceptionInstance_Check(op) \
00560 PY_PyObject_TypeCheck(op, (PY_PyTypeObject *)&PY_PyExc_BaseException())
00561
00562
00563
00564
00565
00566 #define PY_PYFRAME_BACK(op) ((op)->f_back())
00567 #define PY_PYFRAME_CODE(op) ((op)->f_code())
00568
00569
00570
00571
00572 PY_API void PYloadPythonLibrary();
00573
00574
00575
00576
00577
00578
00579 PY_API int PYgetPythonVersion();
00580
00581
00582 PY_API bool PYisHFSPythonLibraryLoaded();
00583
00584 #endif