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