Skip to main content

pyforge_ffi/
unicodeobject.rs

1use crate::object::*;
2use crate::pyport::Py_ssize_t;
3use libc::wchar_t;
4use std::ffi::{c_char, c_int, c_void};
5
6#[cfg(not(Py_LIMITED_API))]
7#[cfg_attr(
8    Py_3_13,
9    deprecated(note = "Deprecated since Python 3.13. Use `libc::wchar_t` instead.")
10)]
11pub type Py_UNICODE = wchar_t;
12
13pub type Py_UCS4 = u32;
14pub type Py_UCS2 = u16;
15pub type Py_UCS1 = u8;
16
17extern_libpython! {
18    pub static mut PyUnicode_Type: PyTypeObject;
19    pub static mut PyUnicodeIter_Type: PyTypeObject;
20}
21
22#[inline]
23pub unsafe fn PyUnicode_Check(op: *mut PyObject) -> c_int {
24    PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_UNICODE_SUBCLASS)
25}
26
27#[inline]
28pub unsafe fn PyUnicode_CheckExact(op: *mut PyObject) -> c_int {
29    (Py_TYPE(op) == &raw mut PyUnicode_Type) as c_int
30}
31
32pub const Py_UNICODE_REPLACEMENT_CHARACTER: Py_UCS4 = 0xFFFD;
33
34extern_libpython! {
35
36    pub fn PyUnicode_FromStringAndSize(u: *const c_char, size: Py_ssize_t) -> *mut PyObject;
37    pub fn PyUnicode_FromString(u: *const c_char) -> *mut PyObject;
38
39    pub fn PyUnicode_Substring(
40        str: *mut PyObject,
41        start: Py_ssize_t,
42        end: Py_ssize_t,
43    ) -> *mut PyObject;
44    pub fn PyUnicode_AsUCS4(
45        unicode: *mut PyObject,
46        buffer: *mut Py_UCS4,
47        buflen: Py_ssize_t,
48        copy_null: c_int,
49    ) -> *mut Py_UCS4;
50    pub fn PyUnicode_AsUCS4Copy(unicode: *mut PyObject) -> *mut Py_UCS4;
51    pub fn PyUnicode_GetLength(unicode: *mut PyObject) -> Py_ssize_t;
52    #[cfg(not(Py_3_12))]
53    #[deprecated(note = "Removed in Python 3.12")]
54    pub fn PyUnicode_GetSize(unicode: *mut PyObject) -> Py_ssize_t;
55    pub fn PyUnicode_ReadChar(unicode: *mut PyObject, index: Py_ssize_t) -> Py_UCS4;
56    pub fn PyUnicode_WriteChar(
57        unicode: *mut PyObject,
58        index: Py_ssize_t,
59        character: Py_UCS4,
60    ) -> c_int;
61    pub fn PyUnicode_Resize(unicode: *mut *mut PyObject, length: Py_ssize_t) -> c_int;
62    pub fn PyUnicode_FromEncodedObject(
63        obj: *mut PyObject,
64        encoding: *const c_char,
65        errors: *const c_char,
66    ) -> *mut PyObject;
67    pub fn PyUnicode_FromObject(obj: *mut PyObject) -> *mut PyObject;
68    // pub fn PyUnicode_FromFormatV(format: *const c_char, vargs: va_list) -> *mut PyObject;
69    pub fn PyUnicode_FromFormat(format: *const c_char, ...) -> *mut PyObject;
70    pub fn PyUnicode_InternInPlace(arg1: *mut *mut PyObject);
71    #[cfg(not(Py_3_12))]
72    #[cfg_attr(Py_3_10, deprecated(note = "Python 3.10"))]
73    pub fn PyUnicode_InternImmortal(arg1: *mut *mut PyObject);
74    pub fn PyUnicode_InternFromString(u: *const c_char) -> *mut PyObject;
75    pub fn PyUnicode_FromWideChar(w: *const wchar_t, size: Py_ssize_t) -> *mut PyObject;
76    pub fn PyUnicode_AsWideChar(
77        unicode: *mut PyObject,
78        w: *mut wchar_t,
79        size: Py_ssize_t,
80    ) -> Py_ssize_t;
81    pub fn PyUnicode_AsWideCharString(
82        unicode: *mut PyObject,
83        size: *mut Py_ssize_t,
84    ) -> *mut wchar_t;
85    pub fn PyUnicode_FromOrdinal(ordinal: c_int) -> *mut PyObject;
86    pub fn PyUnicode_ClearFreeList() -> c_int;
87    pub fn PyUnicode_GetDefaultEncoding() -> *const c_char;
88    pub fn PyUnicode_Decode(
89        s: *const c_char,
90        size: Py_ssize_t,
91        encoding: *const c_char,
92        errors: *const c_char,
93    ) -> *mut PyObject;
94    pub fn PyUnicode_AsDecodedObject(
95        unicode: *mut PyObject,
96        encoding: *const c_char,
97        errors: *const c_char,
98    ) -> *mut PyObject;
99    pub fn PyUnicode_AsDecodedUnicode(
100        unicode: *mut PyObject,
101        encoding: *const c_char,
102        errors: *const c_char,
103    ) -> *mut PyObject;
104    pub fn PyUnicode_AsEncodedObject(
105        unicode: *mut PyObject,
106        encoding: *const c_char,
107        errors: *const c_char,
108    ) -> *mut PyObject;
109    pub fn PyUnicode_AsEncodedString(
110        unicode: *mut PyObject,
111        encoding: *const c_char,
112        errors: *const c_char,
113    ) -> *mut PyObject;
114    pub fn PyUnicode_AsEncodedUnicode(
115        unicode: *mut PyObject,
116        encoding: *const c_char,
117        errors: *const c_char,
118    ) -> *mut PyObject;
119    pub fn PyUnicode_BuildEncodingMap(string: *mut PyObject) -> *mut PyObject;
120    pub fn PyUnicode_DecodeUTF7(
121        string: *const c_char,
122        length: Py_ssize_t,
123        errors: *const c_char,
124    ) -> *mut PyObject;
125    pub fn PyUnicode_DecodeUTF7Stateful(
126        string: *const c_char,
127        length: Py_ssize_t,
128        errors: *const c_char,
129        consumed: *mut Py_ssize_t,
130    ) -> *mut PyObject;
131    pub fn PyUnicode_DecodeUTF8(
132        string: *const c_char,
133        length: Py_ssize_t,
134        errors: *const c_char,
135    ) -> *mut PyObject;
136    pub fn PyUnicode_DecodeUTF8Stateful(
137        string: *const c_char,
138        length: Py_ssize_t,
139        errors: *const c_char,
140        consumed: *mut Py_ssize_t,
141    ) -> *mut PyObject;
142    pub fn PyUnicode_AsUTF8String(unicode: *mut PyObject) -> *mut PyObject;
143    #[cfg(any(Py_3_10, not(Py_LIMITED_API)))]
144    pub fn PyUnicode_AsUTF8AndSize(unicode: *mut PyObject, size: *mut Py_ssize_t) -> *const c_char;
145    pub fn PyUnicode_DecodeUTF32(
146        string: *const c_char,
147        length: Py_ssize_t,
148        errors: *const c_char,
149        byteorder: *mut c_int,
150    ) -> *mut PyObject;
151    pub fn PyUnicode_DecodeUTF32Stateful(
152        string: *const c_char,
153        length: Py_ssize_t,
154        errors: *const c_char,
155        byteorder: *mut c_int,
156        consumed: *mut Py_ssize_t,
157    ) -> *mut PyObject;
158    pub fn PyUnicode_AsUTF32String(unicode: *mut PyObject) -> *mut PyObject;
159    pub fn PyUnicode_DecodeUTF16(
160        string: *const c_char,
161        length: Py_ssize_t,
162        errors: *const c_char,
163        byteorder: *mut c_int,
164    ) -> *mut PyObject;
165    pub fn PyUnicode_DecodeUTF16Stateful(
166        string: *const c_char,
167        length: Py_ssize_t,
168        errors: *const c_char,
169        byteorder: *mut c_int,
170        consumed: *mut Py_ssize_t,
171    ) -> *mut PyObject;
172    pub fn PyUnicode_AsUTF16String(unicode: *mut PyObject) -> *mut PyObject;
173    pub fn PyUnicode_DecodeUnicodeEscape(
174        string: *const c_char,
175        length: Py_ssize_t,
176        errors: *const c_char,
177    ) -> *mut PyObject;
178    pub fn PyUnicode_AsUnicodeEscapeString(unicode: *mut PyObject) -> *mut PyObject;
179    pub fn PyUnicode_DecodeRawUnicodeEscape(
180        string: *const c_char,
181        length: Py_ssize_t,
182        errors: *const c_char,
183    ) -> *mut PyObject;
184    pub fn PyUnicode_AsRawUnicodeEscapeString(unicode: *mut PyObject) -> *mut PyObject;
185    pub fn PyUnicode_DecodeLatin1(
186        string: *const c_char,
187        length: Py_ssize_t,
188        errors: *const c_char,
189    ) -> *mut PyObject;
190    pub fn PyUnicode_AsLatin1String(unicode: *mut PyObject) -> *mut PyObject;
191    pub fn PyUnicode_DecodeASCII(
192        string: *const c_char,
193        length: Py_ssize_t,
194        errors: *const c_char,
195    ) -> *mut PyObject;
196    pub fn PyUnicode_AsASCIIString(unicode: *mut PyObject) -> *mut PyObject;
197    pub fn PyUnicode_DecodeCharmap(
198        string: *const c_char,
199        length: Py_ssize_t,
200        mapping: *mut PyObject,
201        errors: *const c_char,
202    ) -> *mut PyObject;
203    pub fn PyUnicode_AsCharmapString(
204        unicode: *mut PyObject,
205        mapping: *mut PyObject,
206    ) -> *mut PyObject;
207    pub fn PyUnicode_DecodeLocaleAndSize(
208        str: *const c_char,
209        len: Py_ssize_t,
210        errors: *const c_char,
211    ) -> *mut PyObject;
212    pub fn PyUnicode_DecodeLocale(str: *const c_char, errors: *const c_char) -> *mut PyObject;
213    pub fn PyUnicode_EncodeLocale(unicode: *mut PyObject, errors: *const c_char) -> *mut PyObject;
214    pub fn PyUnicode_FSConverter(arg1: *mut PyObject, arg2: *mut c_void) -> c_int;
215    pub fn PyUnicode_FSDecoder(arg1: *mut PyObject, arg2: *mut c_void) -> c_int;
216    pub fn PyUnicode_DecodeFSDefault(s: *const c_char) -> *mut PyObject;
217    pub fn PyUnicode_DecodeFSDefaultAndSize(s: *const c_char, size: Py_ssize_t) -> *mut PyObject;
218    pub fn PyUnicode_EncodeFSDefault(unicode: *mut PyObject) -> *mut PyObject;
219    pub fn PyUnicode_Concat(left: *mut PyObject, right: *mut PyObject) -> *mut PyObject;
220    pub fn PyUnicode_Append(pleft: *mut *mut PyObject, right: *mut PyObject);
221    pub fn PyUnicode_AppendAndDel(pleft: *mut *mut PyObject, right: *mut PyObject);
222    pub fn PyUnicode_Split(
223        s: *mut PyObject,
224        sep: *mut PyObject,
225        maxsplit: Py_ssize_t,
226    ) -> *mut PyObject;
227    pub fn PyUnicode_Splitlines(s: *mut PyObject, keepends: c_int) -> *mut PyObject;
228    pub fn PyUnicode_Partition(s: *mut PyObject, sep: *mut PyObject) -> *mut PyObject;
229    pub fn PyUnicode_RPartition(s: *mut PyObject, sep: *mut PyObject) -> *mut PyObject;
230    pub fn PyUnicode_RSplit(
231        s: *mut PyObject,
232        sep: *mut PyObject,
233        maxsplit: Py_ssize_t,
234    ) -> *mut PyObject;
235    pub fn PyUnicode_Translate(
236        str: *mut PyObject,
237        table: *mut PyObject,
238        errors: *const c_char,
239    ) -> *mut PyObject;
240    pub fn PyUnicode_Join(separator: *mut PyObject, seq: *mut PyObject) -> *mut PyObject;
241    pub fn PyUnicode_Tailmatch(
242        str: *mut PyObject,
243        substr: *mut PyObject,
244        start: Py_ssize_t,
245        end: Py_ssize_t,
246        direction: c_int,
247    ) -> Py_ssize_t;
248    pub fn PyUnicode_Find(
249        str: *mut PyObject,
250        substr: *mut PyObject,
251        start: Py_ssize_t,
252        end: Py_ssize_t,
253        direction: c_int,
254    ) -> Py_ssize_t;
255    pub fn PyUnicode_FindChar(
256        str: *mut PyObject,
257        ch: Py_UCS4,
258        start: Py_ssize_t,
259        end: Py_ssize_t,
260        direction: c_int,
261    ) -> Py_ssize_t;
262    pub fn PyUnicode_Count(
263        str: *mut PyObject,
264        substr: *mut PyObject,
265        start: Py_ssize_t,
266        end: Py_ssize_t,
267    ) -> Py_ssize_t;
268    pub fn PyUnicode_Replace(
269        str: *mut PyObject,
270        substr: *mut PyObject,
271        replstr: *mut PyObject,
272        maxcount: Py_ssize_t,
273    ) -> *mut PyObject;
274    pub fn PyUnicode_Compare(left: *mut PyObject, right: *mut PyObject) -> c_int;
275    pub fn PyUnicode_CompareWithASCIIString(left: *mut PyObject, right: *const c_char) -> c_int;
276    #[cfg(Py_3_13)]
277    pub fn PyUnicode_EqualToUTF8(unicode: *mut PyObject, string: *const c_char) -> c_int;
278    #[cfg(Py_3_13)]
279    pub fn PyUnicode_EqualToUTF8AndSize(
280        unicode: *mut PyObject,
281        string: *const c_char,
282        size: Py_ssize_t,
283    ) -> c_int;
284
285    pub fn PyUnicode_RichCompare(
286        left: *mut PyObject,
287        right: *mut PyObject,
288        op: c_int,
289    ) -> *mut PyObject;
290    pub fn PyUnicode_Format(format: *mut PyObject, args: *mut PyObject) -> *mut PyObject;
291    pub fn PyUnicode_Contains(container: *mut PyObject, element: *mut PyObject) -> c_int;
292    pub fn PyUnicode_IsIdentifier(s: *mut PyObject) -> c_int;
293}