1use core::ptr;
2use libc::{c_char, c_int, c_long};
3
4use crate::methodobject::PyMethodDef;
5use crate::object::PyObject;
6use crate::pyport::Py_ssize_t;
7
8#[cfg_attr(windows, link(name = "pythonXY"))]
9extern "C" {
10 pub fn PyArg_Parse(args: *mut PyObject, format: *const c_char, ...) -> c_int;
11 pub fn PyArg_ParseTuple(args: *mut PyObject, format: *const c_char, ...) -> c_int;
12 pub fn PyArg_ParseTupleAndKeywords(
13 args: *mut PyObject,
14 kw: *mut PyObject,
15 format: *const c_char,
16 keywords: *mut *mut c_char,
17 ...
18 ) -> c_int;
19 pub fn PyArg_UnpackTuple(
20 args: *mut PyObject,
21 name: *const c_char,
22 min: Py_ssize_t,
23 max: Py_ssize_t,
24 ...
25 ) -> c_int;
26 pub fn Py_BuildValue(format: *const c_char, ...) -> *mut PyObject;
27
28 ignore! {
29 fn _Py_BuildValue_SizeT(arg1: *const c_char, ...) -> *mut PyObject;
30 fn _PyArg_NoKeywords(funcname: *const c_char, kw: *mut PyObject) -> c_int;
31 }
32
33 pub fn PyModule_AddObject(
34 module: *mut PyObject,
35 name: *const c_char,
36 value: *mut PyObject,
37 ) -> c_int;
38 pub fn PyModule_AddIntConstant(
39 module: *mut PyObject,
40 name: *const c_char,
41 value: c_long,
42 ) -> c_int;
43 pub fn PyModule_AddStringConstant(
44 module: *mut PyObject,
45 name: *const c_char,
46 value: *const c_char,
47 ) -> c_int;
48
49 #[cfg(all(target_pointer_width = "64", not(py_sys_config = "Py_TRACE_REFS")))]
50 fn Py_InitModule4_64(
51 name: *const c_char,
52 methods: *mut PyMethodDef,
53 doc: *const c_char,
54 _self: *mut PyObject,
55 apiver: c_int,
56 ) -> *mut PyObject;
57
58 #[cfg(all(target_pointer_width = "64", py_sys_config = "Py_TRACE_REFS"))]
59 fn Py_InitModule4TraceRefs_64(
60 name: *const c_char,
61 methods: *mut PyMethodDef,
62 doc: *const c_char,
63 _self: *mut PyObject,
64 apiver: c_int,
65 ) -> *mut PyObject;
66
67 #[cfg(all(not(target_pointer_width = "64"), not(py_sys_config = "Py_TRACE_REFS")))]
68 pub fn Py_InitModule4(
69 name: *const c_char,
70 methods: *mut PyMethodDef,
71 doc: *const c_char,
72 _self: *mut PyObject,
73 apiver: c_int,
74 ) -> *mut PyObject;
75
76 #[cfg(all(not(target_pointer_width = "64"), py_sys_config = "Py_TRACE_REFS"))]
77 fn Py_InitModule4TraceRefs(
78 name: *const c_char,
79 methods: *mut PyMethodDef,
80 doc: *const c_char,
81 _self: *mut PyObject,
82 apiver: c_int,
83 ) -> *mut PyObject;
84}
85
86pub const PYTHON_API_VERSION: c_int = 1013;
87
88#[cfg(all(target_pointer_width = "64", not(py_sys_config = "Py_TRACE_REFS")))]
89#[inline(always)]
90pub unsafe fn Py_InitModule4(
91 name: *const c_char,
92 methods: *mut PyMethodDef,
93 doc: *const c_char,
94 _self: *mut PyObject,
95 apiver: c_int,
96) -> *mut PyObject {
97 Py_InitModule4_64(name, methods, doc, _self, apiver)
98}
99
100#[cfg(all(target_pointer_width = "64", py_sys_config = "Py_TRACE_REFS"))]
101#[inline(always)]
102pub unsafe fn Py_InitModule4(
103 name: *const c_char,
104 methods: *mut PyMethodDef,
105 doc: *const c_char,
106 _self: *mut PyObject,
107 apiver: c_int,
108) -> *mut PyObject {
109 Py_InitModule4TraceRefs_64(name, methods, doc, _self, apiver)
110}
111
112#[cfg(all(not(target_pointer_width = "64"), py_sys_config = "Py_TRACE_REFS"))]
113#[inline(always)]
114pub unsafe fn Py_InitModule4(
115 name: *const c_char,
116 methods: *mut PyMethodDef,
117 doc: *const c_char,
118 _self: *mut PyObject,
119 apiver: c_int,
120) -> *mut PyObject {
121 Py_InitModule4TraceRefs(name, methods, doc, _self, apiver)
122}
123
124#[inline(always)]
125pub unsafe fn Py_InitModule(name: *const c_char, methods: *mut PyMethodDef) -> *mut PyObject {
126 Py_InitModule4(
127 name,
128 methods,
129 ptr::null(),
130 ptr::null_mut(),
131 PYTHON_API_VERSION,
132 )
133}
134
135#[inline(always)]
136pub unsafe fn Py_InitModule3(
137 name: *const c_char,
138 methods: *mut PyMethodDef,
139 doc: *const c_char,
140) -> *mut PyObject {
141 Py_InitModule4(name, methods, doc, ptr::null_mut(), PYTHON_API_VERSION)
142}