/pupy/client/sources/mktab.py

https://github.com/therealsunjester/RatMuseum · Python · 119 lines · 109 code · 6 blank · 4 comment · 8 complexity · e27c738469b3c0ff8479406ed93ceb68 MD5 · raw file

  1. # A script to generate helper files for dynamic linking to the Python dll
  2. #
  3. decls = '''
  4. void, Py_Initialize, (void)
  5. int, PyRun_SimpleString, (char *)
  6. void, Py_Finalize, (void)
  7. char *, Py_GetPath, (void)
  8. void, Py_SetPythonHome, (char *)
  9. void, Py_SetProgramName, (char *)
  10. PyObject *, PyMarshal_ReadObjectFromString, (char *, Py_ssize_t)
  11. PyObject *, PyObject_CallFunction, (PyObject *, char *, ...)
  12. int, PyString_AsStringAndSize, (PyObject *, char **, Py_ssize_t *)
  13. char *, PyString_AsString, (PyObject *)
  14. int, PyArg_ParseTuple, (PyObject *, char *, ...)
  15. PyObject *, PyErr_Format, (PyObject *, const char *, ...)
  16. PyObject *, PyImport_ImportModule, (char *)
  17. PyObject *, PyInt_FromLong, (long)
  18. long, PyInt_AsLong, (PyObject *)
  19. PyObject *, PyLong_FromVoidPtr, (void *)
  20. PyObject *, Py_InitModule4, (char *, PyMethodDef *, char *, PyObject *, int)
  21. PyObject *, PyTuple_New, (Py_ssize_t)
  22. int, PyTuple_SetItem, (PyObject*, Py_ssize_t, PyObject *)
  23. int, Py_IsInitialized, (void)
  24. int, PyObject_SetAttrString, (PyObject *, char *, PyObject *)
  25. PyObject *, PyCFunction_NewEx, (PyMethodDef *, PyObject *, PyObject *)
  26. PyObject *, PyObject_GetAttrString, (PyObject *, char *)
  27. PyObject *, Py_BuildValue, (char *, ...)
  28. PyObject *, PyObject_Call, (PyObject *, PyObject *, PyObject *)
  29. void, PySys_WriteStderr, (const char *, ...)
  30. PyObject *, PyErr_Occurred, (void)
  31. void, PyErr_Clear, (void)
  32. int, PyObject_IsInstance, (PyObject *, PyObject *)
  33. PyObject, PyInt_Type
  34. PyObject, _Py_NoneStruct
  35. PyObject *, PyExc_ImportError
  36. PyObject *, PyExc_Exception
  37. char *, _Py_PackageContext
  38. PyObject *, PyObject_CallObject, (PyObject *, PyObject *)
  39. PyGILState_STATE, PyGILState_Ensure, (void)
  40. void, PyGILState_Release, (PyGILState_STATE)
  41. void, PySys_SetObject, (char *, PyObject *)
  42. PyObject *, PySys_GetObject, (char *)
  43. PyObject *, PyString_FromString, (char *)
  44. int, Py_FdIsInteractive, (FILE *, char *)
  45. int, PyRun_InteractiveLoop, (FILE *, char *)
  46. void, PySys_SetArgv, (int, char **)
  47. PyObject *, PyImport_AddModule, (char *)
  48. PyObject *, PyModule_GetDict, (PyObject *)
  49. Py_ssize_t, PySequence_Length, (PyObject *)
  50. PyObject *, PySequence_GetItem, (PyObject *, Py_ssize_t)
  51. //int, PyCode_Check, (PyObject *)
  52. PyObject *, PyEval_EvalCode, (PyCodeObject *, PyObject *, PyObject *)
  53. void, PyErr_Print, (void)
  54. PyObject *, PyBool_FromLong, (long)
  55. int, Py_VerboseFlag
  56. int, Py_NoSiteFlag
  57. int, Py_OptimizeFlag
  58. int, Py_NoUserSiteDirectory
  59. int, Py_DontWriteBytecodeFlag
  60. int, Py_IgnoreEnvironmentFlag
  61. PyObject *, PyObject_Str, (PyObject *)
  62. PyObject *, PyList_New, (Py_ssize_t)
  63. int, PyList_SetItem, (PyObject *, Py_ssize_t, PyObject *)
  64. int, PyList_Append, (PyObject *, PyObject *)
  65. PyObject *, PyThreadState_GetDict, (void)
  66. int, PyObject_IsTrue, (PyObject *)
  67. void, PyErr_SetString, (PyObject *, const char *)
  68. void, PyEval_InitThreads, (void)
  69. PyObject *, PyErr_NewException, (char *name, PyObject *base, PyObject *dict)
  70. int, PyModule_AddObject, (PyObject *, const char *, PyObject *)
  71. int, PyModule_AddStringConstant, (PyObject *module, const char *name, const char *value)
  72. PyObject*, PyDict_New, ()
  73. PyObject*, PyString_FromStringAndSize, (const char *v, Py_ssize_t len)
  74. int, PyDict_SetItem, (PyObject *p, PyObject *key, PyObject *val)
  75. '''.strip().splitlines()
  76. import string
  77. hfile = open("import-tab.h", "w")
  78. cfile = open("import-tab.c", "w")
  79. index = 0
  80. for decl in decls:
  81. if not decl or decl.startswith("//"):
  82. continue
  83. items = decl.split(',', 2)
  84. if len(items) == 3:
  85. # exported function with argument list
  86. restype, name, argtypes = map(string.strip, items)
  87. print >> hfile, '#define %(name)s ((%(restype)s(*)%(argtypes)s)imports[%(index)d].proc)' % locals()
  88. elif len(items) == 2:
  89. # exported data
  90. typ, name = map(string.strip, items)
  91. print >> hfile, '#define %(name)s (*(%(typ)s(*))imports[%(index)s].proc)' % locals()
  92. else:
  93. raise ValueError, "could not parse %r" % decl
  94. if name == "Py_InitModule4":
  95. print >> cfile, '#ifdef _DEBUG'
  96. print >> cfile, '\t{ "Py_InitModule4TraceRefs", NULL },' % locals()
  97. print >> cfile, '#else'
  98. print >> cfile, '# if defined (_WIN64)'
  99. print >> cfile, '\t{ "Py_InitModule4_64", NULL },' % locals()
  100. print >> cfile, '# else'
  101. print >> cfile, '\t{ "Py_InitModule4", NULL },' % locals()
  102. print >> cfile, '# endif'
  103. print >> cfile, '#endif'
  104. else:
  105. print >> cfile, '\t{ "%(name)s", NULL },' % locals()
  106. index += 1
  107. hfile.close()
  108. cfile.close()