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_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}