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
140
141
142
143
use libc::{c_char, c_int, c_long};

use crate::object::*;
use crate::pyport::Py_ssize_t;

#[repr(C)]
#[allow(missing_copy_implementations)]
pub struct PyStringObject {
    #[cfg(py_sys_config = "Py_TRACE_REFS")]
    pub _ob_next: *mut PyObject,
    #[cfg(py_sys_config = "Py_TRACE_REFS")]
    pub _ob_prev: *mut PyObject,
    pub ob_refcnt: Py_ssize_t,
    pub ob_type: *mut PyTypeObject,
    pub ob_size: Py_ssize_t,
    pub ob_shash: c_long,
    pub ob_sstate: c_int,
    pub ob_sval: [c_char; 1],
}

#[cfg_attr(windows, link(name = "pythonXY"))]
extern "C" {
    pub static mut PyBaseString_Type: PyTypeObject;
    pub static mut PyString_Type: PyTypeObject;
}

#[inline(always)]
pub unsafe fn PyString_Check(op: *mut PyObject) -> c_int {
    PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_STRING_SUBCLASS)
}

#[inline(always)]
pub unsafe fn PyString_CheckExact(op: *mut PyObject) -> c_int {
    let u: *mut PyTypeObject = &mut PyString_Type;
    (Py_TYPE(op) == u) as c_int
}

#[inline(always)]
pub unsafe fn PyString_GET_SIZE(op: *mut PyObject) -> Py_ssize_t {
    (*(op as *mut PyStringObject)).ob_size
}

#[inline(always)]
pub unsafe fn PyString_AS_STRING(op: *mut PyObject) -> *mut c_char {
    (*(op as *mut PyStringObject)).ob_sval.as_mut_ptr()
}

#[cfg_attr(windows, link(name = "pythonXY"))]
extern "C" {
    pub fn PyString_FromString(v: *const c_char) -> *mut PyObject;
    pub fn PyString_FromStringAndSize(v: *const c_char, len: Py_ssize_t) -> *mut PyObject;
    pub fn PyString_FromFormat(format: *const c_char, ...) -> *mut PyObject;
    pub fn PyString_Size(string: *mut PyObject) -> Py_ssize_t;
    pub fn PyString_AsString(string: *mut PyObject) -> *mut c_char;
    pub fn PyString_AsStringAndSize(
        obj: *mut PyObject,
        s: *mut *mut c_char,
        len: *mut Py_ssize_t,
    ) -> c_int;
    pub fn PyString_Concat(string: *mut *mut PyObject, newpart: *mut PyObject);
    pub fn PyString_ConcatAndDel(string: *mut *mut PyObject, newpart: *mut PyObject);
    pub fn _PyString_Resize(string: *mut *mut PyObject, newsize: Py_ssize_t) -> c_int;
    pub fn PyString_Format(format: *mut PyObject, args: *mut PyObject) -> *mut PyObject;
    pub fn PyString_InternInPlace(string: *mut *mut PyObject);
    pub fn PyString_InternFromString(v: *const c_char) -> *mut PyObject;
    pub fn PyString_Decode(
        s: *const c_char,
        size: Py_ssize_t,
        encoding: *const c_char,
        errors: *const c_char,
    ) -> *mut PyObject;
    pub fn PyString_AsDecodedObject(
        str: *mut PyObject,
        encoding: *const c_char,
        errors: *const c_char,
    ) -> *mut PyObject;
    pub fn PyString_Encode(
        s: *const c_char,
        size: Py_ssize_t,
        encoding: *const c_char,
        errors: *const c_char,
    ) -> *mut PyObject;
    pub fn PyString_AsEncodedObject(
        str: *mut PyObject,
        encoding: *const c_char,
        errors: *const c_char,
    ) -> *mut PyObject;

    ignore! {
        pub fn PyString_Repr(arg1: *mut PyObject, arg2: c_int) -> *mut PyObject;
        pub fn _PyString_Eq(arg1: *mut PyObject, arg2: *mut PyObject) -> c_int;
        pub fn _PyString_FormatLong(
            arg1: *mut PyObject,
            arg2: c_int,
            arg3: c_int,
            arg4: c_int,
            arg5: *mut *mut c_char,
            arg6: *mut c_int,
        ) -> *mut PyObject;
        pub fn PyString_DecodeEscape(
            arg1: *const c_char,
            arg2: Py_ssize_t,
            arg3: *const c_char,
            arg4: Py_ssize_t,
            arg5: *const c_char,
        ) -> *mut PyObject;
        pub fn PyString_InternImmortal(arg1: *mut *mut PyObject);
        pub fn _Py_ReleaseInternedStrings();
        pub fn _PyString_Join(sep: *mut PyObject, x: *mut PyObject) -> *mut PyObject;
        pub fn PyString_AsEncodedString(
            str: *mut PyObject,
            encoding: *const c_char,
            errors: *const c_char,
        ) -> *mut PyObject;
        pub fn PyString_AsDecodedString(
            str: *mut PyObject,
            encoding: *const c_char,
            errors: *const c_char,
        ) -> *mut PyObject;

        pub fn _PyString_InsertThousandsGroupingLocale(
            buffer: *mut c_char,
            n_buffer: Py_ssize_t,
            digits: *mut c_char,
            n_digits: Py_ssize_t,
            min_width: Py_ssize_t,
        ) -> Py_ssize_t;
        pub fn _PyString_InsertThousandsGrouping(
            buffer: *mut c_char,
            n_buffer: Py_ssize_t,
            digits: *mut c_char,
            n_digits: Py_ssize_t,
            min_width: Py_ssize_t,
            grouping: *const c_char,
            thousands_sep: *const c_char,
        ) -> Py_ssize_t;
        pub fn _PyBytes_FormatAdvanced(
            obj: *mut PyObject,
            format_spec: *mut c_char,
            format_spec_len: Py_ssize_t,
        ) -> *mut PyObject;
    }
}