blob: 50afc097b35026ee129006b120b0b665cb9e5f5b [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 Storchaka4641afe2021-10-14 21:23:39 +0300512 final: bool(accept={int}) = True
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300513 /
514[clinic start generated code]*/
515
Guido van Rossume2d67f92000-03-10 23:09:23 +0000516static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300517_codecs_raw_unicode_escape_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka4641afe2021-10-14 21:23:39 +0300518 const char *errors, int final)
519/*[clinic end generated code: output=11dbd96301e2879e input=2d166191beb3235a]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000520{
Serhiy Storchaka4641afe2021-10-14 21:23:39 +0300521 Py_ssize_t consumed = data->len;
522 PyObject *decoded = _PyUnicode_DecodeRawUnicodeEscapeStateful(data->buf, data->len,
523 errors,
524 final ? NULL : &consumed);
525 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000526}
527
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300528/*[clinic input]
529_codecs.latin_1_decode
530 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300531 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300532 /
533[clinic start generated code]*/
534
Guido van Rossume2d67f92000-03-10 23:09:23 +0000535static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300536_codecs_latin_1_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300537 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300538/*[clinic end generated code: output=07f3dfa3f72c7d8f input=76ca58fd6dcd08c7]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000539{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300540 PyObject *decoded = PyUnicode_DecodeLatin1(data->buf, data->len, errors);
541 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000542}
543
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300544/*[clinic input]
545_codecs.ascii_decode
546 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300547 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300548 /
549[clinic start generated code]*/
550
Guido van Rossume2d67f92000-03-10 23:09:23 +0000551static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300552_codecs_ascii_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300553 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300554/*[clinic end generated code: output=2627d72058d42429 input=e428a267a04b4481]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000555{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300556 PyObject *decoded = PyUnicode_DecodeASCII(data->buf, data->len, errors);
557 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000558}
559
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300560/*[clinic input]
561_codecs.charmap_decode
562 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300563 errors: str(accept={str, NoneType}) = None
564 mapping: object = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300565 /
566[clinic start generated code]*/
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000567
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300568static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300569_codecs_charmap_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300570 const char *errors, PyObject *mapping)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300571/*[clinic end generated code: output=2c335b09778cf895 input=15b69df43458eb40]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300572{
573 PyObject *decoded;
574
Guido van Rossume2d67f92000-03-10 23:09:23 +0000575 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000577
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300578 decoded = PyUnicode_DecodeCharmap(data->buf, data->len, mapping, errors);
579 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000580}
581
Steve Dowercc16be82016-09-08 10:35:16 -0700582#ifdef MS_WINDOWS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000583
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300584/*[clinic input]
585_codecs.mbcs_decode
586 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300587 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200588 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300589 /
590[clinic start generated code]*/
591
Guido van Rossum24bdb042000-03-28 20:29:59 +0000592static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300593_codecs_mbcs_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300594 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300595/*[clinic end generated code: output=39b65b8598938c4b input=1c1d50f08fa53789]*/
Guido van Rossum24bdb042000-03-28 20:29:59 +0000596{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300597 Py_ssize_t consumed = data->len;
598 PyObject *decoded = PyUnicode_DecodeMBCSStateful(data->buf, data->len,
599 errors, final ? NULL : &consumed);
Martin v. Löwis423be952008-08-13 15:53:07 +0000600 return codec_tuple(decoded, consumed);
Guido van Rossum24bdb042000-03-28 20:29:59 +0000601}
602
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300603/*[clinic input]
Steve Dowerf5aba582016-09-06 19:42:27 -0700604_codecs.oem_decode
605 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300606 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200607 final: bool(accept={int}) = False
Steve Dowerf5aba582016-09-06 19:42:27 -0700608 /
609[clinic start generated code]*/
610
611static PyObject *
612_codecs_oem_decode_impl(PyObject *module, Py_buffer *data,
613 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300614/*[clinic end generated code: output=da1617612f3fcad8 input=81b67cba811022e5]*/
Steve Dowerf5aba582016-09-06 19:42:27 -0700615{
616 Py_ssize_t consumed = data->len;
617 PyObject *decoded = PyUnicode_DecodeCodePageStateful(CP_OEMCP,
618 data->buf, data->len, errors, final ? NULL : &consumed);
619 return codec_tuple(decoded, consumed);
620}
621
622/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300623_codecs.code_page_decode
624 codepage: int
625 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300626 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200627 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300628 /
629[clinic start generated code]*/
630
Victor Stinner3a50e702011-10-18 21:21:00 +0200631static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300632_codecs_code_page_decode_impl(PyObject *module, int codepage,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300633 Py_buffer *data, const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300634/*[clinic end generated code: output=53008ea967da3fff input=c5f58d036cb63575]*/
Victor Stinner3a50e702011-10-18 21:21:00 +0200635{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300636 Py_ssize_t consumed = data->len;
Serhiy Storchaka1aa5e1d2015-05-12 14:00:22 +0300637 PyObject *decoded = PyUnicode_DecodeCodePageStateful(codepage,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300638 data->buf, data->len,
639 errors,
640 final ? NULL : &consumed);
Victor Stinner3a50e702011-10-18 21:21:00 +0200641 return codec_tuple(decoded, consumed);
642}
643
Steve Dowercc16be82016-09-08 10:35:16 -0700644#endif /* MS_WINDOWS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000645
Guido van Rossume2d67f92000-03-10 23:09:23 +0000646/* --- Encoder ------------------------------------------------------------ */
647
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300648/*[clinic input]
649_codecs.readbuffer_encode
650 data: Py_buffer(accept={str, buffer})
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300651 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300652 /
653[clinic start generated code]*/
654
Guido van Rossume2d67f92000-03-10 23:09:23 +0000655static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300656_codecs_readbuffer_encode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300657 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300658/*[clinic end generated code: output=c645ea7cdb3d6e86 input=aa10cfdf252455c5]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000659{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300660 PyObject *result = PyBytes_FromStringAndSize(data->buf, data->len);
661 return codec_tuple(result, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000662}
663
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300664/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300665_codecs.utf_7_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300666 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300667 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300668 /
669[clinic start generated code]*/
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000670
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300671static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300672_codecs_utf_7_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300673 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300674/*[clinic end generated code: output=0feda21ffc921bc8 input=2546dbbb3fa53114]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300675{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300676 return codec_tuple(_PyUnicode_EncodeUTF7(str, 0, 0, errors),
677 PyUnicode_GET_LENGTH(str));
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000678}
679
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300680/*[clinic input]
681_codecs.utf_8_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300682 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300683 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300684 /
685[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000686
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300687static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300688_codecs_utf_8_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300689 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300690/*[clinic end generated code: output=02bf47332b9c796c input=a3e71ae01c3f93f3]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300691{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300692 return codec_tuple(_PyUnicode_AsUTF8String(str, errors),
693 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000694}
695
696/* This version provides access to the byteorder parameter of the
697 builtin UTF-16 codecs as optional third argument. It defaults to 0
698 which means: use the native byte order and prepend the data with a
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000699 BOM mark.
Guido van Rossume2d67f92000-03-10 23:09:23 +0000700
701*/
702
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300703/*[clinic input]
704_codecs.utf_16_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300705 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300706 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300707 byteorder: int = 0
708 /
709[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000710
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300711static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300712_codecs_utf_16_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300713 const char *errors, int byteorder)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300714/*[clinic end generated code: output=c654e13efa2e64e4 input=68cdc2eb8338555d]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300715{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300716 return codec_tuple(_PyUnicode_EncodeUTF16(str, errors, byteorder),
717 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000718}
719
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300720/*[clinic input]
721_codecs.utf_16_le_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300722 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300723 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300724 /
725[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000726
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300727static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300728_codecs_utf_16_le_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300729 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300730/*[clinic end generated code: output=431b01e55f2d4995 input=83d042706eed6798]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300731{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300732 return codec_tuple(_PyUnicode_EncodeUTF16(str, errors, -1),
733 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000734}
735
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300736/*[clinic input]
737_codecs.utf_16_be_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300738 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300739 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300740 /
741[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000742
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300743static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300744_codecs_utf_16_be_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300745 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300746/*[clinic end generated code: output=96886a6fd54dcae3 input=6f1e9e623b03071b]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300747{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300748 return codec_tuple(_PyUnicode_EncodeUTF16(str, errors, +1),
749 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000750}
751
Walter Dörwald41980ca2007-08-16 21:55:45 +0000752/* This version provides access to the byteorder parameter of the
753 builtin UTF-32 codecs as optional third argument. It defaults to 0
754 which means: use the native byte order and prepend the data with a
755 BOM mark.
756
757*/
758
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300759/*[clinic input]
760_codecs.utf_32_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300761 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300762 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300763 byteorder: int = 0
764 /
765[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000766
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300767static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300768_codecs_utf_32_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300769 const char *errors, int byteorder)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300770/*[clinic end generated code: output=5c760da0c09a8b83 input=8ec4c64d983bc52b]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300771{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300772 return codec_tuple(_PyUnicode_EncodeUTF32(str, errors, byteorder),
773 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000774}
775
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300776/*[clinic input]
777_codecs.utf_32_le_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300778 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300779 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300780 /
781[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000782
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300783static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300784_codecs_utf_32_le_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300785 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300786/*[clinic end generated code: output=b65cd176de8e36d6 input=f0918d41de3eb1b1]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300787{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300788 return codec_tuple(_PyUnicode_EncodeUTF32(str, errors, -1),
789 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000790}
791
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300792/*[clinic input]
793_codecs.utf_32_be_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300794 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300795 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300796 /
797[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000798
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300799static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300800_codecs_utf_32_be_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300801 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300802/*[clinic end generated code: output=1d9e71a9358709e9 input=967a99a95748b557]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300803{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300804 return codec_tuple(_PyUnicode_EncodeUTF32(str, errors, +1),
805 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000806}
807
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300808/*[clinic input]
809_codecs.unicode_escape_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300810 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300811 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300812 /
813[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000814
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300815static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300816_codecs_unicode_escape_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300817 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300818/*[clinic end generated code: output=66271b30bc4f7a3c input=8c4de07597054e33]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300819{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300820 return codec_tuple(PyUnicode_AsUnicodeEscapeString(str),
821 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000822}
823
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300824/*[clinic input]
825_codecs.raw_unicode_escape_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300826 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300827 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300828 /
829[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000830
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300831static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300832_codecs_raw_unicode_escape_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300833 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300834/*[clinic end generated code: output=a66a806ed01c830a input=4aa6f280d78e4574]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300835{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300836 return codec_tuple(PyUnicode_AsRawUnicodeEscapeString(str),
837 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000838}
839
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300840/*[clinic input]
841_codecs.latin_1_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300842 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300843 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300844 /
845[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000846
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300847static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300848_codecs_latin_1_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300849 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300850/*[clinic end generated code: output=2c28c83a27884e08 input=ec3ef74bf85c5c5d]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300851{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300852 return codec_tuple(_PyUnicode_AsLatin1String(str, errors),
853 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000854}
855
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300856/*[clinic input]
857_codecs.ascii_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300858 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300859 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300860 /
861[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000862
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300863static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300864_codecs_ascii_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300865 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300866/*[clinic end generated code: output=b5e035182d33befc input=93e6e602838bd3de]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300867{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300868 return codec_tuple(_PyUnicode_AsASCIIString(str, errors),
869 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000870}
871
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300872/*[clinic input]
873_codecs.charmap_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300874 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300875 errors: str(accept={str, NoneType}) = None
876 mapping: object = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300877 /
878[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000879
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300880static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300881_codecs_charmap_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300882 const char *errors, PyObject *mapping)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300883/*[clinic end generated code: output=047476f48495a9e9 input=2a98feae73dadce8]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300884{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000885 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000887
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300888 return codec_tuple(_PyUnicode_EncodeCharmap(str, mapping, errors),
889 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000890}
891
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300892/*[clinic input]
893_codecs.charmap_build
894 map: unicode
895 /
896[clinic start generated code]*/
897
898static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300899_codecs_charmap_build_impl(PyObject *module, PyObject *map)
900/*[clinic end generated code: output=bb073c27031db9ac input=d91a91d1717dbc6d]*/
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000901{
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000902 return PyUnicode_BuildEncodingMap(map);
903}
904
Steve Dowercc16be82016-09-08 10:35:16 -0700905#ifdef MS_WINDOWS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000906
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300907/*[clinic input]
908_codecs.mbcs_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300909 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300910 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300911 /
912[clinic start generated code]*/
Guido van Rossum24bdb042000-03-28 20:29:59 +0000913
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300914static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300915_codecs_mbcs_encode_impl(PyObject *module, PyObject *str, const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300916/*[clinic end generated code: output=76e2e170c966c080 input=2e932fc289ea5a5b]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300917{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300918 return codec_tuple(PyUnicode_EncodeCodePage(CP_ACP, str, errors),
919 PyUnicode_GET_LENGTH(str));
Guido van Rossum24bdb042000-03-28 20:29:59 +0000920}
921
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300922/*[clinic input]
Steve Dowerf5aba582016-09-06 19:42:27 -0700923_codecs.oem_encode
924 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300925 errors: str(accept={str, NoneType}) = None
Steve Dowerf5aba582016-09-06 19:42:27 -0700926 /
927[clinic start generated code]*/
928
929static PyObject *
930_codecs_oem_encode_impl(PyObject *module, PyObject *str, const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300931/*[clinic end generated code: output=65d5982c737de649 input=9eac86dc21eb14f2]*/
Steve Dowerf5aba582016-09-06 19:42:27 -0700932{
933 return codec_tuple(PyUnicode_EncodeCodePage(CP_OEMCP, str, errors),
934 PyUnicode_GET_LENGTH(str));
935}
936
937/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300938_codecs.code_page_encode
939 code_page: int
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300940 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300941 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300942 /
943[clinic start generated code]*/
Victor Stinner3a50e702011-10-18 21:21:00 +0200944
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300945static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300946_codecs_code_page_encode_impl(PyObject *module, int code_page, PyObject *str,
947 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300948/*[clinic end generated code: output=45673f6085657a9e input=7d18a33bc8cd0f94]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300949{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300950 return codec_tuple(PyUnicode_EncodeCodePage(code_page, str, errors),
951 PyUnicode_GET_LENGTH(str));
Victor Stinner3a50e702011-10-18 21:21:00 +0200952}
953
Steve Dowercc16be82016-09-08 10:35:16 -0700954#endif /* MS_WINDOWS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000955
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000956/* --- Error handler registry --------------------------------------------- */
957
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300958/*[clinic input]
959_codecs.register_error
960 errors: str
961 handler: object
962 /
Walter Dörwald0ae29812002-10-31 13:36:29 +0000963
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300964Register the specified error handler under the name errors.
965
966handler must be a callable object, that will be called with an exception
967instance containing information about the location of the encoding/decoding
968error and must return a (replacement, new position) tuple.
969[clinic start generated code]*/
970
971static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300972_codecs_register_error_impl(PyObject *module, const char *errors,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300973 PyObject *handler)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300974/*[clinic end generated code: output=fa2f7d1879b3067d input=5e6709203c2e33fe]*/
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000975{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300976 if (PyCodec_RegisterError(errors, handler))
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000977 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000978 Py_RETURN_NONE;
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000979}
980
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300981/*[clinic input]
982_codecs.lookup_error
983 name: str
984 /
Walter Dörwald0ae29812002-10-31 13:36:29 +0000985
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300986lookup_error(errors) -> handler
987
988Return the error handler for the specified error handling name or raise a
989LookupError, if no handler exists under this name.
990[clinic start generated code]*/
991
992static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300993_codecs_lookup_error_impl(PyObject *module, const char *name)
994/*[clinic end generated code: output=087f05dc0c9a98cc input=4775dd65e6235aba]*/
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000995{
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000996 return PyCodec_LookupError(name);
997}
998
Guido van Rossume2d67f92000-03-10 23:09:23 +0000999/* --- Module API --------------------------------------------------------- */
1000
1001static PyMethodDef _codecs_functions[] = {
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001002 _CODECS_REGISTER_METHODDEF
Hai Shid332e7b2020-09-29 05:41:11 +08001003 _CODECS_UNREGISTER_METHODDEF
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001004 _CODECS_LOOKUP_METHODDEF
1005 _CODECS_ENCODE_METHODDEF
1006 _CODECS_DECODE_METHODDEF
1007 _CODECS_ESCAPE_ENCODE_METHODDEF
1008 _CODECS_ESCAPE_DECODE_METHODDEF
1009 _CODECS_UTF_8_ENCODE_METHODDEF
1010 _CODECS_UTF_8_DECODE_METHODDEF
1011 _CODECS_UTF_7_ENCODE_METHODDEF
1012 _CODECS_UTF_7_DECODE_METHODDEF
1013 _CODECS_UTF_16_ENCODE_METHODDEF
1014 _CODECS_UTF_16_LE_ENCODE_METHODDEF
1015 _CODECS_UTF_16_BE_ENCODE_METHODDEF
1016 _CODECS_UTF_16_DECODE_METHODDEF
1017 _CODECS_UTF_16_LE_DECODE_METHODDEF
1018 _CODECS_UTF_16_BE_DECODE_METHODDEF
1019 _CODECS_UTF_16_EX_DECODE_METHODDEF
1020 _CODECS_UTF_32_ENCODE_METHODDEF
1021 _CODECS_UTF_32_LE_ENCODE_METHODDEF
1022 _CODECS_UTF_32_BE_ENCODE_METHODDEF
1023 _CODECS_UTF_32_DECODE_METHODDEF
1024 _CODECS_UTF_32_LE_DECODE_METHODDEF
1025 _CODECS_UTF_32_BE_DECODE_METHODDEF
1026 _CODECS_UTF_32_EX_DECODE_METHODDEF
1027 _CODECS_UNICODE_ESCAPE_ENCODE_METHODDEF
1028 _CODECS_UNICODE_ESCAPE_DECODE_METHODDEF
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001029 _CODECS_RAW_UNICODE_ESCAPE_ENCODE_METHODDEF
1030 _CODECS_RAW_UNICODE_ESCAPE_DECODE_METHODDEF
1031 _CODECS_LATIN_1_ENCODE_METHODDEF
1032 _CODECS_LATIN_1_DECODE_METHODDEF
1033 _CODECS_ASCII_ENCODE_METHODDEF
1034 _CODECS_ASCII_DECODE_METHODDEF
1035 _CODECS_CHARMAP_ENCODE_METHODDEF
1036 _CODECS_CHARMAP_DECODE_METHODDEF
1037 _CODECS_CHARMAP_BUILD_METHODDEF
1038 _CODECS_READBUFFER_ENCODE_METHODDEF
1039 _CODECS_MBCS_ENCODE_METHODDEF
1040 _CODECS_MBCS_DECODE_METHODDEF
Steve Dowerf5aba582016-09-06 19:42:27 -07001041 _CODECS_OEM_ENCODE_METHODDEF
1042 _CODECS_OEM_DECODE_METHODDEF
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001043 _CODECS_CODE_PAGE_ENCODE_METHODDEF
1044 _CODECS_CODE_PAGE_DECODE_METHODDEF
1045 _CODECS_REGISTER_ERROR_METHODDEF
1046 _CODECS_LOOKUP_ERROR_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 {NULL, NULL} /* sentinel */
Guido van Rossume2d67f92000-03-10 23:09:23 +00001048};
1049
Hai Shi1ea45ae2020-02-11 05:16:38 -06001050static PyModuleDef_Slot _codecs_slots[] = {
1051 {0, NULL}
1052};
1053
Martin v. Löwis1a214512008-06-11 05:26:20 +00001054static struct PyModuleDef codecsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 PyModuleDef_HEAD_INIT,
1056 "_codecs",
1057 NULL,
Hai Shi1ea45ae2020-02-11 05:16:38 -06001058 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 _codecs_functions,
Hai Shi1ea45ae2020-02-11 05:16:38 -06001060 _codecs_slots,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 NULL,
1062 NULL,
1063 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001064};
1065
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001066PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001067PyInit__codecs(void)
Guido van Rossume2d67f92000-03-10 23:09:23 +00001068{
Hai Shi1ea45ae2020-02-11 05:16:38 -06001069 return PyModuleDef_Init(&codecsmodule);
Guido van Rossume2d67f92000-03-10 23:09:23 +00001070}