Skip to main content

pyo3_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    #[cfg_attr(PyPy, link_name = "PyPyUnicode_Type")]
19    pub static mut PyUnicode_Type: PyTypeObject;
20    pub static mut PyUnicodeIter_Type: PyTypeObject;
21
22    #[cfg(PyPy)]
23    #[link_name = "PyPyUnicode_Check"]
24    pub fn PyUnicode_Check(op: *mut PyObject) -> c_int;
25
26    #[cfg(PyPy)]
27    #[link_name = "PyPyUnicode_CheckExact"]
28    pub fn PyUnicode_CheckExact(op: *mut PyObject) -> c_int;
29}
30
31#[inline]
32#[cfg(not(PyPy))]
33pub unsafe fn PyUnicode_Check(op: *mut PyObject) -> c_int {
34    PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_UNICODE_SUBCLASS)
35}
36
37#[inline]
38#[cfg(not(PyPy))]
39pub unsafe fn PyUnicode_CheckExact(op: *mut PyObject) -> c_int {
40    (Py_TYPE(op) == &raw mut PyUnicode_Type) as c_int
41}
42
43pub const Py_UNICODE_REPLACEMENT_CHARACTER: Py_UCS4 = 0xFFFD;
44
45extern_libpython! {
46
47    #[cfg_attr(PyPy, link_name = "PyPyUnicode_FromStringAndSize")]
48    pub fn PyUnicode_FromStringAndSize(u: *const c_char, size: Py_ssize_t) -> *mut PyObject;
49    pub fn PyUnicode_FromString(u: *const c_char) -> *mut PyObject;
50
51    pub fn PyUnicode_Substring(
52        str: *mut PyObject,
53        start: Py_ssize_t,
54        end: Py_ssize_t,
55    ) -> *mut PyObject;
56    pub fn PyUnicode_AsUCS4(
57        unicode: *mut PyObject,
58        buffer: *mut Py_UCS4,
59        buflen: Py_ssize_t,
60        copy_null: c_int,
61    ) -> *mut Py_UCS4;
62    pub fn PyUnicode_AsUCS4Copy(unicode: *mut PyObject) -> *mut Py_UCS4;
63    #[cfg_attr(PyPy, link_name = "PyPyUnicode_GetLength")]
64    pub fn PyUnicode_GetLength(unicode: *mut PyObject) -> Py_ssize_t;
65    #[cfg(not(Py_3_12))]
66    #[deprecated(note = "Removed in Python 3.12")]
67    #[cfg_attr(PyPy, link_name = "PyPyUnicode_GetSize")]
68    pub fn PyUnicode_GetSize(unicode: *mut PyObject) -> Py_ssize_t;
69    pub fn PyUnicode_ReadChar(unicode: *mut PyObject, index: Py_ssize_t) -> Py_UCS4;
70    pub fn PyUnicode_WriteChar(
71        unicode: *mut PyObject,
72        index: Py_ssize_t,
73        character: Py_UCS4,
74    ) -> c_int;
75    #[cfg_attr(PyPy, link_name = "PyPyUnicode_Resize")]
76    pub fn PyUnicode_Resize(unicode: *mut *mut PyObject, length: Py_ssize_t) -> c_int;
77    #[cfg_attr(PyPy, link_name = "PyPyUnicode_FromEncodedObject")]
78    pub fn PyUnicode_FromEncodedObject(
79        obj: *mut PyObject,
80        encoding: *const c_char,
81        errors: *const c_char,
82    ) -> *mut PyObject;
83    #[cfg_attr(PyPy, link_name = "PyPyUnicode_FromObject")]
84    pub fn PyUnicode_FromObject(obj: *mut PyObject) -> *mut PyObject;
85    // #[cfg_attr(PyPy, link_name = "PyPyUnicode_FromFormatV")]
86    // pub fn PyUnicode_FromFormatV(format: *const c_char, vargs: va_list) -> *mut PyObject;
87    #[cfg_attr(PyPy, link_name = "PyPyUnicode_FromFormat")]
88    pub fn PyUnicode_FromFormat(format: *const c_char, ...) -> *mut PyObject;
89    #[cfg_attr(PyPy, link_name = "PyPyUnicode_InternInPlace")]
90    pub fn PyUnicode_InternInPlace(arg1: *mut *mut PyObject);
91    #[cfg(not(Py_3_12))]
92    #[cfg_attr(Py_3_10, deprecated(note = "Python 3.10"))]
93    pub fn PyUnicode_InternImmortal(arg1: *mut *mut PyObject);
94    #[cfg_attr(PyPy, link_name = "PyPyUnicode_InternFromString")]
95    pub fn PyUnicode_InternFromString(u: *const c_char) -> *mut PyObject;
96    #[cfg_attr(PyPy, link_name = "PyPyUnicode_FromWideChar")]
97    pub fn PyUnicode_FromWideChar(w: *const wchar_t, size: Py_ssize_t) -> *mut PyObject;
98    #[cfg_attr(PyPy, link_name = "PyPyUnicode_AsWideChar")]
99    pub fn PyUnicode_AsWideChar(
100        unicode: *mut PyObject,
101        w: *mut wchar_t,
102        size: Py_ssize_t,
103    ) -> Py_ssize_t;
104    #[cfg_attr(PyPy, link_name = "PyPyUnicode_AsWideCharString")]
105    pub fn PyUnicode_AsWideCharString(
106        unicode: *mut PyObject,
107        size: *mut Py_ssize_t,
108    ) -> *mut wchar_t;
109    #[cfg_attr(PyPy, link_name = "PyPyUnicode_FromOrdinal")]
110    pub fn PyUnicode_FromOrdinal(ordinal: c_int) -> *mut PyObject;
111    pub fn PyUnicode_ClearFreeList() -> c_int;
112    #[cfg_attr(PyPy, link_name = "PyPyUnicode_GetDefaultEncoding")]
113    pub fn PyUnicode_GetDefaultEncoding() -> *const c_char;
114    #[cfg_attr(PyPy, link_name = "PyPyUnicode_Decode")]
115    pub fn PyUnicode_Decode(
116        s: *const c_char,
117        size: Py_ssize_t,
118        encoding: *const c_char,
119        errors: *const c_char,
120    ) -> *mut PyObject;
121    pub fn PyUnicode_AsDecodedObject(
122        unicode: *mut PyObject,
123        encoding: *const c_char,
124        errors: *const c_char,
125    ) -> *mut PyObject;
126    pub fn PyUnicode_AsDecodedUnicode(
127        unicode: *mut PyObject,
128        encoding: *const c_char,
129        errors: *const c_char,
130    ) -> *mut PyObject;
131    #[cfg_attr(PyPy, link_name = "PyPyUnicode_AsEncodedObject")]
132    pub fn PyUnicode_AsEncodedObject(
133        unicode: *mut PyObject,
134        encoding: *const c_char,
135        errors: *const c_char,
136    ) -> *mut PyObject;
137    #[cfg_attr(PyPy, link_name = "PyPyUnicode_AsEncodedString")]
138    pub fn PyUnicode_AsEncodedString(
139        unicode: *mut PyObject,
140        encoding: *const c_char,
141        errors: *const c_char,
142    ) -> *mut PyObject;
143    pub fn PyUnicode_AsEncodedUnicode(
144        unicode: *mut PyObject,
145        encoding: *const c_char,
146        errors: *const c_char,
147    ) -> *mut PyObject;
148    pub fn PyUnicode_BuildEncodingMap(string: *mut PyObject) -> *mut PyObject;
149    pub fn PyUnicode_DecodeUTF7(
150        string: *const c_char,
151        length: Py_ssize_t,
152        errors: *const c_char,
153    ) -> *mut PyObject;
154    pub fn PyUnicode_DecodeUTF7Stateful(
155        string: *const c_char,
156        length: Py_ssize_t,
157        errors: *const c_char,
158        consumed: *mut Py_ssize_t,
159    ) -> *mut PyObject;
160    #[cfg_attr(PyPy, link_name = "PyPyUnicode_DecodeUTF8")]
161    pub fn PyUnicode_DecodeUTF8(
162        string: *const c_char,
163        length: Py_ssize_t,
164        errors: *const c_char,
165    ) -> *mut PyObject;
166    pub fn PyUnicode_DecodeUTF8Stateful(
167        string: *const c_char,
168        length: Py_ssize_t,
169        errors: *const c_char,
170        consumed: *mut Py_ssize_t,
171    ) -> *mut PyObject;
172    #[cfg_attr(PyPy, link_name = "PyPyUnicode_AsUTF8String")]
173    pub fn PyUnicode_AsUTF8String(unicode: *mut PyObject) -> *mut PyObject;
174    #[cfg(any(Py_3_10, not(Py_LIMITED_API)))]
175    #[cfg_attr(PyPy, link_name = "PyPyUnicode_AsUTF8AndSize")]
176    pub fn PyUnicode_AsUTF8AndSize(unicode: *mut PyObject, size: *mut Py_ssize_t) -> *const c_char;
177    #[cfg_attr(PyPy, link_name = "PyPyUnicode_DecodeUTF32")]
178    pub fn PyUnicode_DecodeUTF32(
179        string: *const c_char,
180        length: Py_ssize_t,
181        errors: *const c_char,
182        byteorder: *mut c_int,
183    ) -> *mut PyObject;
184    pub fn PyUnicode_DecodeUTF32Stateful(
185        string: *const c_char,
186        length: Py_ssize_t,
187        errors: *const c_char,
188        byteorder: *mut c_int,
189        consumed: *mut Py_ssize_t,
190    ) -> *mut PyObject;
191    #[cfg_attr(PyPy, link_name = "PyPyUnicode_AsUTF32String")]
192    pub fn PyUnicode_AsUTF32String(unicode: *mut PyObject) -> *mut PyObject;
193    #[cfg_attr(PyPy, link_name = "PyPyUnicode_DecodeUTF16")]
194    pub fn PyUnicode_DecodeUTF16(
195        string: *const c_char,
196        length: Py_ssize_t,
197        errors: *const c_char,
198        byteorder: *mut c_int,
199    ) -> *mut PyObject;
200    pub fn PyUnicode_DecodeUTF16Stateful(
201        string: *const c_char,
202        length: Py_ssize_t,
203        errors: *const c_char,
204        byteorder: *mut c_int,
205        consumed: *mut Py_ssize_t,
206    ) -> *mut PyObject;
207    #[cfg_attr(PyPy, link_name = "PyPyUnicode_AsUTF16String")]
208    pub fn PyUnicode_AsUTF16String(unicode: *mut PyObject) -> *mut PyObject;
209    pub fn PyUnicode_DecodeUnicodeEscape(
210        string: *const c_char,
211        length: Py_ssize_t,
212        errors: *const c_char,
213    ) -> *mut PyObject;
214    #[cfg_attr(PyPy, link_name = "PyPyUnicode_AsUnicodeEscapeString")]
215    pub fn PyUnicode_AsUnicodeEscapeString(unicode: *mut PyObject) -> *mut PyObject;
216    pub fn PyUnicode_DecodeRawUnicodeEscape(
217        string: *const c_char,
218        length: Py_ssize_t,
219        errors: *const c_char,
220    ) -> *mut PyObject;
221    pub fn PyUnicode_AsRawUnicodeEscapeString(unicode: *mut PyObject) -> *mut PyObject;
222    #[cfg_attr(PyPy, link_name = "PyPyUnicode_DecodeLatin1")]
223    pub fn PyUnicode_DecodeLatin1(
224        string: *const c_char,
225        length: Py_ssize_t,
226        errors: *const c_char,
227    ) -> *mut PyObject;
228    #[cfg_attr(PyPy, link_name = "PyPyUnicode_AsLatin1String")]
229    pub fn PyUnicode_AsLatin1String(unicode: *mut PyObject) -> *mut PyObject;
230    #[cfg_attr(PyPy, link_name = "PyPyUnicode_DecodeASCII")]
231    pub fn PyUnicode_DecodeASCII(
232        string: *const c_char,
233        length: Py_ssize_t,
234        errors: *const c_char,
235    ) -> *mut PyObject;
236    #[cfg_attr(PyPy, link_name = "PyPyUnicode_AsASCIIString")]
237    pub fn PyUnicode_AsASCIIString(unicode: *mut PyObject) -> *mut PyObject;
238    pub fn PyUnicode_DecodeCharmap(
239        string: *const c_char,
240        length: Py_ssize_t,
241        mapping: *mut PyObject,
242        errors: *const c_char,
243    ) -> *mut PyObject;
244    pub fn PyUnicode_AsCharmapString(
245        unicode: *mut PyObject,
246        mapping: *mut PyObject,
247    ) -> *mut PyObject;
248    pub fn PyUnicode_DecodeLocaleAndSize(
249        str: *const c_char,
250        len: Py_ssize_t,
251        errors: *const c_char,
252    ) -> *mut PyObject;
253    pub fn PyUnicode_DecodeLocale(str: *const c_char, errors: *const c_char) -> *mut PyObject;
254    pub fn PyUnicode_EncodeLocale(unicode: *mut PyObject, errors: *const c_char) -> *mut PyObject;
255    #[cfg_attr(PyPy, link_name = "PyPyUnicode_FSConverter")]
256    pub fn PyUnicode_FSConverter(arg1: *mut PyObject, arg2: *mut c_void) -> c_int;
257    #[cfg_attr(PyPy, link_name = "PyPyUnicode_FSDecoder")]
258    pub fn PyUnicode_FSDecoder(arg1: *mut PyObject, arg2: *mut c_void) -> c_int;
259    #[cfg_attr(PyPy, link_name = "PyPyUnicode_DecodeFSDefault")]
260    pub fn PyUnicode_DecodeFSDefault(s: *const c_char) -> *mut PyObject;
261    #[cfg_attr(PyPy, link_name = "PyPyUnicode_DecodeFSDefaultAndSize")]
262    pub fn PyUnicode_DecodeFSDefaultAndSize(s: *const c_char, size: Py_ssize_t) -> *mut PyObject;
263    #[cfg_attr(PyPy, link_name = "PyPyUnicode_EncodeFSDefault")]
264    pub fn PyUnicode_EncodeFSDefault(unicode: *mut PyObject) -> *mut PyObject;
265    #[cfg_attr(PyPy, link_name = "PyPyUnicode_Concat")]
266    pub fn PyUnicode_Concat(left: *mut PyObject, right: *mut PyObject) -> *mut PyObject;
267    pub fn PyUnicode_Append(pleft: *mut *mut PyObject, right: *mut PyObject);
268    pub fn PyUnicode_AppendAndDel(pleft: *mut *mut PyObject, right: *mut PyObject);
269    #[cfg_attr(PyPy, link_name = "PyPyUnicode_Split")]
270    pub fn PyUnicode_Split(
271        s: *mut PyObject,
272        sep: *mut PyObject,
273        maxsplit: Py_ssize_t,
274    ) -> *mut PyObject;
275    #[cfg_attr(PyPy, link_name = "PyPyUnicode_Splitlines")]
276    pub fn PyUnicode_Splitlines(s: *mut PyObject, keepends: c_int) -> *mut PyObject;
277    pub fn PyUnicode_Partition(s: *mut PyObject, sep: *mut PyObject) -> *mut PyObject;
278    pub fn PyUnicode_RPartition(s: *mut PyObject, sep: *mut PyObject) -> *mut PyObject;
279    pub fn PyUnicode_RSplit(
280        s: *mut PyObject,
281        sep: *mut PyObject,
282        maxsplit: Py_ssize_t,
283    ) -> *mut PyObject;
284    pub fn PyUnicode_Translate(
285        str: *mut PyObject,
286        table: *mut PyObject,
287        errors: *const c_char,
288    ) -> *mut PyObject;
289    #[cfg_attr(PyPy, link_name = "PyPyUnicode_Join")]
290    pub fn PyUnicode_Join(separator: *mut PyObject, seq: *mut PyObject) -> *mut PyObject;
291    #[cfg_attr(PyPy, link_name = "PyPyUnicode_Tailmatch")]
292    pub fn PyUnicode_Tailmatch(
293        str: *mut PyObject,
294        substr: *mut PyObject,
295        start: Py_ssize_t,
296        end: Py_ssize_t,
297        direction: c_int,
298    ) -> Py_ssize_t;
299    #[cfg_attr(PyPy, link_name = "PyPyUnicode_Find")]
300    pub fn PyUnicode_Find(
301        str: *mut PyObject,
302        substr: *mut PyObject,
303        start: Py_ssize_t,
304        end: Py_ssize_t,
305        direction: c_int,
306    ) -> Py_ssize_t;
307    pub fn PyUnicode_FindChar(
308        str: *mut PyObject,
309        ch: Py_UCS4,
310        start: Py_ssize_t,
311        end: Py_ssize_t,
312        direction: c_int,
313    ) -> Py_ssize_t;
314    #[cfg_attr(PyPy, link_name = "PyPyUnicode_Count")]
315    pub fn PyUnicode_Count(
316        str: *mut PyObject,
317        substr: *mut PyObject,
318        start: Py_ssize_t,
319        end: Py_ssize_t,
320    ) -> Py_ssize_t;
321    #[cfg_attr(PyPy, link_name = "PyPyUnicode_Replace")]
322    pub fn PyUnicode_Replace(
323        str: *mut PyObject,
324        substr: *mut PyObject,
325        replstr: *mut PyObject,
326        maxcount: Py_ssize_t,
327    ) -> *mut PyObject;
328    #[cfg_attr(PyPy, link_name = "PyPyUnicode_Compare")]
329    pub fn PyUnicode_Compare(left: *mut PyObject, right: *mut PyObject) -> c_int;
330    #[cfg_attr(PyPy, link_name = "PyPyUnicode_CompareWithASCIIString")]
331    pub fn PyUnicode_CompareWithASCIIString(left: *mut PyObject, right: *const c_char) -> c_int;
332    #[cfg(Py_3_13)]
333    pub fn PyUnicode_EqualToUTF8(unicode: *mut PyObject, string: *const c_char) -> c_int;
334    #[cfg(Py_3_13)]
335    pub fn PyUnicode_EqualToUTF8AndSize(
336        unicode: *mut PyObject,
337        string: *const c_char,
338        size: Py_ssize_t,
339    ) -> c_int;
340
341    pub fn PyUnicode_RichCompare(
342        left: *mut PyObject,
343        right: *mut PyObject,
344        op: c_int,
345    ) -> *mut PyObject;
346    #[cfg_attr(PyPy, link_name = "PyPyUnicode_Format")]
347    pub fn PyUnicode_Format(format: *mut PyObject, args: *mut PyObject) -> *mut PyObject;
348    pub fn PyUnicode_Contains(container: *mut PyObject, element: *mut PyObject) -> c_int;
349    pub fn PyUnicode_IsIdentifier(s: *mut PyObject) -> c_int;
350}