1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
use core::ptr;
use libc::{c_char, c_int, c_long};
use methodobject::PyMethodDef;
use object::PyObject;
use pyport::Py_ssize_t;

#[cfg_attr(windows, link(name = "pythonXY"))]
extern "C" {
    pub fn PyArg_Parse(args: *mut PyObject, format: *const c_char, ...) -> c_int;
    pub fn PyArg_ParseTuple(args: *mut PyObject, format: *const c_char, ...) -> c_int;
    pub fn PyArg_ParseTupleAndKeywords(
        args: *mut PyObject,
        kw: *mut PyObject,
        format: *const c_char,
        keywords: *mut *mut c_char,
        ...
    ) -> c_int;
    pub fn PyArg_UnpackTuple(
        args: *mut PyObject,
        name: *const c_char,
        min: Py_ssize_t,
        max: Py_ssize_t,
        ...
    ) -> c_int;
    pub fn Py_BuildValue(format: *const c_char, ...) -> *mut PyObject;
    //fn _Py_BuildValue_SizeT(arg1: *const c_char, ...)
    // -> *mut PyObject;
    //fn _PyArg_NoKeywords(funcname: *const c_char,
    //                     kw: *mut PyObject) -> c_int;
    pub fn PyModule_AddObject(
        module: *mut PyObject,
        name: *const c_char,
        value: *mut PyObject,
    ) -> c_int;
    pub fn PyModule_AddIntConstant(
        module: *mut PyObject,
        name: *const c_char,
        value: c_long,
    ) -> c_int;
    pub fn PyModule_AddStringConstant(
        module: *mut PyObject,
        name: *const c_char,
        value: *const c_char,
    ) -> c_int;

    #[cfg(all(target_pointer_width = "64", not(py_sys_config = "Py_TRACE_REFS")))]
    fn Py_InitModule4_64(
        name: *const c_char,
        methods: *mut PyMethodDef,
        doc: *const c_char,
        _self: *mut PyObject,
        apiver: c_int,
    ) -> *mut PyObject;

    #[cfg(all(target_pointer_width = "64", py_sys_config = "Py_TRACE_REFS"))]
    fn Py_InitModule4TraceRefs_64(
        name: *const c_char,
        methods: *mut PyMethodDef,
        doc: *const c_char,
        _self: *mut PyObject,
        apiver: c_int,
    ) -> *mut PyObject;

    #[cfg(all(not(target_pointer_width = "64"), not(py_sys_config = "Py_TRACE_REFS")))]
    pub fn Py_InitModule4(
        name: *const c_char,
        methods: *mut PyMethodDef,
        doc: *const c_char,
        _self: *mut PyObject,
        apiver: c_int,
    ) -> *mut PyObject;

    #[cfg(all(not(target_pointer_width = "64"), py_sys_config = "Py_TRACE_REFS"))]
    fn Py_InitModule4TraceRefs(
        name: *const c_char,
        methods: *mut PyMethodDef,
        doc: *const c_char,
        _self: *mut PyObject,
        apiver: c_int,
    ) -> *mut PyObject;
}

pub const PYTHON_API_VERSION: c_int = 1013;

#[cfg(all(target_pointer_width = "64", not(py_sys_config = "Py_TRACE_REFS")))]
#[inline(always)]
pub unsafe fn Py_InitModule4(
    name: *const c_char,
    methods: *mut PyMethodDef,
    doc: *const c_char,
    _self: *mut PyObject,
    apiver: c_int,
) -> *mut PyObject {
    Py_InitModule4_64(name, methods, doc, _self, apiver)
}

#[cfg(all(target_pointer_width = "64", py_sys_config = "Py_TRACE_REFS"))]
#[inline(always)]
pub unsafe fn Py_InitModule4(
    name: *const c_char,
    methods: *mut PyMethodDef,
    doc: *const c_char,
    _self: *mut PyObject,
    apiver: c_int,
) -> *mut PyObject {
    Py_InitModule4TraceRefs_64(name, methods, doc, _self, apiver)
}

#[cfg(all(not(target_pointer_width = "64"), py_sys_config = "Py_TRACE_REFS"))]
#[inline(always)]
pub unsafe fn Py_InitModule4(
    name: *const c_char,
    methods: *mut PyMethodDef,
    doc: *const c_char,
    _self: *mut PyObject,
    apiver: c_int,
) -> *mut PyObject {
    Py_InitModule4TraceRefs(name, methods, doc, _self, apiver)
}

#[inline(always)]
pub unsafe fn Py_InitModule(name: *const c_char, methods: *mut PyMethodDef) -> *mut PyObject {
    Py_InitModule4(
        name,
        methods,
        ptr::null(),
        ptr::null_mut(),
        PYTHON_API_VERSION,
    )
}

#[inline(always)]
pub unsafe fn Py_InitModule3(
    name: *const c_char,
    methods: *mut PyMethodDef,
    doc: *const c_char,
) -> *mut PyObject {
    Py_InitModule4(name, methods, doc, ptr::null_mut(), PYTHON_API_VERSION)
}