python27_sys/
unicodeobject.rs

1use libc::{c_char, c_double, c_int, c_long, wchar_t};
2
3use crate::object::*;
4use crate::pyport::Py_ssize_t;
5
6#[cfg(py_sys_config = "Py_UNICODE_SIZE_4")]
7pub const Py_UNICODE_SIZE: Py_ssize_t = 4;
8#[cfg(not(py_sys_config = "Py_UNICODE_SIZE_4"))]
9pub const Py_UNICODE_SIZE: Py_ssize_t = 2;
10
11pub type Py_UCS4 = u32;
12
13#[cfg(py_sys_config = "Py_UNICODE_SIZE_4")]
14pub type Py_UNICODE = u32;
15#[cfg(not(py_sys_config = "Py_UNICODE_SIZE_4"))]
16pub type Py_UNICODE = u16;
17
18#[repr(C)]
19#[derive(Copy, Clone)]
20pub struct PyUnicodeObject {
21    #[cfg(py_sys_config = "Py_TRACE_REFS")]
22    pub _ob_next: *mut PyObject,
23    #[cfg(py_sys_config = "Py_TRACE_REFS")]
24    pub _ob_prev: *mut PyObject,
25    pub ob_refcnt: Py_ssize_t,
26    pub ob_type: *mut PyTypeObject,
27    pub length: Py_ssize_t,
28    pub data: *mut Py_UNICODE,
29    pub hash: c_long,
30    pub defenc: *mut PyObject,
31}
32
33#[cfg_attr(windows, link(name = "pythonXY"))]
34extern "C" {
35    pub static mut PyUnicode_Type: PyTypeObject;
36}
37
38#[inline(always)]
39pub unsafe fn PyUnicode_Check(op: *mut PyObject) -> c_int {
40    PyType_FastSubclass(Py_TYPE(op), Py_TPFLAGS_UNICODE_SUBCLASS)
41}
42
43#[inline(always)]
44pub unsafe fn PyUnicode_CheckExact(op: *mut PyObject) -> c_int {
45    let u: *mut PyTypeObject = &mut PyUnicode_Type;
46    (Py_TYPE(op) == u) as c_int
47}
48
49#[inline(always)]
50pub unsafe fn PyUnicode_GET_SIZE(o: *mut PyObject) -> Py_ssize_t {
51    (*(o as *mut PyUnicodeObject)).length
52}
53
54#[inline(always)]
55pub unsafe fn PyUnicode_GET_DATA_SIZE(o: *mut PyObject) -> Py_ssize_t {
56    (*(o as *mut PyUnicodeObject)).length * Py_UNICODE_SIZE
57}
58
59#[inline(always)]
60pub unsafe fn PyUnicode_AS_UNICODE(o: *mut PyObject) -> *mut Py_UNICODE {
61    (*(o as *mut PyUnicodeObject)).data
62}
63
64#[inline(always)]
65pub unsafe fn PyUnicode_AS_DATA(o: *mut PyObject) -> *const c_char {
66    (*(o as *mut PyUnicodeObject)).data as *const c_char
67}
68
69pub const Py_UNICODE_REPLACEMENT_CHARACTER: Py_UNICODE = 0xFFFD;
70
71#[allow(dead_code)]
72#[cfg(py_sys_config = "Py_UNICODE_SIZE_4")]
73#[cfg_attr(windows, link(name = "pythonXY"))]
74extern "C" {
75    fn PyUnicodeUCS4_FromUnicode(u: *const Py_UNICODE, size: Py_ssize_t) -> *mut PyObject;
76    fn PyUnicodeUCS4_FromStringAndSize(u: *const c_char, size: Py_ssize_t) -> *mut PyObject;
77    fn PyUnicodeUCS4_FromString(u: *const c_char) -> *mut PyObject;
78    fn PyUnicodeUCS4_AsUnicode(unicode: *mut PyObject) -> *mut Py_UNICODE;
79    fn PyUnicodeUCS4_GetSize(unicode: *mut PyObject) -> Py_ssize_t;
80    fn PyUnicodeUCS4_GetMax() -> Py_UNICODE;
81    fn PyUnicodeUCS4_Resize(unicode: *mut *mut PyObject, length: Py_ssize_t) -> c_int;
82    fn PyUnicodeUCS4_FromEncodedObject(
83        obj: *mut PyObject,
84        encoding: *const c_char,
85        errors: *const c_char,
86    ) -> *mut PyObject;
87    fn PyUnicodeUCS4_FromObject(obj: *mut PyObject) -> *mut PyObject;
88    fn PyUnicodeUCS4_FromFormatV(arg1: *const c_char, ...) -> *mut PyObject;
89    fn PyUnicodeUCS4_FromFormat(arg1: *const c_char, ...) -> *mut PyObject;
90    fn _PyUnicode_FormatAdvanced(
91        obj: *mut PyObject,
92        format_spec: *mut Py_UNICODE,
93        format_spec_len: Py_ssize_t,
94    ) -> *mut PyObject;
95    fn PyUnicodeUCS4_FromWideChar(w: *const wchar_t, size: Py_ssize_t) -> *mut PyObject;
96    fn PyUnicodeUCS4_AsWideChar(
97        unicode: *mut PyUnicodeObject,
98        w: *mut wchar_t,
99        size: Py_ssize_t,
100    ) -> Py_ssize_t;
101    fn PyUnicodeUCS4_FromOrdinal(ordinal: c_int) -> *mut PyObject;
102    fn PyUnicodeUCS4_ClearFreelist() -> c_int;
103    fn _PyUnicodeUCS4_AsDefaultEncodedString(
104        arg1: *mut PyObject,
105        arg2: *const c_char,
106    ) -> *mut PyObject;
107    fn PyUnicodeUCS4_GetDefaultEncoding() -> *const c_char;
108    fn PyUnicodeUCS4_SetDefaultEncoding(encoding: *const c_char) -> c_int;
109    fn PyUnicodeUCS4_Decode(
110        s: *const c_char,
111        size: Py_ssize_t,
112        encoding: *const c_char,
113        errors: *const c_char,
114    ) -> *mut PyObject;
115    fn PyUnicodeUCS4_Encode(
116        s: *const Py_UNICODE,
117        size: Py_ssize_t,
118        encoding: *const c_char,
119        errors: *const c_char,
120    ) -> *mut PyObject;
121    fn PyUnicodeUCS4_AsEncodedObject(
122        unicode: *mut PyObject,
123        encoding: *const c_char,
124        errors: *const c_char,
125    ) -> *mut PyObject;
126    fn PyUnicodeUCS4_AsEncodedString(
127        unicode: *mut PyObject,
128        encoding: *const c_char,
129        errors: *const c_char,
130    ) -> *mut PyObject;
131    fn PyUnicode_BuildEncodingMap(string: *mut PyObject) -> *mut PyObject;
132    fn PyUnicode_DecodeUTF7(
133        string: *const c_char,
134        length: Py_ssize_t,
135        errors: *const c_char,
136    ) -> *mut PyObject;
137    fn PyUnicode_DecodeUTF7Stateful(
138        string: *const c_char,
139        length: Py_ssize_t,
140        errors: *const c_char,
141        consumed: *mut Py_ssize_t,
142    ) -> *mut PyObject;
143    fn PyUnicode_EncodeUTF7(
144        data: *const Py_UNICODE,
145        length: Py_ssize_t,
146        base64SetO: c_int,
147        base64WhiteSpace: c_int,
148        errors: *const c_char,
149    ) -> *mut PyObject;
150    fn PyUnicodeUCS4_DecodeUTF8(
151        string: *const c_char,
152        length: Py_ssize_t,
153        errors: *const c_char,
154    ) -> *mut PyObject;
155    fn PyUnicodeUCS4_DecodeUTF8Stateful(
156        string: *const c_char,
157        length: Py_ssize_t,
158        errors: *const c_char,
159        consumed: *mut Py_ssize_t,
160    ) -> *mut PyObject;
161    fn PyUnicodeUCS4_AsUTF8String(unicode: *mut PyObject) -> *mut PyObject;
162    fn PyUnicodeUCS4_EncodeUTF8(
163        data: *const Py_UNICODE,
164        length: Py_ssize_t,
165        errors: *const c_char,
166    ) -> *mut PyObject;
167    fn PyUnicodeUCS4_DecodeUTF32(
168        string: *const c_char,
169        length: Py_ssize_t,
170        errors: *const c_char,
171        byteorder: *mut c_int,
172    ) -> *mut PyObject;
173    fn PyUnicodeUCS4_DecodeUTF32Stateful(
174        string: *const c_char,
175        length: Py_ssize_t,
176        errors: *const c_char,
177        byteorder: *mut c_int,
178        consumed: *mut Py_ssize_t,
179    ) -> *mut PyObject;
180    fn PyUnicodeUCS4_AsUTF32String(unicode: *mut PyObject) -> *mut PyObject;
181    fn PyUnicodeUCS4_EncodeUTF32(
182        data: *const Py_UNICODE,
183        length: Py_ssize_t,
184        errors: *const c_char,
185        byteorder: c_int,
186    ) -> *mut PyObject;
187    fn PyUnicodeUCS4_DecodeUTF16(
188        string: *const c_char,
189        length: Py_ssize_t,
190        errors: *const c_char,
191        byteorder: *mut c_int,
192    ) -> *mut PyObject;
193    fn PyUnicodeUCS4_DecodeUTF16Stateful(
194        string: *const c_char,
195        length: Py_ssize_t,
196        errors: *const c_char,
197        byteorder: *mut c_int,
198        consumed: *mut Py_ssize_t,
199    ) -> *mut PyObject;
200    fn PyUnicodeUCS4_AsUTF16String(unicode: *mut PyObject) -> *mut PyObject;
201    fn PyUnicodeUCS4_EncodeUTF16(
202        data: *const Py_UNICODE,
203        length: Py_ssize_t,
204        errors: *const c_char,
205        byteorder: c_int,
206    ) -> *mut PyObject;
207    fn PyUnicodeUCS4_DecodeUnicodeEscape(
208        string: *const c_char,
209        length: Py_ssize_t,
210        errors: *const c_char,
211    ) -> *mut PyObject;
212    fn PyUnicodeUCS4_AsUnicodeEscapeString(unicode: *mut PyObject) -> *mut PyObject;
213    fn PyUnicodeUCS4_EncodeUnicodeEscape(
214        data: *const Py_UNICODE,
215        length: Py_ssize_t,
216    ) -> *mut PyObject;
217    fn PyUnicodeUCS4_DecodeRawUnicodeEscape(
218        string: *const c_char,
219        length: Py_ssize_t,
220        errors: *const c_char,
221    ) -> *mut PyObject;
222    fn PyUnicodeUCS4_AsRawUnicodeEscapeString(unicode: *mut PyObject) -> *mut PyObject;
223    fn PyUnicodeUCS4_EncodeRawUnicodeEscape(
224        data: *const Py_UNICODE,
225        length: Py_ssize_t,
226    ) -> *mut PyObject;
227    fn _PyUnicode_DecodeUnicodeInternal(
228        string: *const c_char,
229        length: Py_ssize_t,
230        errors: *const c_char,
231    ) -> *mut PyObject;
232    fn PyUnicodeUCS4_DecodeLatin1(
233        string: *const c_char,
234        length: Py_ssize_t,
235        errors: *const c_char,
236    ) -> *mut PyObject;
237    fn PyUnicodeUCS4_AsLatin1String(unicode: *mut PyObject) -> *mut PyObject;
238    fn PyUnicodeUCS4_EncodeLatin1(
239        data: *const Py_UNICODE,
240        length: Py_ssize_t,
241        errors: *const c_char,
242    ) -> *mut PyObject;
243    fn PyUnicodeUCS4_DecodeASCII(
244        string: *const c_char,
245        length: Py_ssize_t,
246        errors: *const c_char,
247    ) -> *mut PyObject;
248    fn PyUnicodeUCS4_AsASCIIString(unicode: *mut PyObject) -> *mut PyObject;
249    fn PyUnicodeUCS4_EncodeASCII(
250        data: *const Py_UNICODE,
251        length: Py_ssize_t,
252        errors: *const c_char,
253    ) -> *mut PyObject;
254    fn PyUnicodeUCS4_DecodeCharmap(
255        string: *const c_char,
256        length: Py_ssize_t,
257        mapping: *mut PyObject,
258        errors: *const c_char,
259    ) -> *mut PyObject;
260    fn PyUnicodeUCS4_AsCharmapString(
261        unicode: *mut PyObject,
262        mapping: *mut PyObject,
263    ) -> *mut PyObject;
264    fn PyUnicodeUCS4_EncodeCharmap(
265        data: *const Py_UNICODE,
266        length: Py_ssize_t,
267        mapping: *mut PyObject,
268        errors: *const c_char,
269    ) -> *mut PyObject;
270    fn PyUnicodeUCS4_TranslateCharmap(
271        data: *const Py_UNICODE,
272        length: Py_ssize_t,
273        table: *mut PyObject,
274        errors: *const c_char,
275    ) -> *mut PyObject;
276    fn PyUnicodeUCS4_EncodeDecimal(
277        s: *mut Py_UNICODE,
278        length: Py_ssize_t,
279        output: *mut c_char,
280        errors: *const c_char,
281    ) -> c_int;
282    fn PyUnicodeUCS4_Concat(left: *mut PyObject, right: *mut PyObject) -> *mut PyObject;
283    fn PyUnicodeUCS4_Split(
284        s: *mut PyObject,
285        sep: *mut PyObject,
286        maxsplit: Py_ssize_t,
287    ) -> *mut PyObject;
288    fn PyUnicodeUCS4_Splitlines(s: *mut PyObject, keepends: c_int) -> *mut PyObject;
289    fn PyUnicodeUCS4_Partition(s: *mut PyObject, sep: *mut PyObject) -> *mut PyObject;
290    fn PyUnicodeUCS4_RPartition(s: *mut PyObject, sep: *mut PyObject) -> *mut PyObject;
291    fn PyUnicodeUCS4_RSplit(
292        s: *mut PyObject,
293        sep: *mut PyObject,
294        maxsplit: Py_ssize_t,
295    ) -> *mut PyObject;
296    fn PyUnicodeUCS4_Translate(
297        str: *mut PyObject,
298        table: *mut PyObject,
299        errors: *const c_char,
300    ) -> *mut PyObject;
301    fn PyUnicodeUCS4_Join(separator: *mut PyObject, seq: *mut PyObject) -> *mut PyObject;
302    fn PyUnicodeUCS4_Tailmatch(
303        str: *mut PyObject,
304        substr: *mut PyObject,
305        start: Py_ssize_t,
306        end: Py_ssize_t,
307        direction: c_int,
308    ) -> Py_ssize_t;
309    fn PyUnicodeUCS4_Find(
310        str: *mut PyObject,
311        substr: *mut PyObject,
312        start: Py_ssize_t,
313        end: Py_ssize_t,
314        direction: c_int,
315    ) -> Py_ssize_t;
316    fn PyUnicodeUCS4_Count(
317        str: *mut PyObject,
318        substr: *mut PyObject,
319        start: Py_ssize_t,
320        end: Py_ssize_t,
321    ) -> Py_ssize_t;
322    fn PyUnicodeUCS4_Replace(
323        str: *mut PyObject,
324        substr: *mut PyObject,
325        replstr: *mut PyObject,
326        maxcount: Py_ssize_t,
327    ) -> *mut PyObject;
328    fn PyUnicodeUCS4_Compare(left: *mut PyObject, right: *mut PyObject) -> c_int;
329    fn PyUnicodeUCS4_RichCompare(
330        left: *mut PyObject,
331        right: *mut PyObject,
332        op: c_int,
333    ) -> *mut PyObject;
334    fn PyUnicodeUCS4_Format(format: *mut PyObject, args: *mut PyObject) -> *mut PyObject;
335    fn PyUnicodeUCS4_Contains(container: *mut PyObject, element: *mut PyObject) -> c_int;
336    fn _PyUnicode_XStrip(
337        _self: *mut PyUnicodeObject,
338        striptype: c_int,
339        sepobj: *mut PyObject,
340    ) -> *mut PyObject;
341    fn _PyUnicodeUCS4_IsLowercase(ch: Py_UNICODE) -> c_int;
342    fn _PyUnicodeUCS4_IsUppercase(ch: Py_UNICODE) -> c_int;
343    fn _PyUnicodeUCS4_IsTitlecase(ch: Py_UNICODE) -> c_int;
344    fn _PyUnicodeUCS4_IsWhitespace(ch: Py_UNICODE) -> c_int;
345    fn _PyUnicodeUCS4_IsLinebreak(ch: Py_UNICODE) -> c_int;
346    fn _PyUnicodeUCS4_ToLowercase(ch: Py_UNICODE) -> Py_UNICODE;
347    fn _PyUnicodeUCS4_ToUppercase(ch: Py_UNICODE) -> Py_UNICODE;
348    fn _PyUnicodeUCS4_ToTitlecase(ch: Py_UNICODE) -> Py_UNICODE;
349    fn _PyUnicodeUCS4_ToDecimalDigit(ch: Py_UNICODE) -> c_int;
350    fn _PyUnicodeUCS4_ToDigit(ch: Py_UNICODE) -> c_int;
351    fn _PyUnicodeUCS4_ToNumeric(ch: Py_UNICODE) -> c_double;
352    fn _PyUnicodeUCS4_IsDecimalDigit(ch: Py_UNICODE) -> c_int;
353    fn _PyUnicodeUCS4_IsDigit(ch: Py_UNICODE) -> c_int;
354    fn _PyUnicodeUCS4_IsNumeric(ch: Py_UNICODE) -> c_int;
355    fn _PyUnicodeUCS4_IsAlpha(ch: Py_UNICODE) -> c_int;
356}
357
358#[allow(dead_code)]
359#[cfg(not(py_sys_config = "Py_UNICODE_SIZE_4"))]
360#[cfg_attr(windows, link(name = "pythonXY"))]
361extern "C" {
362    fn PyUnicodeUCS2_FromUnicode(u: *const Py_UNICODE, size: Py_ssize_t) -> *mut PyObject;
363    fn PyUnicodeUCS2_FromStringAndSize(u: *const c_char, size: Py_ssize_t) -> *mut PyObject;
364    fn PyUnicodeUCS2_FromString(u: *const c_char) -> *mut PyObject;
365    fn PyUnicodeUCS2_AsUnicode(unicode: *mut PyObject) -> *mut Py_UNICODE;
366    fn PyUnicodeUCS2_GetSize(unicode: *mut PyObject) -> Py_ssize_t;
367    fn PyUnicodeUCS2_GetMax() -> Py_UNICODE;
368    fn PyUnicodeUCS2_Resize(unicode: *mut *mut PyObject, length: Py_ssize_t) -> c_int;
369    fn PyUnicodeUCS2_FromEncodedObject(
370        obj: *mut PyObject,
371        encoding: *const c_char,
372        errors: *const c_char,
373    ) -> *mut PyObject;
374    fn PyUnicodeUCS2_FromObject(obj: *mut PyObject) -> *mut PyObject;
375    fn PyUnicodeUCS2_FromFormatV(arg1: *const c_char, ...) -> *mut PyObject;
376    fn PyUnicodeUCS2_FromFormat(arg1: *const c_char, ...) -> *mut PyObject;
377    fn _PyUnicode_FormatAdvanced(
378        obj: *mut PyObject,
379        format_spec: *mut Py_UNICODE,
380        format_spec_len: Py_ssize_t,
381    ) -> *mut PyObject;
382    fn PyUnicodeUCS2_FromWideChar(w: *const wchar_t, size: Py_ssize_t) -> *mut PyObject;
383    fn PyUnicodeUCS2_AsWideChar(
384        unicode: *mut PyUnicodeObject,
385        w: *mut wchar_t,
386        size: Py_ssize_t,
387    ) -> Py_ssize_t;
388    fn PyUnicodeUCS2_FromOrdinal(ordinal: c_int) -> *mut PyObject;
389    fn PyUnicodeUCS2_ClearFreelist() -> c_int;
390    fn _PyUnicodeUCS2_AsDefaultEncodedString(
391        arg1: *mut PyObject,
392        arg2: *const c_char,
393    ) -> *mut PyObject;
394    fn PyUnicodeUCS2_GetDefaultEncoding() -> *const c_char;
395    fn PyUnicodeUCS2_SetDefaultEncoding(encoding: *const c_char) -> c_int;
396    fn PyUnicodeUCS2_Decode(
397        s: *const c_char,
398        size: Py_ssize_t,
399        encoding: *const c_char,
400        errors: *const c_char,
401    ) -> *mut PyObject;
402    fn PyUnicodeUCS2_Encode(
403        s: *const Py_UNICODE,
404        size: Py_ssize_t,
405        encoding: *const c_char,
406        errors: *const c_char,
407    ) -> *mut PyObject;
408    fn PyUnicodeUCS2_AsEncodedObject(
409        unicode: *mut PyObject,
410        encoding: *const c_char,
411        errors: *const c_char,
412    ) -> *mut PyObject;
413    fn PyUnicodeUCS2_AsEncodedString(
414        unicode: *mut PyObject,
415        encoding: *const c_char,
416        errors: *const c_char,
417    ) -> *mut PyObject;
418    fn PyUnicode_BuildEncodingMap(string: *mut PyObject) -> *mut PyObject;
419    fn PyUnicode_DecodeUTF7(
420        string: *const c_char,
421        length: Py_ssize_t,
422        errors: *const c_char,
423    ) -> *mut PyObject;
424    fn PyUnicode_DecodeUTF7Stateful(
425        string: *const c_char,
426        length: Py_ssize_t,
427        errors: *const c_char,
428        consumed: *mut Py_ssize_t,
429    ) -> *mut PyObject;
430    fn PyUnicode_EncodeUTF7(
431        data: *const Py_UNICODE,
432        length: Py_ssize_t,
433        base64SetO: c_int,
434        base64WhiteSpace: c_int,
435        errors: *const c_char,
436    ) -> *mut PyObject;
437    fn PyUnicodeUCS2_DecodeUTF8(
438        string: *const c_char,
439        length: Py_ssize_t,
440        errors: *const c_char,
441    ) -> *mut PyObject;
442    fn PyUnicodeUCS2_DecodeUTF8Stateful(
443        string: *const c_char,
444        length: Py_ssize_t,
445        errors: *const c_char,
446        consumed: *mut Py_ssize_t,
447    ) -> *mut PyObject;
448    fn PyUnicodeUCS2_AsUTF8String(unicode: *mut PyObject) -> *mut PyObject;
449    fn PyUnicodeUCS2_EncodeUTF8(
450        data: *const Py_UNICODE,
451        length: Py_ssize_t,
452        errors: *const c_char,
453    ) -> *mut PyObject;
454    fn PyUnicodeUCS2_DecodeUTF32(
455        string: *const c_char,
456        length: Py_ssize_t,
457        errors: *const c_char,
458        byteorder: *mut c_int,
459    ) -> *mut PyObject;
460    fn PyUnicodeUCS2_DecodeUTF32Stateful(
461        string: *const c_char,
462        length: Py_ssize_t,
463        errors: *const c_char,
464        byteorder: *mut c_int,
465        consumed: *mut Py_ssize_t,
466    ) -> *mut PyObject;
467    fn PyUnicodeUCS2_AsUTF32String(unicode: *mut PyObject) -> *mut PyObject;
468    fn PyUnicodeUCS2_EncodeUTF32(
469        data: *const Py_UNICODE,
470        length: Py_ssize_t,
471        errors: *const c_char,
472        byteorder: c_int,
473    ) -> *mut PyObject;
474    fn PyUnicodeUCS2_DecodeUTF16(
475        string: *const c_char,
476        length: Py_ssize_t,
477        errors: *const c_char,
478        byteorder: *mut c_int,
479    ) -> *mut PyObject;
480    fn PyUnicodeUCS2_DecodeUTF16Stateful(
481        string: *const c_char,
482        length: Py_ssize_t,
483        errors: *const c_char,
484        byteorder: *mut c_int,
485        consumed: *mut Py_ssize_t,
486    ) -> *mut PyObject;
487    fn PyUnicodeUCS2_AsUTF16String(unicode: *mut PyObject) -> *mut PyObject;
488    fn PyUnicodeUCS2_EncodeUTF16(
489        data: *const Py_UNICODE,
490        length: Py_ssize_t,
491        errors: *const c_char,
492        byteorder: c_int,
493    ) -> *mut PyObject;
494    fn PyUnicodeUCS2_DecodeUnicodeEscape(
495        string: *const c_char,
496        length: Py_ssize_t,
497        errors: *const c_char,
498    ) -> *mut PyObject;
499    fn PyUnicodeUCS2_AsUnicodeEscapeString(unicode: *mut PyObject) -> *mut PyObject;
500    fn PyUnicodeUCS2_EncodeUnicodeEscape(
501        data: *const Py_UNICODE,
502        length: Py_ssize_t,
503    ) -> *mut PyObject;
504    fn PyUnicodeUCS2_DecodeRawUnicodeEscape(
505        string: *const c_char,
506        length: Py_ssize_t,
507        errors: *const c_char,
508    ) -> *mut PyObject;
509    fn PyUnicodeUCS2_AsRawUnicodeEscapeString(unicode: *mut PyObject) -> *mut PyObject;
510    fn PyUnicodeUCS2_EncodeRawUnicodeEscape(
511        data: *const Py_UNICODE,
512        length: Py_ssize_t,
513    ) -> *mut PyObject;
514    fn _PyUnicode_DecodeUnicodeInternal(
515        string: *const c_char,
516        length: Py_ssize_t,
517        errors: *const c_char,
518    ) -> *mut PyObject;
519    fn PyUnicodeUCS2_DecodeLatin1(
520        string: *const c_char,
521        length: Py_ssize_t,
522        errors: *const c_char,
523    ) -> *mut PyObject;
524    fn PyUnicodeUCS2_AsLatin1String(unicode: *mut PyObject) -> *mut PyObject;
525    fn PyUnicodeUCS2_EncodeLatin1(
526        data: *const Py_UNICODE,
527        length: Py_ssize_t,
528        errors: *const c_char,
529    ) -> *mut PyObject;
530    fn PyUnicodeUCS2_DecodeASCII(
531        string: *const c_char,
532        length: Py_ssize_t,
533        errors: *const c_char,
534    ) -> *mut PyObject;
535    fn PyUnicodeUCS2_AsASCIIString(unicode: *mut PyObject) -> *mut PyObject;
536    fn PyUnicodeUCS2_EncodeASCII(
537        data: *const Py_UNICODE,
538        length: Py_ssize_t,
539        errors: *const c_char,
540    ) -> *mut PyObject;
541    fn PyUnicodeUCS2_DecodeCharmap(
542        string: *const c_char,
543        length: Py_ssize_t,
544        mapping: *mut PyObject,
545        errors: *const c_char,
546    ) -> *mut PyObject;
547    fn PyUnicodeUCS2_AsCharmapString(
548        unicode: *mut PyObject,
549        mapping: *mut PyObject,
550    ) -> *mut PyObject;
551    fn PyUnicodeUCS2_EncodeCharmap(
552        data: *const Py_UNICODE,
553        length: Py_ssize_t,
554        mapping: *mut PyObject,
555        errors: *const c_char,
556    ) -> *mut PyObject;
557    fn PyUnicodeUCS2_TranslateCharmap(
558        data: *const Py_UNICODE,
559        length: Py_ssize_t,
560        table: *mut PyObject,
561        errors: *const c_char,
562    ) -> *mut PyObject;
563    fn PyUnicodeUCS2_EncodeDecimal(
564        s: *mut Py_UNICODE,
565        length: Py_ssize_t,
566        output: *mut c_char,
567        errors: *const c_char,
568    ) -> c_int;
569    fn PyUnicodeUCS2_Concat(left: *mut PyObject, right: *mut PyObject) -> *mut PyObject;
570    fn PyUnicodeUCS2_Split(
571        s: *mut PyObject,
572        sep: *mut PyObject,
573        maxsplit: Py_ssize_t,
574    ) -> *mut PyObject;
575    fn PyUnicodeUCS2_Splitlines(s: *mut PyObject, keepends: c_int) -> *mut PyObject;
576    fn PyUnicodeUCS2_Partition(s: *mut PyObject, sep: *mut PyObject) -> *mut PyObject;
577    fn PyUnicodeUCS2_RPartition(s: *mut PyObject, sep: *mut PyObject) -> *mut PyObject;
578    fn PyUnicodeUCS2_RSplit(
579        s: *mut PyObject,
580        sep: *mut PyObject,
581        maxsplit: Py_ssize_t,
582    ) -> *mut PyObject;
583    fn PyUnicodeUCS2_Translate(
584        str: *mut PyObject,
585        table: *mut PyObject,
586        errors: *const c_char,
587    ) -> *mut PyObject;
588    fn PyUnicodeUCS2_Join(separator: *mut PyObject, seq: *mut PyObject) -> *mut PyObject;
589    fn PyUnicodeUCS2_Tailmatch(
590        str: *mut PyObject,
591        substr: *mut PyObject,
592        start: Py_ssize_t,
593        end: Py_ssize_t,
594        direction: c_int,
595    ) -> Py_ssize_t;
596    fn PyUnicodeUCS2_Find(
597        str: *mut PyObject,
598        substr: *mut PyObject,
599        start: Py_ssize_t,
600        end: Py_ssize_t,
601        direction: c_int,
602    ) -> Py_ssize_t;
603    fn PyUnicodeUCS2_Count(
604        str: *mut PyObject,
605        substr: *mut PyObject,
606        start: Py_ssize_t,
607        end: Py_ssize_t,
608    ) -> Py_ssize_t;
609    fn PyUnicodeUCS2_Replace(
610        str: *mut PyObject,
611        substr: *mut PyObject,
612        replstr: *mut PyObject,
613        maxcount: Py_ssize_t,
614    ) -> *mut PyObject;
615    fn PyUnicodeUCS2_Compare(left: *mut PyObject, right: *mut PyObject) -> c_int;
616    fn PyUnicodeUCS2_RichCompare(
617        left: *mut PyObject,
618        right: *mut PyObject,
619        op: c_int,
620    ) -> *mut PyObject;
621    fn PyUnicodeUCS2_Format(format: *mut PyObject, args: *mut PyObject) -> *mut PyObject;
622    fn PyUnicodeUCS2_Contains(container: *mut PyObject, element: *mut PyObject) -> c_int;
623    fn _PyUnicode_XStrip(
624        _self: *mut PyUnicodeObject,
625        striptype: c_int,
626        sepobj: *mut PyObject,
627    ) -> *mut PyObject;
628    fn _PyUnicodeUCS2_IsLowercase(ch: Py_UNICODE) -> c_int;
629    fn _PyUnicodeUCS2_IsUppercase(ch: Py_UNICODE) -> c_int;
630    fn _PyUnicodeUCS2_IsTitlecase(ch: Py_UNICODE) -> c_int;
631    fn _PyUnicodeUCS2_IsWhitespace(ch: Py_UNICODE) -> c_int;
632    fn _PyUnicodeUCS2_IsLinebreak(ch: Py_UNICODE) -> c_int;
633    fn _PyUnicodeUCS2_ToLowercase(ch: Py_UNICODE) -> Py_UNICODE;
634    fn _PyUnicodeUCS2_ToUppercase(ch: Py_UNICODE) -> Py_UNICODE;
635    fn _PyUnicodeUCS2_ToTitlecase(ch: Py_UNICODE) -> Py_UNICODE;
636    fn _PyUnicodeUCS2_ToDecimalDigit(ch: Py_UNICODE) -> c_int;
637    fn _PyUnicodeUCS2_ToDigit(ch: Py_UNICODE) -> c_int;
638    fn _PyUnicodeUCS2_ToNumeric(ch: Py_UNICODE) -> c_double;
639    fn _PyUnicodeUCS2_IsDecimalDigit(ch: Py_UNICODE) -> c_int;
640    fn _PyUnicodeUCS2_IsDigit(ch: Py_UNICODE) -> c_int;
641    fn _PyUnicodeUCS2_IsNumeric(ch: Py_UNICODE) -> c_int;
642    fn _PyUnicodeUCS2_IsAlpha(ch: Py_UNICODE) -> c_int;
643}
644
645#[inline(always)]
646#[cfg(py_sys_config = "Py_UNICODE_SIZE_4")]
647pub unsafe fn PyUnicode_FromStringAndSize(u: *const c_char, size: Py_ssize_t) -> *mut PyObject {
648    PyUnicodeUCS4_FromStringAndSize(u, size)
649}
650
651#[inline(always)]
652#[cfg(not(py_sys_config = "Py_UNICODE_SIZE_4"))]
653pub unsafe fn PyUnicode_FromStringAndSize(u: *const c_char, size: Py_ssize_t) -> *mut PyObject {
654    PyUnicodeUCS2_FromStringAndSize(u, size)
655}
656
657#[inline(always)]
658#[cfg(py_sys_config = "Py_UNICODE_SIZE_4")]
659pub unsafe fn PyUnicode_AsUTF8String(u: *mut PyObject) -> *mut PyObject {
660    PyUnicodeUCS4_AsUTF8String(u)
661}
662
663#[inline(always)]
664#[cfg(not(py_sys_config = "Py_UNICODE_SIZE_4"))]
665pub unsafe fn PyUnicode_AsUTF8String(u: *mut PyObject) -> *mut PyObject {
666    PyUnicodeUCS2_AsUTF8String(u)
667}