blob: fc74127ce56c42898a878417270da11884056460 [file] [log] [blame]
Guido van Rossume2d67f92000-03-10 23:09:23 +00001/* ------------------------------------------------------------------------
2
3 _codecs -- Provides access to the codec registry and the builtin
4 codecs.
5
6 This module should never be imported directly. The standard library
7 module "codecs" wraps this builtin module for use within Python.
8
9 The codec registry is accessible via:
10
11 register(search_function) -> None
12
Guido van Rossum36e0a922007-07-20 04:05:57 +000013 lookup(encoding) -> CodecInfo object
Guido van Rossume2d67f92000-03-10 23:09:23 +000014
15 The builtin Unicode codecs use the following interface:
16
Walter Dörwald9fd115c2005-11-02 08:30:08 +000017 <encoding>_encode(Unicode_object[,errors='strict']) ->
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000018 (string object, bytes consumed)
Guido van Rossume2d67f92000-03-10 23:09:23 +000019
Walter Dörwald9fd115c2005-11-02 08:30:08 +000020 <encoding>_decode(char_buffer_obj[,errors='strict']) ->
Guido van Rossume2d67f92000-03-10 23:09:23 +000021 (Unicode object, bytes consumed)
22
23 These <encoding>s are available: utf_8, unicode_escape,
Inada Naoki6a16b182019-03-18 15:44:11 +090024 raw_unicode_escape, latin_1, ascii (7-bit), mbcs (on win32).
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +000025
Guido van Rossume2d67f92000-03-10 23:09:23 +000026
27Written by Marc-Andre Lemburg (mal@lemburg.com).
28
Guido van Rossum16b1ad92000-08-03 16:24:25 +000029Copyright (c) Corporation for National Research Initiatives.
Guido van Rossume2d67f92000-03-10 23:09:23 +000030
31 ------------------------------------------------------------------------ */
32
Martin v. Löwis18e16552006-02-15 17:27:45 +000033#define PY_SSIZE_T_CLEAN
Guido van Rossume2d67f92000-03-10 23:09:23 +000034#include "Python.h"
35
Victor Stinner87a7c822011-11-10 20:05:55 +010036#ifdef MS_WINDOWS
37#include <windows.h>
38#endif
39
Nick Coghlan8fad1672014-09-15 23:50:44 +120040/*[clinic input]
41module _codecs
42[clinic start generated code]*/
43/*[clinic end generated code: output=da39a3ee5e6b4b0d input=e1390e3da3cb9deb]*/
44
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030045#include "clinic/_codecsmodule.c.h"
Nick Coghlan8fad1672014-09-15 23:50:44 +120046
Guido van Rossume2d67f92000-03-10 23:09:23 +000047/* --- Registry ----------------------------------------------------------- */
48
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030049/*[clinic input]
50_codecs.register
51 search_function: object
52 /
Walter Dörwald0ae29812002-10-31 13:36:29 +000053
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030054Register a codec search function.
55
56Search functions are expected to take one argument, the encoding name in
57all lower case letters, and either return None, or a tuple of functions
58(encoder, decoder, stream_reader, stream_writer) (or a CodecInfo object).
59[clinic start generated code]*/
60
61static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030062_codecs_register(PyObject *module, PyObject *search_function)
63/*[clinic end generated code: output=d1bf21e99db7d6d3 input=369578467955cae4]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +000064{
Guido van Rossume2d67f92000-03-10 23:09:23 +000065 if (PyCodec_Register(search_function))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000066 return NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +000067
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000068 Py_RETURN_NONE;
Guido van Rossume2d67f92000-03-10 23:09:23 +000069}
70
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030071/*[clinic input]
Hai Shid332e7b2020-09-29 05:41:11 +080072_codecs.unregister
73 search_function: object
74 /
75
76Unregister a codec search function and clear the registry's cache.
77
78If the search function is not registered, do nothing.
79[clinic start generated code]*/
80
81static PyObject *
82_codecs_unregister(PyObject *module, PyObject *search_function)
83/*[clinic end generated code: output=1f0edee9cf246399 input=dd7c004c652d345e]*/
84{
85 if (PyCodec_Unregister(search_function) < 0) {
86 return NULL;
87 }
88
89 Py_RETURN_NONE;
90}
91
92/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030093_codecs.lookup
94 encoding: str
95 /
Walter Dörwald0ae29812002-10-31 13:36:29 +000096
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030097Looks up a codec tuple in the Python codec registry and returns a CodecInfo object.
98[clinic start generated code]*/
99
100static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300101_codecs_lookup_impl(PyObject *module, const char *encoding)
102/*[clinic end generated code: output=9f0afa572080c36d input=3c572c0db3febe9c]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000103{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000104 return _PyCodec_Lookup(encoding);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000105}
106
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300107/*[clinic input]
108_codecs.encode
109 obj: object
Serhiy Storchakac97a9622015-08-09 12:23:08 +0300110 encoding: str(c_default="NULL") = "utf-8"
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300111 errors: str(c_default="NULL") = "strict"
112
113Encodes obj using the codec registered for encoding.
114
Serhiy Storchakac97a9622015-08-09 12:23:08 +0300115The default encoding is 'utf-8'. errors may be given to set a
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300116different error handling scheme. Default is 'strict' meaning that encoding
117errors raise a ValueError. Other possible values are 'ignore', 'replace'
118and 'backslashreplace' as well as any other name registered with
119codecs.register_error that can handle ValueErrors.
120[clinic start generated code]*/
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000121
122static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300123_codecs_encode_impl(PyObject *module, PyObject *obj, const char *encoding,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300124 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300125/*[clinic end generated code: output=385148eb9a067c86 input=cd5b685040ff61f0]*/
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000126{
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000127 if (encoding == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 encoding = PyUnicode_GetDefaultEncoding();
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000129
130 /* Encode via the codec registry */
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300131 return PyCodec_Encode(obj, encoding, errors);
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000132}
133
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300134/*[clinic input]
135_codecs.decode
136 obj: object
Serhiy Storchakac97a9622015-08-09 12:23:08 +0300137 encoding: str(c_default="NULL") = "utf-8"
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300138 errors: str(c_default="NULL") = "strict"
139
140Decodes obj using the codec registered for encoding.
141
Serhiy Storchakac97a9622015-08-09 12:23:08 +0300142Default encoding is 'utf-8'. errors may be given to set a
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300143different error handling scheme. Default is 'strict' meaning that encoding
144errors raise a ValueError. Other possible values are 'ignore', 'replace'
145and 'backslashreplace' as well as any other name registered with
146codecs.register_error that can handle ValueErrors.
147[clinic start generated code]*/
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000148
149static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300150_codecs_decode_impl(PyObject *module, PyObject *obj, const char *encoding,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300151 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300152/*[clinic end generated code: output=679882417dc3a0bd input=7702c0cc2fa1add6]*/
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000153{
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000154 if (encoding == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000155 encoding = PyUnicode_GetDefaultEncoding();
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000156
157 /* Decode via the codec registry */
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300158 return PyCodec_Decode(obj, encoding, errors);
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000159}
160
Guido van Rossume2d67f92000-03-10 23:09:23 +0000161/* --- Helpers ------------------------------------------------------------ */
162
163static
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300164PyObject *codec_tuple(PyObject *decoded,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 Py_ssize_t len)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000166{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300167 if (decoded == NULL)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000168 return NULL;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300169 return Py_BuildValue("Nn", decoded, len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000170}
171
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000172/* --- String codecs ------------------------------------------------------ */
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300173/*[clinic input]
174_codecs.escape_decode
175 data: Py_buffer(accept={str, buffer})
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300176 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300177 /
178[clinic start generated code]*/
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000179
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300180static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300181_codecs_escape_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300182 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300183/*[clinic end generated code: output=505200ba8056979a input=77298a561c90bd82]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300184{
185 PyObject *decoded = PyBytes_DecodeEscape(data->buf, data->len,
186 errors, 0, NULL);
187 return codec_tuple(decoded, data->len);
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000188}
189
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300190/*[clinic input]
191_codecs.escape_encode
192 data: object(subclass_of='&PyBytes_Type')
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300193 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300194 /
195[clinic start generated code]*/
196
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000197static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300198_codecs_escape_encode_impl(PyObject *module, PyObject *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300199 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300200/*[clinic end generated code: output=4af1d477834bab34 input=8f4b144799a94245]*/
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000201{
Antoine Pitroud1188562010-06-09 16:38:55 +0000202 Py_ssize_t size;
203 Py_ssize_t newsize;
Antoine Pitroud1188562010-06-09 16:38:55 +0000204 PyObject *v;
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000205
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300206 size = PyBytes_GET_SIZE(data);
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100207 if (size > PY_SSIZE_T_MAX / 4) {
Antoine Pitroud1188562010-06-09 16:38:55 +0000208 PyErr_SetString(PyExc_OverflowError,
209 "string is too large to encode");
210 return NULL;
211 }
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100212 newsize = 4*size;
Antoine Pitroud1188562010-06-09 16:38:55 +0000213 v = PyBytes_FromStringAndSize(NULL, newsize);
214
215 if (v == NULL) {
216 return NULL;
217 }
218 else {
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200219 Py_ssize_t i;
220 char c;
221 char *p = PyBytes_AS_STRING(v);
Antoine Pitroud1188562010-06-09 16:38:55 +0000222
223 for (i = 0; i < size; i++) {
224 /* There's at least enough room for a hex escape */
225 assert(newsize - (p - PyBytes_AS_STRING(v)) >= 4);
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300226 c = PyBytes_AS_STRING(data)[i];
Antoine Pitroud1188562010-06-09 16:38:55 +0000227 if (c == '\'' || c == '\\')
228 *p++ = '\\', *p++ = c;
229 else if (c == '\t')
230 *p++ = '\\', *p++ = 't';
231 else if (c == '\n')
232 *p++ = '\\', *p++ = 'n';
233 else if (c == '\r')
234 *p++ = '\\', *p++ = 'r';
235 else if (c < ' ' || c >= 0x7f) {
236 *p++ = '\\';
237 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +0200238 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
239 *p++ = Py_hexdigits[c & 0xf];
Antoine Pitroud1188562010-06-09 16:38:55 +0000240 }
241 else
242 *p++ = c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 }
Antoine Pitroud1188562010-06-09 16:38:55 +0000244 *p = '\0';
245 if (_PyBytes_Resize(&v, (p - PyBytes_AS_STRING(v)))) {
246 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 }
Antoine Pitroud1188562010-06-09 16:38:55 +0000248 }
Walter Dörwald1ab83302007-05-18 17:15:44 +0000249
Antoine Pitroud1188562010-06-09 16:38:55 +0000250 return codec_tuple(v, size);
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000251}
252
Guido van Rossume2d67f92000-03-10 23:09:23 +0000253/* --- Decoder ------------------------------------------------------------ */
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300254/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300255_codecs.utf_7_decode
256 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300257 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200258 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300259 /
260[clinic start generated code]*/
261
Guido van Rossume2d67f92000-03-10 23:09:23 +0000262static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300263_codecs_utf_7_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300264 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300265/*[clinic end generated code: output=0cd3a944a32a4089 input=22c395d357815d26]*/
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000266{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300267 Py_ssize_t consumed = data->len;
268 PyObject *decoded = PyUnicode_DecodeUTF7Stateful(data->buf, data->len,
269 errors,
270 final ? NULL : &consumed);
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000271 return codec_tuple(decoded, consumed);
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000272}
273
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300274/*[clinic input]
275_codecs.utf_8_decode
276 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300277 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200278 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300279 /
280[clinic start generated code]*/
281
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000282static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300283_codecs_utf_8_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300284 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300285/*[clinic end generated code: output=10f74dec8d9bb8bf input=f611b3867352ba59]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000286{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300287 Py_ssize_t consumed = data->len;
288 PyObject *decoded = PyUnicode_DecodeUTF8Stateful(data->buf, data->len,
289 errors,
290 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000291 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000292}
293
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300294/*[clinic input]
295_codecs.utf_16_decode
296 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300297 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200298 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300299 /
300[clinic start generated code]*/
301
Guido van Rossume2d67f92000-03-10 23:09:23 +0000302static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300303_codecs_utf_16_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300304 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300305/*[clinic end generated code: output=783b442abcbcc2d0 input=191d360bd7309180]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000306{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000307 int byteorder = 0;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300308 /* This is overwritten unless final is true. */
309 Py_ssize_t consumed = data->len;
310 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
311 errors, &byteorder,
312 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000313 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000314}
315
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300316/*[clinic input]
317_codecs.utf_16_le_decode
318 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300319 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200320 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300321 /
322[clinic start generated code]*/
323
Guido van Rossume2d67f92000-03-10 23:09:23 +0000324static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300325_codecs_utf_16_le_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300326 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300327/*[clinic end generated code: output=899b9e6364379dcd input=c6904fdc27fb4724]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000328{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000329 int byteorder = -1;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300330 /* This is overwritten unless final is true. */
331 Py_ssize_t consumed = data->len;
332 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
333 errors, &byteorder,
334 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000335 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000336}
337
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300338/*[clinic input]
339_codecs.utf_16_be_decode
340 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300341 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200342 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300343 /
344[clinic start generated code]*/
345
Guido van Rossume2d67f92000-03-10 23:09:23 +0000346static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300347_codecs_utf_16_be_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300348 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300349/*[clinic end generated code: output=49f6465ea07669c8 input=e49012400974649b]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000350{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000351 int byteorder = 1;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300352 /* This is overwritten unless final is true. */
353 Py_ssize_t consumed = data->len;
354 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
355 errors, &byteorder,
356 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000357 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000358}
359
360/* This non-standard version also provides access to the byteorder
361 parameter of the builtin UTF-16 codec.
362
363 It returns a tuple (unicode, bytesread, byteorder) with byteorder
364 being the value in effect at the end of data.
365
366*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300367/*[clinic input]
368_codecs.utf_16_ex_decode
369 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300370 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300371 byteorder: int = 0
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200372 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300373 /
374[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000375
376static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300377_codecs_utf_16_ex_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300378 const char *errors, int byteorder, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300379/*[clinic end generated code: output=0f385f251ecc1988 input=5a9c19f2e6b6cf0e]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000380{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300381 /* This is overwritten unless final is true. */
382 Py_ssize_t consumed = data->len;
Walter Dörwald69652032004-09-07 20:24:22 +0000383
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300384 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
385 errors, &byteorder,
386 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000387 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 return NULL;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300389 return Py_BuildValue("Nni", decoded, consumed, byteorder);
390}
391
392/*[clinic input]
393_codecs.utf_32_decode
394 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300395 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200396 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300397 /
398[clinic start generated code]*/
399
400static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300401_codecs_utf_32_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300402 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300403/*[clinic end generated code: output=2fc961807f7b145f input=fd7193965627eb58]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300404{
405 int byteorder = 0;
406 /* This is overwritten unless final is true. */
407 Py_ssize_t consumed = data->len;
408 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
409 errors, &byteorder,
410 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000411 return codec_tuple(decoded, consumed);
412}
413
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300414/*[clinic input]
415_codecs.utf_32_le_decode
416 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300417 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200418 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300419 /
420[clinic start generated code]*/
421
Walter Dörwald41980ca2007-08-16 21:55:45 +0000422static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300423_codecs_utf_32_le_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300424 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300425/*[clinic end generated code: output=ec8f46b67a94f3e6 input=9078ec70acfe7613]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000426{
Walter Dörwald41980ca2007-08-16 21:55:45 +0000427 int byteorder = -1;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300428 /* This is overwritten unless final is true. */
429 Py_ssize_t consumed = data->len;
430 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
431 errors, &byteorder,
432 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000433 return codec_tuple(decoded, consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000434}
435
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300436/*[clinic input]
437_codecs.utf_32_be_decode
438 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300439 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200440 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300441 /
442[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000443
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300444static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300445_codecs_utf_32_be_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300446 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300447/*[clinic end generated code: output=ff82bae862c92c4e input=f1ae1bbbb86648ff]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300448{
449 int byteorder = 1;
450 /* This is overwritten unless final is true. */
451 Py_ssize_t consumed = data->len;
452 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
453 errors, &byteorder,
454 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000455 return codec_tuple(decoded, consumed);
456}
457
458/* This non-standard version also provides access to the byteorder
459 parameter of the builtin UTF-32 codec.
460
461 It returns a tuple (unicode, bytesread, byteorder) with byteorder
462 being the value in effect at the end of data.
463
464*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300465/*[clinic input]
466_codecs.utf_32_ex_decode
467 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300468 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300469 byteorder: int = 0
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200470 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300471 /
472[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000473
474static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300475_codecs_utf_32_ex_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300476 const char *errors, int byteorder, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300477/*[clinic end generated code: output=6bfb177dceaf4848 input=e46a73bc859d0bd0]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000478{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300479 Py_ssize_t consumed = data->len;
480 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
481 errors, &byteorder,
482 final ? NULL : &consumed);
483 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 return NULL;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300485 return Py_BuildValue("Nni", decoded, consumed, byteorder);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000486}
487
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300488/*[clinic input]
489_codecs.unicode_escape_decode
490 data: Py_buffer(accept={str, buffer})
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300491 errors: str(accept={str, NoneType}) = None
Miss Islington (bot)0bff4cc2021-10-14 10:02:20 -0700492 final: bool(accept={int}) = True
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300493 /
494[clinic start generated code]*/
495
Walter Dörwald41980ca2007-08-16 21:55:45 +0000496static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300497_codecs_unicode_escape_decode_impl(PyObject *module, Py_buffer *data,
Miss Islington (bot)0bff4cc2021-10-14 10:02:20 -0700498 const char *errors, int final)
499/*[clinic end generated code: output=b284f97b12c635ee input=6154f039a9f7c639]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000500{
Miss Islington (bot)0bff4cc2021-10-14 10:02:20 -0700501 Py_ssize_t consumed = data->len;
502 PyObject *decoded = _PyUnicode_DecodeUnicodeEscapeStateful(data->buf, data->len,
503 errors,
504 final ? NULL : &consumed);
505 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000506}
507
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300508/*[clinic input]
509_codecs.raw_unicode_escape_decode
510 data: Py_buffer(accept={str, buffer})
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300511 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300512 /
513[clinic start generated code]*/
514
Guido van Rossume2d67f92000-03-10 23:09:23 +0000515static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300516_codecs_raw_unicode_escape_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300517 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300518/*[clinic end generated code: output=c98eeb56028070a6 input=d2f5159ce3b3392f]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000519{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300520 PyObject *decoded = PyUnicode_DecodeRawUnicodeEscape(data->buf, data->len,
521 errors);
522 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000523}
524
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300525/*[clinic input]
526_codecs.latin_1_decode
527 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300528 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300529 /
530[clinic start generated code]*/
531
Guido van Rossume2d67f92000-03-10 23:09:23 +0000532static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300533_codecs_latin_1_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300534 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300535/*[clinic end generated code: output=07f3dfa3f72c7d8f input=76ca58fd6dcd08c7]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000536{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300537 PyObject *decoded = PyUnicode_DecodeLatin1(data->buf, data->len, errors);
538 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000539}
540
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300541/*[clinic input]
542_codecs.ascii_decode
543 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300544 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300545 /
546[clinic start generated code]*/
547
Guido van Rossume2d67f92000-03-10 23:09:23 +0000548static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300549_codecs_ascii_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300550 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300551/*[clinic end generated code: output=2627d72058d42429 input=e428a267a04b4481]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000552{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300553 PyObject *decoded = PyUnicode_DecodeASCII(data->buf, data->len, errors);
554 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000555}
556
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300557/*[clinic input]
558_codecs.charmap_decode
559 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300560 errors: str(accept={str, NoneType}) = None
561 mapping: object = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300562 /
563[clinic start generated code]*/
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000564
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300565static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300566_codecs_charmap_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300567 const char *errors, PyObject *mapping)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300568/*[clinic end generated code: output=2c335b09778cf895 input=15b69df43458eb40]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300569{
570 PyObject *decoded;
571
Guido van Rossume2d67f92000-03-10 23:09:23 +0000572 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000574
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300575 decoded = PyUnicode_DecodeCharmap(data->buf, data->len, mapping, errors);
576 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000577}
578
Steve Dowercc16be82016-09-08 10:35:16 -0700579#ifdef MS_WINDOWS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000580
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300581/*[clinic input]
582_codecs.mbcs_decode
583 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300584 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200585 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300586 /
587[clinic start generated code]*/
588
Guido van Rossum24bdb042000-03-28 20:29:59 +0000589static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300590_codecs_mbcs_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300591 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300592/*[clinic end generated code: output=39b65b8598938c4b input=1c1d50f08fa53789]*/
Guido van Rossum24bdb042000-03-28 20:29:59 +0000593{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300594 Py_ssize_t consumed = data->len;
595 PyObject *decoded = PyUnicode_DecodeMBCSStateful(data->buf, data->len,
596 errors, final ? NULL : &consumed);
Martin v. Löwis423be952008-08-13 15:53:07 +0000597 return codec_tuple(decoded, consumed);
Guido van Rossum24bdb042000-03-28 20:29:59 +0000598}
599
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300600/*[clinic input]
Steve Dowerf5aba582016-09-06 19:42:27 -0700601_codecs.oem_decode
602 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300603 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200604 final: bool(accept={int}) = False
Steve Dowerf5aba582016-09-06 19:42:27 -0700605 /
606[clinic start generated code]*/
607
608static PyObject *
609_codecs_oem_decode_impl(PyObject *module, Py_buffer *data,
610 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300611/*[clinic end generated code: output=da1617612f3fcad8 input=81b67cba811022e5]*/
Steve Dowerf5aba582016-09-06 19:42:27 -0700612{
613 Py_ssize_t consumed = data->len;
614 PyObject *decoded = PyUnicode_DecodeCodePageStateful(CP_OEMCP,
615 data->buf, data->len, errors, final ? NULL : &consumed);
616 return codec_tuple(decoded, consumed);
617}
618
619/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300620_codecs.code_page_decode
621 codepage: int
622 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300623 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200624 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300625 /
626[clinic start generated code]*/
627
Victor Stinner3a50e702011-10-18 21:21:00 +0200628static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300629_codecs_code_page_decode_impl(PyObject *module, int codepage,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300630 Py_buffer *data, const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300631/*[clinic end generated code: output=53008ea967da3fff input=c5f58d036cb63575]*/
Victor Stinner3a50e702011-10-18 21:21:00 +0200632{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300633 Py_ssize_t consumed = data->len;
Serhiy Storchaka1aa5e1d2015-05-12 14:00:22 +0300634 PyObject *decoded = PyUnicode_DecodeCodePageStateful(codepage,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300635 data->buf, data->len,
636 errors,
637 final ? NULL : &consumed);
Victor Stinner3a50e702011-10-18 21:21:00 +0200638 return codec_tuple(decoded, consumed);
639}
640
Steve Dowercc16be82016-09-08 10:35:16 -0700641#endif /* MS_WINDOWS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000642
Guido van Rossume2d67f92000-03-10 23:09:23 +0000643/* --- Encoder ------------------------------------------------------------ */
644
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300645/*[clinic input]
646_codecs.readbuffer_encode
647 data: Py_buffer(accept={str, buffer})
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300648 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300649 /
650[clinic start generated code]*/
651
Guido van Rossume2d67f92000-03-10 23:09:23 +0000652static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300653_codecs_readbuffer_encode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300654 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300655/*[clinic end generated code: output=c645ea7cdb3d6e86 input=aa10cfdf252455c5]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000656{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300657 PyObject *result = PyBytes_FromStringAndSize(data->buf, data->len);
658 return codec_tuple(result, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000659}
660
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300661/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300662_codecs.utf_7_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300663 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300664 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300665 /
666[clinic start generated code]*/
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000667
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300668static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300669_codecs_utf_7_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300670 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300671/*[clinic end generated code: output=0feda21ffc921bc8 input=2546dbbb3fa53114]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300672{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300673 return codec_tuple(_PyUnicode_EncodeUTF7(str, 0, 0, errors),
674 PyUnicode_GET_LENGTH(str));
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000675}
676
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300677/*[clinic input]
678_codecs.utf_8_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300679 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300680 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300681 /
682[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000683
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300684static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300685_codecs_utf_8_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300686 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300687/*[clinic end generated code: output=02bf47332b9c796c input=a3e71ae01c3f93f3]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300688{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300689 return codec_tuple(_PyUnicode_AsUTF8String(str, errors),
690 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000691}
692
693/* This version provides access to the byteorder parameter of the
694 builtin UTF-16 codecs as optional third argument. It defaults to 0
695 which means: use the native byte order and prepend the data with a
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000696 BOM mark.
Guido van Rossume2d67f92000-03-10 23:09:23 +0000697
698*/
699
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300700/*[clinic input]
701_codecs.utf_16_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300702 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300703 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300704 byteorder: int = 0
705 /
706[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000707
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300708static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300709_codecs_utf_16_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300710 const char *errors, int byteorder)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300711/*[clinic end generated code: output=c654e13efa2e64e4 input=68cdc2eb8338555d]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300712{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300713 return codec_tuple(_PyUnicode_EncodeUTF16(str, errors, byteorder),
714 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000715}
716
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300717/*[clinic input]
718_codecs.utf_16_le_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300719 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300720 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300721 /
722[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000723
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300724static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300725_codecs_utf_16_le_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300726 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300727/*[clinic end generated code: output=431b01e55f2d4995 input=83d042706eed6798]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300728{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300729 return codec_tuple(_PyUnicode_EncodeUTF16(str, errors, -1),
730 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000731}
732
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300733/*[clinic input]
734_codecs.utf_16_be_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300735 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300736 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300737 /
738[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000739
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300740static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300741_codecs_utf_16_be_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300742 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300743/*[clinic end generated code: output=96886a6fd54dcae3 input=6f1e9e623b03071b]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300744{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300745 return codec_tuple(_PyUnicode_EncodeUTF16(str, errors, +1),
746 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000747}
748
Walter Dörwald41980ca2007-08-16 21:55:45 +0000749/* This version provides access to the byteorder parameter of the
750 builtin UTF-32 codecs as optional third argument. It defaults to 0
751 which means: use the native byte order and prepend the data with a
752 BOM mark.
753
754*/
755
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300756/*[clinic input]
757_codecs.utf_32_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300758 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300759 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300760 byteorder: int = 0
761 /
762[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000763
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300764static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300765_codecs_utf_32_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300766 const char *errors, int byteorder)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300767/*[clinic end generated code: output=5c760da0c09a8b83 input=8ec4c64d983bc52b]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300768{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300769 return codec_tuple(_PyUnicode_EncodeUTF32(str, errors, byteorder),
770 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000771}
772
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300773/*[clinic input]
774_codecs.utf_32_le_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300775 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300776 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300777 /
778[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000779
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300780static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300781_codecs_utf_32_le_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300782 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300783/*[clinic end generated code: output=b65cd176de8e36d6 input=f0918d41de3eb1b1]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300784{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300785 return codec_tuple(_PyUnicode_EncodeUTF32(str, errors, -1),
786 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000787}
788
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300789/*[clinic input]
790_codecs.utf_32_be_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300791 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300792 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300793 /
794[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000795
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300796static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300797_codecs_utf_32_be_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300798 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300799/*[clinic end generated code: output=1d9e71a9358709e9 input=967a99a95748b557]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300800{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300801 return codec_tuple(_PyUnicode_EncodeUTF32(str, errors, +1),
802 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000803}
804
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300805/*[clinic input]
806_codecs.unicode_escape_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300807 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300808 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300809 /
810[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000811
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300812static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300813_codecs_unicode_escape_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300814 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300815/*[clinic end generated code: output=66271b30bc4f7a3c input=8c4de07597054e33]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300816{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300817 return codec_tuple(PyUnicode_AsUnicodeEscapeString(str),
818 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000819}
820
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300821/*[clinic input]
822_codecs.raw_unicode_escape_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300823 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300824 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300825 /
826[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000827
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300828static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300829_codecs_raw_unicode_escape_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300830 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300831/*[clinic end generated code: output=a66a806ed01c830a input=4aa6f280d78e4574]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300832{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300833 return codec_tuple(PyUnicode_AsRawUnicodeEscapeString(str),
834 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000835}
836
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300837/*[clinic input]
838_codecs.latin_1_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300839 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300840 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300841 /
842[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000843
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300844static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300845_codecs_latin_1_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300846 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300847/*[clinic end generated code: output=2c28c83a27884e08 input=ec3ef74bf85c5c5d]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300848{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300849 return codec_tuple(_PyUnicode_AsLatin1String(str, errors),
850 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000851}
852
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300853/*[clinic input]
854_codecs.ascii_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300855 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300856 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300857 /
858[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000859
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300860static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300861_codecs_ascii_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300862 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300863/*[clinic end generated code: output=b5e035182d33befc input=93e6e602838bd3de]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300864{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300865 return codec_tuple(_PyUnicode_AsASCIIString(str, errors),
866 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000867}
868
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300869/*[clinic input]
870_codecs.charmap_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300871 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300872 errors: str(accept={str, NoneType}) = None
873 mapping: object = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300874 /
875[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000876
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300877static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300878_codecs_charmap_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300879 const char *errors, PyObject *mapping)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300880/*[clinic end generated code: output=047476f48495a9e9 input=2a98feae73dadce8]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300881{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000882 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000884
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300885 return codec_tuple(_PyUnicode_EncodeCharmap(str, mapping, errors),
886 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000887}
888
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300889/*[clinic input]
890_codecs.charmap_build
891 map: unicode
892 /
893[clinic start generated code]*/
894
895static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300896_codecs_charmap_build_impl(PyObject *module, PyObject *map)
897/*[clinic end generated code: output=bb073c27031db9ac input=d91a91d1717dbc6d]*/
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000898{
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000899 return PyUnicode_BuildEncodingMap(map);
900}
901
Steve Dowercc16be82016-09-08 10:35:16 -0700902#ifdef MS_WINDOWS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000903
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300904/*[clinic input]
905_codecs.mbcs_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300906 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300907 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300908 /
909[clinic start generated code]*/
Guido van Rossum24bdb042000-03-28 20:29:59 +0000910
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300911static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300912_codecs_mbcs_encode_impl(PyObject *module, PyObject *str, const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300913/*[clinic end generated code: output=76e2e170c966c080 input=2e932fc289ea5a5b]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300914{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300915 return codec_tuple(PyUnicode_EncodeCodePage(CP_ACP, str, errors),
916 PyUnicode_GET_LENGTH(str));
Guido van Rossum24bdb042000-03-28 20:29:59 +0000917}
918
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300919/*[clinic input]
Steve Dowerf5aba582016-09-06 19:42:27 -0700920_codecs.oem_encode
921 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300922 errors: str(accept={str, NoneType}) = None
Steve Dowerf5aba582016-09-06 19:42:27 -0700923 /
924[clinic start generated code]*/
925
926static PyObject *
927_codecs_oem_encode_impl(PyObject *module, PyObject *str, const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300928/*[clinic end generated code: output=65d5982c737de649 input=9eac86dc21eb14f2]*/
Steve Dowerf5aba582016-09-06 19:42:27 -0700929{
930 return codec_tuple(PyUnicode_EncodeCodePage(CP_OEMCP, str, errors),
931 PyUnicode_GET_LENGTH(str));
932}
933
934/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300935_codecs.code_page_encode
936 code_page: int
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300937 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300938 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300939 /
940[clinic start generated code]*/
Victor Stinner3a50e702011-10-18 21:21:00 +0200941
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300942static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300943_codecs_code_page_encode_impl(PyObject *module, int code_page, PyObject *str,
944 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300945/*[clinic end generated code: output=45673f6085657a9e input=7d18a33bc8cd0f94]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300946{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300947 return codec_tuple(PyUnicode_EncodeCodePage(code_page, str, errors),
948 PyUnicode_GET_LENGTH(str));
Victor Stinner3a50e702011-10-18 21:21:00 +0200949}
950
Steve Dowercc16be82016-09-08 10:35:16 -0700951#endif /* MS_WINDOWS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000952
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000953/* --- Error handler registry --------------------------------------------- */
954
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300955/*[clinic input]
956_codecs.register_error
957 errors: str
958 handler: object
959 /
Walter Dörwald0ae29812002-10-31 13:36:29 +0000960
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300961Register the specified error handler under the name errors.
962
963handler must be a callable object, that will be called with an exception
964instance containing information about the location of the encoding/decoding
965error and must return a (replacement, new position) tuple.
966[clinic start generated code]*/
967
968static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300969_codecs_register_error_impl(PyObject *module, const char *errors,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300970 PyObject *handler)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300971/*[clinic end generated code: output=fa2f7d1879b3067d input=5e6709203c2e33fe]*/
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000972{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300973 if (PyCodec_RegisterError(errors, handler))
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000974 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000975 Py_RETURN_NONE;
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000976}
977
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300978/*[clinic input]
979_codecs.lookup_error
980 name: str
981 /
Walter Dörwald0ae29812002-10-31 13:36:29 +0000982
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300983lookup_error(errors) -> handler
984
985Return the error handler for the specified error handling name or raise a
986LookupError, if no handler exists under this name.
987[clinic start generated code]*/
988
989static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300990_codecs_lookup_error_impl(PyObject *module, const char *name)
991/*[clinic end generated code: output=087f05dc0c9a98cc input=4775dd65e6235aba]*/
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000992{
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000993 return PyCodec_LookupError(name);
994}
995
Guido van Rossume2d67f92000-03-10 23:09:23 +0000996/* --- Module API --------------------------------------------------------- */
997
998static PyMethodDef _codecs_functions[] = {
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300999 _CODECS_REGISTER_METHODDEF
Hai Shid332e7b2020-09-29 05:41:11 +08001000 _CODECS_UNREGISTER_METHODDEF
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001001 _CODECS_LOOKUP_METHODDEF
1002 _CODECS_ENCODE_METHODDEF
1003 _CODECS_DECODE_METHODDEF
1004 _CODECS_ESCAPE_ENCODE_METHODDEF
1005 _CODECS_ESCAPE_DECODE_METHODDEF
1006 _CODECS_UTF_8_ENCODE_METHODDEF
1007 _CODECS_UTF_8_DECODE_METHODDEF
1008 _CODECS_UTF_7_ENCODE_METHODDEF
1009 _CODECS_UTF_7_DECODE_METHODDEF
1010 _CODECS_UTF_16_ENCODE_METHODDEF
1011 _CODECS_UTF_16_LE_ENCODE_METHODDEF
1012 _CODECS_UTF_16_BE_ENCODE_METHODDEF
1013 _CODECS_UTF_16_DECODE_METHODDEF
1014 _CODECS_UTF_16_LE_DECODE_METHODDEF
1015 _CODECS_UTF_16_BE_DECODE_METHODDEF
1016 _CODECS_UTF_16_EX_DECODE_METHODDEF
1017 _CODECS_UTF_32_ENCODE_METHODDEF
1018 _CODECS_UTF_32_LE_ENCODE_METHODDEF
1019 _CODECS_UTF_32_BE_ENCODE_METHODDEF
1020 _CODECS_UTF_32_DECODE_METHODDEF
1021 _CODECS_UTF_32_LE_DECODE_METHODDEF
1022 _CODECS_UTF_32_BE_DECODE_METHODDEF
1023 _CODECS_UTF_32_EX_DECODE_METHODDEF
1024 _CODECS_UNICODE_ESCAPE_ENCODE_METHODDEF
1025 _CODECS_UNICODE_ESCAPE_DECODE_METHODDEF
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001026 _CODECS_RAW_UNICODE_ESCAPE_ENCODE_METHODDEF
1027 _CODECS_RAW_UNICODE_ESCAPE_DECODE_METHODDEF
1028 _CODECS_LATIN_1_ENCODE_METHODDEF
1029 _CODECS_LATIN_1_DECODE_METHODDEF
1030 _CODECS_ASCII_ENCODE_METHODDEF
1031 _CODECS_ASCII_DECODE_METHODDEF
1032 _CODECS_CHARMAP_ENCODE_METHODDEF
1033 _CODECS_CHARMAP_DECODE_METHODDEF
1034 _CODECS_CHARMAP_BUILD_METHODDEF
1035 _CODECS_READBUFFER_ENCODE_METHODDEF
1036 _CODECS_MBCS_ENCODE_METHODDEF
1037 _CODECS_MBCS_DECODE_METHODDEF
Steve Dowerf5aba582016-09-06 19:42:27 -07001038 _CODECS_OEM_ENCODE_METHODDEF
1039 _CODECS_OEM_DECODE_METHODDEF
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001040 _CODECS_CODE_PAGE_ENCODE_METHODDEF
1041 _CODECS_CODE_PAGE_DECODE_METHODDEF
1042 _CODECS_REGISTER_ERROR_METHODDEF
1043 _CODECS_LOOKUP_ERROR_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 {NULL, NULL} /* sentinel */
Guido van Rossume2d67f92000-03-10 23:09:23 +00001045};
1046
Hai Shi1ea45ae2020-02-11 05:16:38 -06001047static PyModuleDef_Slot _codecs_slots[] = {
1048 {0, NULL}
1049};
1050
Martin v. Löwis1a214512008-06-11 05:26:20 +00001051static struct PyModuleDef codecsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 PyModuleDef_HEAD_INIT,
1053 "_codecs",
1054 NULL,
Hai Shi1ea45ae2020-02-11 05:16:38 -06001055 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 _codecs_functions,
Hai Shi1ea45ae2020-02-11 05:16:38 -06001057 _codecs_slots,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 NULL,
1059 NULL,
1060 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001061};
1062
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001063PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001064PyInit__codecs(void)
Guido van Rossume2d67f92000-03-10 23:09:23 +00001065{
Hai Shi1ea45ae2020-02-11 05:16:38 -06001066 return PyModuleDef_Init(&codecsmodule);
Guido van Rossume2d67f92000-03-10 23:09:23 +00001067}