blob: 08a3d4ab024cc2d44df01c33d3e0ed9138d68dad [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
Nick Coghlan8fad1672014-09-15 23:50:44 +1200163/*[clinic input]
164_codecs._forget_codec
165
166 encoding: str
167 /
168
169Purge the named codec from the internal codec lookup cache
170[clinic start generated code]*/
171
Nick Coghlan8fad1672014-09-15 23:50:44 +1200172static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300173_codecs__forget_codec_impl(PyObject *module, const char *encoding)
174/*[clinic end generated code: output=0bde9f0a5b084aa2 input=18d5d92d0e386c38]*/
Nick Coghlan8fad1672014-09-15 23:50:44 +1200175{
176 if (_PyCodec_Forget(encoding) < 0) {
177 return NULL;
178 };
179 Py_RETURN_NONE;
180}
181
Guido van Rossume2d67f92000-03-10 23:09:23 +0000182static
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300183PyObject *codec_tuple(PyObject *decoded,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 Py_ssize_t len)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000185{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300186 if (decoded == NULL)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000187 return NULL;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300188 return Py_BuildValue("Nn", decoded, len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000189}
190
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000191/* --- String codecs ------------------------------------------------------ */
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300192/*[clinic input]
193_codecs.escape_decode
194 data: Py_buffer(accept={str, buffer})
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300195 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300196 /
197[clinic start generated code]*/
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000198
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300199static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300200_codecs_escape_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300201 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300202/*[clinic end generated code: output=505200ba8056979a input=77298a561c90bd82]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300203{
204 PyObject *decoded = PyBytes_DecodeEscape(data->buf, data->len,
205 errors, 0, NULL);
206 return codec_tuple(decoded, data->len);
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000207}
208
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300209/*[clinic input]
210_codecs.escape_encode
211 data: object(subclass_of='&PyBytes_Type')
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300212 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300213 /
214[clinic start generated code]*/
215
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000216static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300217_codecs_escape_encode_impl(PyObject *module, PyObject *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300218 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300219/*[clinic end generated code: output=4af1d477834bab34 input=8f4b144799a94245]*/
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000220{
Antoine Pitroud1188562010-06-09 16:38:55 +0000221 Py_ssize_t size;
222 Py_ssize_t newsize;
Antoine Pitroud1188562010-06-09 16:38:55 +0000223 PyObject *v;
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000224
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300225 size = PyBytes_GET_SIZE(data);
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100226 if (size > PY_SSIZE_T_MAX / 4) {
Antoine Pitroud1188562010-06-09 16:38:55 +0000227 PyErr_SetString(PyExc_OverflowError,
228 "string is too large to encode");
229 return NULL;
230 }
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100231 newsize = 4*size;
Antoine Pitroud1188562010-06-09 16:38:55 +0000232 v = PyBytes_FromStringAndSize(NULL, newsize);
233
234 if (v == NULL) {
235 return NULL;
236 }
237 else {
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200238 Py_ssize_t i;
239 char c;
240 char *p = PyBytes_AS_STRING(v);
Antoine Pitroud1188562010-06-09 16:38:55 +0000241
242 for (i = 0; i < size; i++) {
243 /* There's at least enough room for a hex escape */
244 assert(newsize - (p - PyBytes_AS_STRING(v)) >= 4);
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300245 c = PyBytes_AS_STRING(data)[i];
Antoine Pitroud1188562010-06-09 16:38:55 +0000246 if (c == '\'' || c == '\\')
247 *p++ = '\\', *p++ = c;
248 else if (c == '\t')
249 *p++ = '\\', *p++ = 't';
250 else if (c == '\n')
251 *p++ = '\\', *p++ = 'n';
252 else if (c == '\r')
253 *p++ = '\\', *p++ = 'r';
254 else if (c < ' ' || c >= 0x7f) {
255 *p++ = '\\';
256 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +0200257 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
258 *p++ = Py_hexdigits[c & 0xf];
Antoine Pitroud1188562010-06-09 16:38:55 +0000259 }
260 else
261 *p++ = c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 }
Antoine Pitroud1188562010-06-09 16:38:55 +0000263 *p = '\0';
264 if (_PyBytes_Resize(&v, (p - PyBytes_AS_STRING(v)))) {
265 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 }
Antoine Pitroud1188562010-06-09 16:38:55 +0000267 }
Walter Dörwald1ab83302007-05-18 17:15:44 +0000268
Antoine Pitroud1188562010-06-09 16:38:55 +0000269 return codec_tuple(v, size);
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000270}
271
Guido van Rossume2d67f92000-03-10 23:09:23 +0000272/* --- Decoder ------------------------------------------------------------ */
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300273/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300274_codecs.utf_7_decode
275 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300276 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200277 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300278 /
279[clinic start generated code]*/
280
Guido van Rossume2d67f92000-03-10 23:09:23 +0000281static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300282_codecs_utf_7_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300283 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300284/*[clinic end generated code: output=0cd3a944a32a4089 input=22c395d357815d26]*/
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000285{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300286 Py_ssize_t consumed = data->len;
287 PyObject *decoded = PyUnicode_DecodeUTF7Stateful(data->buf, data->len,
288 errors,
289 final ? NULL : &consumed);
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000290 return codec_tuple(decoded, consumed);
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000291}
292
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300293/*[clinic input]
294_codecs.utf_8_decode
295 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300296 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200297 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300298 /
299[clinic start generated code]*/
300
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000301static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300302_codecs_utf_8_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300303 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300304/*[clinic end generated code: output=10f74dec8d9bb8bf input=f611b3867352ba59]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000305{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300306 Py_ssize_t consumed = data->len;
307 PyObject *decoded = PyUnicode_DecodeUTF8Stateful(data->buf, data->len,
308 errors,
309 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000310 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000311}
312
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300313/*[clinic input]
314_codecs.utf_16_decode
315 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300316 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200317 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300318 /
319[clinic start generated code]*/
320
Guido van Rossume2d67f92000-03-10 23:09:23 +0000321static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300322_codecs_utf_16_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300323 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300324/*[clinic end generated code: output=783b442abcbcc2d0 input=191d360bd7309180]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000325{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000326 int byteorder = 0;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300327 /* This is overwritten unless final is true. */
328 Py_ssize_t consumed = data->len;
329 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
330 errors, &byteorder,
331 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000332 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000333}
334
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300335/*[clinic input]
336_codecs.utf_16_le_decode
337 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300338 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200339 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300340 /
341[clinic start generated code]*/
342
Guido van Rossume2d67f92000-03-10 23:09:23 +0000343static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300344_codecs_utf_16_le_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300345 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300346/*[clinic end generated code: output=899b9e6364379dcd input=c6904fdc27fb4724]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000347{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000348 int byteorder = -1;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300349 /* This is overwritten unless final is true. */
350 Py_ssize_t consumed = data->len;
351 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
352 errors, &byteorder,
353 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000354 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000355}
356
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300357/*[clinic input]
358_codecs.utf_16_be_decode
359 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300360 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200361 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300362 /
363[clinic start generated code]*/
364
Guido van Rossume2d67f92000-03-10 23:09:23 +0000365static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300366_codecs_utf_16_be_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300367 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300368/*[clinic end generated code: output=49f6465ea07669c8 input=e49012400974649b]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000369{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000370 int byteorder = 1;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300371 /* This is overwritten unless final is true. */
372 Py_ssize_t consumed = data->len;
373 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
374 errors, &byteorder,
375 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000376 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000377}
378
379/* This non-standard version also provides access to the byteorder
380 parameter of the builtin UTF-16 codec.
381
382 It returns a tuple (unicode, bytesread, byteorder) with byteorder
383 being the value in effect at the end of data.
384
385*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300386/*[clinic input]
387_codecs.utf_16_ex_decode
388 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300389 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300390 byteorder: int = 0
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200391 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300392 /
393[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000394
395static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300396_codecs_utf_16_ex_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300397 const char *errors, int byteorder, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300398/*[clinic end generated code: output=0f385f251ecc1988 input=5a9c19f2e6b6cf0e]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000399{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300400 /* This is overwritten unless final is true. */
401 Py_ssize_t consumed = data->len;
Walter Dörwald69652032004-09-07 20:24:22 +0000402
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300403 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
404 errors, &byteorder,
405 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000406 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 return NULL;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300408 return Py_BuildValue("Nni", decoded, consumed, byteorder);
409}
410
411/*[clinic input]
412_codecs.utf_32_decode
413 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300414 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200415 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300416 /
417[clinic start generated code]*/
418
419static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300420_codecs_utf_32_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300421 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300422/*[clinic end generated code: output=2fc961807f7b145f input=fd7193965627eb58]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300423{
424 int byteorder = 0;
425 /* This is overwritten unless final is true. */
426 Py_ssize_t consumed = data->len;
427 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
428 errors, &byteorder,
429 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000430 return codec_tuple(decoded, consumed);
431}
432
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300433/*[clinic input]
434_codecs.utf_32_le_decode
435 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300436 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200437 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300438 /
439[clinic start generated code]*/
440
Walter Dörwald41980ca2007-08-16 21:55:45 +0000441static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300442_codecs_utf_32_le_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300443 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300444/*[clinic end generated code: output=ec8f46b67a94f3e6 input=9078ec70acfe7613]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000445{
Walter Dörwald41980ca2007-08-16 21:55:45 +0000446 int byteorder = -1;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300447 /* This is overwritten unless final is true. */
448 Py_ssize_t consumed = data->len;
449 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
450 errors, &byteorder,
451 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000452 return codec_tuple(decoded, consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000453}
454
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300455/*[clinic input]
456_codecs.utf_32_be_decode
457 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300458 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200459 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300460 /
461[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000462
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300463static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300464_codecs_utf_32_be_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300465 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300466/*[clinic end generated code: output=ff82bae862c92c4e input=f1ae1bbbb86648ff]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300467{
468 int byteorder = 1;
469 /* This is overwritten unless final is true. */
470 Py_ssize_t consumed = data->len;
471 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
472 errors, &byteorder,
473 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000474 return codec_tuple(decoded, consumed);
475}
476
477/* This non-standard version also provides access to the byteorder
478 parameter of the builtin UTF-32 codec.
479
480 It returns a tuple (unicode, bytesread, byteorder) with byteorder
481 being the value in effect at the end of data.
482
483*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300484/*[clinic input]
485_codecs.utf_32_ex_decode
486 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300487 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300488 byteorder: int = 0
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200489 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300490 /
491[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000492
493static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300494_codecs_utf_32_ex_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300495 const char *errors, int byteorder, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300496/*[clinic end generated code: output=6bfb177dceaf4848 input=e46a73bc859d0bd0]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000497{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300498 Py_ssize_t consumed = data->len;
499 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
500 errors, &byteorder,
501 final ? NULL : &consumed);
502 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 return NULL;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300504 return Py_BuildValue("Nni", decoded, consumed, byteorder);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000505}
506
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300507/*[clinic input]
508_codecs.unicode_escape_decode
509 data: Py_buffer(accept={str, buffer})
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300510 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300511 /
512[clinic start generated code]*/
513
Walter Dörwald41980ca2007-08-16 21:55:45 +0000514static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300515_codecs_unicode_escape_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300516 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300517/*[clinic end generated code: output=3ca3c917176b82ab input=8328081a3a569bd6]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000518{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300519 PyObject *decoded = PyUnicode_DecodeUnicodeEscape(data->buf, data->len,
520 errors);
521 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000522}
523
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300524/*[clinic input]
525_codecs.raw_unicode_escape_decode
526 data: Py_buffer(accept={str, buffer})
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300527 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300528 /
529[clinic start generated code]*/
530
Guido van Rossume2d67f92000-03-10 23:09:23 +0000531static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300532_codecs_raw_unicode_escape_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300533 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300534/*[clinic end generated code: output=c98eeb56028070a6 input=d2f5159ce3b3392f]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000535{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300536 PyObject *decoded = PyUnicode_DecodeRawUnicodeEscape(data->buf, data->len,
537 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.latin_1_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_latin_1_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=07f3dfa3f72c7d8f input=76ca58fd6dcd08c7]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000552{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300553 PyObject *decoded = PyUnicode_DecodeLatin1(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.ascii_decode
559 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300560 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300561 /
562[clinic start generated code]*/
563
Guido van Rossume2d67f92000-03-10 23:09:23 +0000564static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300565_codecs_ascii_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300566 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300567/*[clinic end generated code: output=2627d72058d42429 input=e428a267a04b4481]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000568{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300569 PyObject *decoded = PyUnicode_DecodeASCII(data->buf, data->len, errors);
570 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000571}
572
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300573/*[clinic input]
574_codecs.charmap_decode
575 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300576 errors: str(accept={str, NoneType}) = None
577 mapping: object = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300578 /
579[clinic start generated code]*/
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000580
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300581static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300582_codecs_charmap_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300583 const char *errors, PyObject *mapping)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300584/*[clinic end generated code: output=2c335b09778cf895 input=15b69df43458eb40]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300585{
586 PyObject *decoded;
587
Guido van Rossume2d67f92000-03-10 23:09:23 +0000588 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000590
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300591 decoded = PyUnicode_DecodeCharmap(data->buf, data->len, mapping, errors);
592 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000593}
594
Steve Dowercc16be82016-09-08 10:35:16 -0700595#ifdef MS_WINDOWS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000596
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300597/*[clinic input]
598_codecs.mbcs_decode
599 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300600 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200601 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300602 /
603[clinic start generated code]*/
604
Guido van Rossum24bdb042000-03-28 20:29:59 +0000605static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300606_codecs_mbcs_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300607 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300608/*[clinic end generated code: output=39b65b8598938c4b input=1c1d50f08fa53789]*/
Guido van Rossum24bdb042000-03-28 20:29:59 +0000609{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300610 Py_ssize_t consumed = data->len;
611 PyObject *decoded = PyUnicode_DecodeMBCSStateful(data->buf, data->len,
612 errors, final ? NULL : &consumed);
Martin v. Löwis423be952008-08-13 15:53:07 +0000613 return codec_tuple(decoded, consumed);
Guido van Rossum24bdb042000-03-28 20:29:59 +0000614}
615
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300616/*[clinic input]
Steve Dowerf5aba582016-09-06 19:42:27 -0700617_codecs.oem_decode
618 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300619 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200620 final: bool(accept={int}) = False
Steve Dowerf5aba582016-09-06 19:42:27 -0700621 /
622[clinic start generated code]*/
623
624static PyObject *
625_codecs_oem_decode_impl(PyObject *module, Py_buffer *data,
626 const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300627/*[clinic end generated code: output=da1617612f3fcad8 input=81b67cba811022e5]*/
Steve Dowerf5aba582016-09-06 19:42:27 -0700628{
629 Py_ssize_t consumed = data->len;
630 PyObject *decoded = PyUnicode_DecodeCodePageStateful(CP_OEMCP,
631 data->buf, data->len, errors, final ? NULL : &consumed);
632 return codec_tuple(decoded, consumed);
633}
634
635/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300636_codecs.code_page_decode
637 codepage: int
638 data: Py_buffer
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300639 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200640 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300641 /
642[clinic start generated code]*/
643
Victor Stinner3a50e702011-10-18 21:21:00 +0200644static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300645_codecs_code_page_decode_impl(PyObject *module, int codepage,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300646 Py_buffer *data, const char *errors, int final)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300647/*[clinic end generated code: output=53008ea967da3fff input=c5f58d036cb63575]*/
Victor Stinner3a50e702011-10-18 21:21:00 +0200648{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300649 Py_ssize_t consumed = data->len;
Serhiy Storchaka1aa5e1d2015-05-12 14:00:22 +0300650 PyObject *decoded = PyUnicode_DecodeCodePageStateful(codepage,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300651 data->buf, data->len,
652 errors,
653 final ? NULL : &consumed);
Victor Stinner3a50e702011-10-18 21:21:00 +0200654 return codec_tuple(decoded, consumed);
655}
656
Steve Dowercc16be82016-09-08 10:35:16 -0700657#endif /* MS_WINDOWS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000658
Guido van Rossume2d67f92000-03-10 23:09:23 +0000659/* --- Encoder ------------------------------------------------------------ */
660
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300661/*[clinic input]
662_codecs.readbuffer_encode
663 data: Py_buffer(accept={str, buffer})
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]*/
667
Guido van Rossume2d67f92000-03-10 23:09:23 +0000668static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300669_codecs_readbuffer_encode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300670 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300671/*[clinic end generated code: output=c645ea7cdb3d6e86 input=aa10cfdf252455c5]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000672{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300673 PyObject *result = PyBytes_FromStringAndSize(data->buf, data->len);
674 return codec_tuple(result, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000675}
676
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300677/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300678_codecs.utf_7_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]*/
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000683
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300684static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300685_codecs_utf_7_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=0feda21ffc921bc8 input=2546dbbb3fa53114]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300688{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300689 return codec_tuple(_PyUnicode_EncodeUTF7(str, 0, 0, errors),
690 PyUnicode_GET_LENGTH(str));
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000691}
692
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300693/*[clinic input]
694_codecs.utf_8_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300695 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300696 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300697 /
698[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000699
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300700static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300701_codecs_utf_8_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300702 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300703/*[clinic end generated code: output=02bf47332b9c796c input=a3e71ae01c3f93f3]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300704{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300705 return codec_tuple(_PyUnicode_AsUTF8String(str, errors),
706 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000707}
708
709/* This version provides access to the byteorder parameter of the
710 builtin UTF-16 codecs as optional third argument. It defaults to 0
711 which means: use the native byte order and prepend the data with a
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000712 BOM mark.
Guido van Rossume2d67f92000-03-10 23:09:23 +0000713
714*/
715
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300716/*[clinic input]
717_codecs.utf_16_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300718 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300719 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300720 byteorder: int = 0
721 /
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_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300726 const char *errors, int byteorder)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300727/*[clinic end generated code: output=c654e13efa2e64e4 input=68cdc2eb8338555d]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300728{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300729 return codec_tuple(_PyUnicode_EncodeUTF16(str, errors, byteorder),
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_le_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_le_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=431b01e55f2d4995 input=83d042706eed6798]*/
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
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300749/*[clinic input]
750_codecs.utf_16_be_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300751 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300752 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300753 /
754[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000755
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300756static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300757_codecs_utf_16_be_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300758 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300759/*[clinic end generated code: output=96886a6fd54dcae3 input=6f1e9e623b03071b]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300760{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300761 return codec_tuple(_PyUnicode_EncodeUTF16(str, errors, +1),
762 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000763}
764
Walter Dörwald41980ca2007-08-16 21:55:45 +0000765/* This version provides access to the byteorder parameter of the
766 builtin UTF-32 codecs as optional third argument. It defaults to 0
767 which means: use the native byte order and prepend the data with a
768 BOM mark.
769
770*/
771
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300772/*[clinic input]
773_codecs.utf_32_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300774 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300775 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300776 byteorder: int = 0
777 /
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_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300782 const char *errors, int byteorder)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300783/*[clinic end generated code: output=5c760da0c09a8b83 input=8ec4c64d983bc52b]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300784{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300785 return codec_tuple(_PyUnicode_EncodeUTF32(str, errors, byteorder),
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_le_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_le_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=b65cd176de8e36d6 input=f0918d41de3eb1b1]*/
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.utf_32_be_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]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000811
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300812static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300813_codecs_utf_32_be_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=1d9e71a9358709e9 input=967a99a95748b557]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300816{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300817 return codec_tuple(_PyUnicode_EncodeUTF32(str, errors, +1),
818 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000819}
820
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300821/*[clinic input]
822_codecs.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_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=66271b30bc4f7a3c input=8c4de07597054e33]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300832{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300833 return codec_tuple(PyUnicode_AsUnicodeEscapeString(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.raw_unicode_escape_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_raw_unicode_escape_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=a66a806ed01c830a input=4aa6f280d78e4574]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300848{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300849 return codec_tuple(PyUnicode_AsRawUnicodeEscapeString(str),
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.latin_1_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_latin_1_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=2c28c83a27884e08 input=ec3ef74bf85c5c5d]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300864{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300865 return codec_tuple(_PyUnicode_AsLatin1String(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.ascii_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
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300873 /
874[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000875
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300876static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300877_codecs_ascii_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300878 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300879/*[clinic end generated code: output=b5e035182d33befc input=93e6e602838bd3de]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300880{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300881 return codec_tuple(_PyUnicode_AsASCIIString(str, errors),
882 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000883}
884
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300885/*[clinic input]
886_codecs.charmap_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300887 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300888 errors: str(accept={str, NoneType}) = None
889 mapping: object = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300890 /
891[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000892
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300893static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300894_codecs_charmap_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300895 const char *errors, PyObject *mapping)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300896/*[clinic end generated code: output=047476f48495a9e9 input=2a98feae73dadce8]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300897{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000898 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000900
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300901 return codec_tuple(_PyUnicode_EncodeCharmap(str, mapping, errors),
902 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000903}
904
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300905/*[clinic input]
906_codecs.charmap_build
907 map: unicode
908 /
909[clinic start generated code]*/
910
911static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300912_codecs_charmap_build_impl(PyObject *module, PyObject *map)
913/*[clinic end generated code: output=bb073c27031db9ac input=d91a91d1717dbc6d]*/
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000914{
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000915 return PyUnicode_BuildEncodingMap(map);
916}
917
Steve Dowercc16be82016-09-08 10:35:16 -0700918#ifdef MS_WINDOWS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000919
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300920/*[clinic input]
921_codecs.mbcs_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300922 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300923 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300924 /
925[clinic start generated code]*/
Guido van Rossum24bdb042000-03-28 20:29:59 +0000926
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300927static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300928_codecs_mbcs_encode_impl(PyObject *module, PyObject *str, const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300929/*[clinic end generated code: output=76e2e170c966c080 input=2e932fc289ea5a5b]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300930{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300931 return codec_tuple(PyUnicode_EncodeCodePage(CP_ACP, str, errors),
932 PyUnicode_GET_LENGTH(str));
Guido van Rossum24bdb042000-03-28 20:29:59 +0000933}
934
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300935/*[clinic input]
Steve Dowerf5aba582016-09-06 19:42:27 -0700936_codecs.oem_encode
937 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300938 errors: str(accept={str, NoneType}) = None
Steve Dowerf5aba582016-09-06 19:42:27 -0700939 /
940[clinic start generated code]*/
941
942static PyObject *
943_codecs_oem_encode_impl(PyObject *module, PyObject *str, const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300944/*[clinic end generated code: output=65d5982c737de649 input=9eac86dc21eb14f2]*/
Steve Dowerf5aba582016-09-06 19:42:27 -0700945{
946 return codec_tuple(PyUnicode_EncodeCodePage(CP_OEMCP, str, errors),
947 PyUnicode_GET_LENGTH(str));
948}
949
950/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300951_codecs.code_page_encode
952 code_page: int
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300953 str: unicode
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300954 errors: str(accept={str, NoneType}) = None
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300955 /
956[clinic start generated code]*/
Victor Stinner3a50e702011-10-18 21:21:00 +0200957
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300958static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300959_codecs_code_page_encode_impl(PyObject *module, int code_page, PyObject *str,
960 const char *errors)
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300961/*[clinic end generated code: output=45673f6085657a9e input=7d18a33bc8cd0f94]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300962{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300963 return codec_tuple(PyUnicode_EncodeCodePage(code_page, str, errors),
964 PyUnicode_GET_LENGTH(str));
Victor Stinner3a50e702011-10-18 21:21:00 +0200965}
966
Steve Dowercc16be82016-09-08 10:35:16 -0700967#endif /* MS_WINDOWS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000968
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000969/* --- Error handler registry --------------------------------------------- */
970
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300971/*[clinic input]
972_codecs.register_error
973 errors: str
974 handler: object
975 /
Walter Dörwald0ae29812002-10-31 13:36:29 +0000976
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300977Register the specified error handler under the name errors.
978
979handler must be a callable object, that will be called with an exception
980instance containing information about the location of the encoding/decoding
981error and must return a (replacement, new position) tuple.
982[clinic start generated code]*/
983
984static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300985_codecs_register_error_impl(PyObject *module, const char *errors,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300986 PyObject *handler)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300987/*[clinic end generated code: output=fa2f7d1879b3067d input=5e6709203c2e33fe]*/
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000988{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300989 if (PyCodec_RegisterError(errors, handler))
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000990 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000991 Py_RETURN_NONE;
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000992}
993
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300994/*[clinic input]
995_codecs.lookup_error
996 name: str
997 /
Walter Dörwald0ae29812002-10-31 13:36:29 +0000998
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300999lookup_error(errors) -> handler
1000
1001Return the error handler for the specified error handling name or raise a
1002LookupError, if no handler exists under this name.
1003[clinic start generated code]*/
1004
1005static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001006_codecs_lookup_error_impl(PyObject *module, const char *name)
1007/*[clinic end generated code: output=087f05dc0c9a98cc input=4775dd65e6235aba]*/
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001008{
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001009 return PyCodec_LookupError(name);
1010}
1011
Guido van Rossume2d67f92000-03-10 23:09:23 +00001012/* --- Module API --------------------------------------------------------- */
1013
1014static PyMethodDef _codecs_functions[] = {
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001015 _CODECS_REGISTER_METHODDEF
Hai Shid332e7b2020-09-29 05:41:11 +08001016 _CODECS_UNREGISTER_METHODDEF
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001017 _CODECS_LOOKUP_METHODDEF
1018 _CODECS_ENCODE_METHODDEF
1019 _CODECS_DECODE_METHODDEF
1020 _CODECS_ESCAPE_ENCODE_METHODDEF
1021 _CODECS_ESCAPE_DECODE_METHODDEF
1022 _CODECS_UTF_8_ENCODE_METHODDEF
1023 _CODECS_UTF_8_DECODE_METHODDEF
1024 _CODECS_UTF_7_ENCODE_METHODDEF
1025 _CODECS_UTF_7_DECODE_METHODDEF
1026 _CODECS_UTF_16_ENCODE_METHODDEF
1027 _CODECS_UTF_16_LE_ENCODE_METHODDEF
1028 _CODECS_UTF_16_BE_ENCODE_METHODDEF
1029 _CODECS_UTF_16_DECODE_METHODDEF
1030 _CODECS_UTF_16_LE_DECODE_METHODDEF
1031 _CODECS_UTF_16_BE_DECODE_METHODDEF
1032 _CODECS_UTF_16_EX_DECODE_METHODDEF
1033 _CODECS_UTF_32_ENCODE_METHODDEF
1034 _CODECS_UTF_32_LE_ENCODE_METHODDEF
1035 _CODECS_UTF_32_BE_ENCODE_METHODDEF
1036 _CODECS_UTF_32_DECODE_METHODDEF
1037 _CODECS_UTF_32_LE_DECODE_METHODDEF
1038 _CODECS_UTF_32_BE_DECODE_METHODDEF
1039 _CODECS_UTF_32_EX_DECODE_METHODDEF
1040 _CODECS_UNICODE_ESCAPE_ENCODE_METHODDEF
1041 _CODECS_UNICODE_ESCAPE_DECODE_METHODDEF
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001042 _CODECS_RAW_UNICODE_ESCAPE_ENCODE_METHODDEF
1043 _CODECS_RAW_UNICODE_ESCAPE_DECODE_METHODDEF
1044 _CODECS_LATIN_1_ENCODE_METHODDEF
1045 _CODECS_LATIN_1_DECODE_METHODDEF
1046 _CODECS_ASCII_ENCODE_METHODDEF
1047 _CODECS_ASCII_DECODE_METHODDEF
1048 _CODECS_CHARMAP_ENCODE_METHODDEF
1049 _CODECS_CHARMAP_DECODE_METHODDEF
1050 _CODECS_CHARMAP_BUILD_METHODDEF
1051 _CODECS_READBUFFER_ENCODE_METHODDEF
1052 _CODECS_MBCS_ENCODE_METHODDEF
1053 _CODECS_MBCS_DECODE_METHODDEF
Steve Dowerf5aba582016-09-06 19:42:27 -07001054 _CODECS_OEM_ENCODE_METHODDEF
1055 _CODECS_OEM_DECODE_METHODDEF
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001056 _CODECS_CODE_PAGE_ENCODE_METHODDEF
1057 _CODECS_CODE_PAGE_DECODE_METHODDEF
1058 _CODECS_REGISTER_ERROR_METHODDEF
1059 _CODECS_LOOKUP_ERROR_METHODDEF
Nick Coghlan8fad1672014-09-15 23:50:44 +12001060 _CODECS__FORGET_CODEC_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 {NULL, NULL} /* sentinel */
Guido van Rossume2d67f92000-03-10 23:09:23 +00001062};
1063
Hai Shi1ea45ae2020-02-11 05:16:38 -06001064static PyModuleDef_Slot _codecs_slots[] = {
1065 {0, NULL}
1066};
1067
Martin v. Löwis1a214512008-06-11 05:26:20 +00001068static struct PyModuleDef codecsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 PyModuleDef_HEAD_INIT,
1070 "_codecs",
1071 NULL,
Hai Shi1ea45ae2020-02-11 05:16:38 -06001072 0,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 _codecs_functions,
Hai Shi1ea45ae2020-02-11 05:16:38 -06001074 _codecs_slots,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 NULL,
1076 NULL,
1077 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001078};
1079
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001080PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001081PyInit__codecs(void)
Guido van Rossume2d67f92000-03-10 23:09:23 +00001082{
Hai Shi1ea45ae2020-02-11 05:16:38 -06001083 return PyModuleDef_Init(&codecsmodule);
Guido van Rossume2d67f92000-03-10 23:09:23 +00001084}