blob: 586b73ad38f5f97087919626c1f14f70659c0800 [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,
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +000024 raw_unicode_escape, unicode_internal, latin_1, ascii (7-bit),
25 mbcs (on win32).
26
Guido van Rossume2d67f92000-03-10 23:09:23 +000027
28Written by Marc-Andre Lemburg (mal@lemburg.com).
29
Guido van Rossum16b1ad92000-08-03 16:24:25 +000030Copyright (c) Corporation for National Research Initiatives.
Guido van Rossume2d67f92000-03-10 23:09:23 +000031
32 ------------------------------------------------------------------------ */
33
Martin v. Löwis18e16552006-02-15 17:27:45 +000034#define PY_SSIZE_T_CLEAN
Guido van Rossume2d67f92000-03-10 23:09:23 +000035#include "Python.h"
36
Victor Stinner87a7c822011-11-10 20:05:55 +010037#ifdef MS_WINDOWS
38#include <windows.h>
39#endif
40
Nick Coghlan8fad1672014-09-15 23:50:44 +120041/*[clinic input]
42module _codecs
43[clinic start generated code]*/
44/*[clinic end generated code: output=da39a3ee5e6b4b0d input=e1390e3da3cb9deb]*/
45
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030046#include "clinic/_codecsmodule.c.h"
Nick Coghlan8fad1672014-09-15 23:50:44 +120047
Guido van Rossume2d67f92000-03-10 23:09:23 +000048/* --- Registry ----------------------------------------------------------- */
49
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030050/*[clinic input]
51_codecs.register
52 search_function: object
53 /
Walter Dörwald0ae29812002-10-31 13:36:29 +000054
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030055Register a codec search function.
56
57Search functions are expected to take one argument, the encoding name in
58all lower case letters, and either return None, or a tuple of functions
59(encoder, decoder, stream_reader, stream_writer) (or a CodecInfo object).
60[clinic start generated code]*/
61
62static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030063_codecs_register(PyObject *module, PyObject *search_function)
64/*[clinic end generated code: output=d1bf21e99db7d6d3 input=369578467955cae4]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +000065{
Guido van Rossume2d67f92000-03-10 23:09:23 +000066 if (PyCodec_Register(search_function))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000067 return NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +000068
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000069 Py_RETURN_NONE;
Guido van Rossume2d67f92000-03-10 23:09:23 +000070}
71
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030072/*[clinic input]
73_codecs.lookup
74 encoding: str
75 /
Walter Dörwald0ae29812002-10-31 13:36:29 +000076
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030077Looks up a codec tuple in the Python codec registry and returns a CodecInfo object.
78[clinic start generated code]*/
79
80static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030081_codecs_lookup_impl(PyObject *module, const char *encoding)
82/*[clinic end generated code: output=9f0afa572080c36d input=3c572c0db3febe9c]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +000083{
Guido van Rossume2d67f92000-03-10 23:09:23 +000084 return _PyCodec_Lookup(encoding);
Guido van Rossume2d67f92000-03-10 23:09:23 +000085}
86
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030087/*[clinic input]
88_codecs.encode
89 obj: object
Serhiy Storchakac97a9622015-08-09 12:23:08 +030090 encoding: str(c_default="NULL") = "utf-8"
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030091 errors: str(c_default="NULL") = "strict"
92
93Encodes obj using the codec registered for encoding.
94
Serhiy Storchakac97a9622015-08-09 12:23:08 +030095The default encoding is 'utf-8'. errors may be given to set a
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030096different error handling scheme. Default is 'strict' meaning that encoding
97errors raise a ValueError. Other possible values are 'ignore', 'replace'
98and 'backslashreplace' as well as any other name registered with
99codecs.register_error that can handle ValueErrors.
100[clinic start generated code]*/
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000101
102static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300103_codecs_encode_impl(PyObject *module, PyObject *obj, const char *encoding,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300104 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300105/*[clinic end generated code: output=385148eb9a067c86 input=cd5b685040ff61f0]*/
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000106{
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000107 if (encoding == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 encoding = PyUnicode_GetDefaultEncoding();
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000109
110 /* Encode via the codec registry */
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300111 return PyCodec_Encode(obj, encoding, errors);
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000112}
113
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300114/*[clinic input]
115_codecs.decode
116 obj: object
Serhiy Storchakac97a9622015-08-09 12:23:08 +0300117 encoding: str(c_default="NULL") = "utf-8"
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300118 errors: str(c_default="NULL") = "strict"
119
120Decodes obj using the codec registered for encoding.
121
Serhiy Storchakac97a9622015-08-09 12:23:08 +0300122Default encoding is 'utf-8'. errors may be given to set a
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300123different error handling scheme. Default is 'strict' meaning that encoding
124errors raise a ValueError. Other possible values are 'ignore', 'replace'
125and 'backslashreplace' as well as any other name registered with
126codecs.register_error that can handle ValueErrors.
127[clinic start generated code]*/
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000128
129static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300130_codecs_decode_impl(PyObject *module, PyObject *obj, const char *encoding,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300131 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300132/*[clinic end generated code: output=679882417dc3a0bd input=7702c0cc2fa1add6]*/
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000133{
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000134 if (encoding == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000135 encoding = PyUnicode_GetDefaultEncoding();
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000136
137 /* Decode via the codec registry */
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300138 return PyCodec_Decode(obj, encoding, errors);
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000139}
140
Guido van Rossume2d67f92000-03-10 23:09:23 +0000141/* --- Helpers ------------------------------------------------------------ */
142
Nick Coghlan8fad1672014-09-15 23:50:44 +1200143/*[clinic input]
144_codecs._forget_codec
145
146 encoding: str
147 /
148
149Purge the named codec from the internal codec lookup cache
150[clinic start generated code]*/
151
Nick Coghlan8fad1672014-09-15 23:50:44 +1200152static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300153_codecs__forget_codec_impl(PyObject *module, const char *encoding)
154/*[clinic end generated code: output=0bde9f0a5b084aa2 input=18d5d92d0e386c38]*/
Nick Coghlan8fad1672014-09-15 23:50:44 +1200155{
156 if (_PyCodec_Forget(encoding) < 0) {
157 return NULL;
158 };
159 Py_RETURN_NONE;
160}
161
Guido van Rossume2d67f92000-03-10 23:09:23 +0000162static
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300163PyObject *codec_tuple(PyObject *decoded,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000164 Py_ssize_t len)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000165{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300166 if (decoded == NULL)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000167 return NULL;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300168 return Py_BuildValue("Nn", decoded, len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000169}
170
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000171/* --- String codecs ------------------------------------------------------ */
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300172/*[clinic input]
173_codecs.escape_decode
174 data: Py_buffer(accept={str, buffer})
175 errors: str(accept={str, NoneType}) = NULL
176 /
177[clinic start generated code]*/
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000178
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300179static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300180_codecs_escape_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300181 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300182/*[clinic end generated code: output=505200ba8056979a input=0018edfd99db714d]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300183{
184 PyObject *decoded = PyBytes_DecodeEscape(data->buf, data->len,
185 errors, 0, NULL);
186 return codec_tuple(decoded, data->len);
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000187}
188
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300189/*[clinic input]
190_codecs.escape_encode
191 data: object(subclass_of='&PyBytes_Type')
192 errors: str(accept={str, NoneType}) = NULL
193 /
194[clinic start generated code]*/
195
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000196static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300197_codecs_escape_encode_impl(PyObject *module, PyObject *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300198 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300199/*[clinic end generated code: output=4af1d477834bab34 input=da9ded00992f32f2]*/
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000200{
Antoine Pitroud1188562010-06-09 16:38:55 +0000201 Py_ssize_t size;
202 Py_ssize_t newsize;
Antoine Pitroud1188562010-06-09 16:38:55 +0000203 PyObject *v;
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000204
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300205 size = PyBytes_GET_SIZE(data);
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100206 if (size > PY_SSIZE_T_MAX / 4) {
Antoine Pitroud1188562010-06-09 16:38:55 +0000207 PyErr_SetString(PyExc_OverflowError,
208 "string is too large to encode");
209 return NULL;
210 }
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100211 newsize = 4*size;
Antoine Pitroud1188562010-06-09 16:38:55 +0000212 v = PyBytes_FromStringAndSize(NULL, newsize);
213
214 if (v == NULL) {
215 return NULL;
216 }
217 else {
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200218 Py_ssize_t i;
219 char c;
220 char *p = PyBytes_AS_STRING(v);
Antoine Pitroud1188562010-06-09 16:38:55 +0000221
222 for (i = 0; i < size; i++) {
223 /* There's at least enough room for a hex escape */
224 assert(newsize - (p - PyBytes_AS_STRING(v)) >= 4);
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300225 c = PyBytes_AS_STRING(data)[i];
Antoine Pitroud1188562010-06-09 16:38:55 +0000226 if (c == '\'' || c == '\\')
227 *p++ = '\\', *p++ = c;
228 else if (c == '\t')
229 *p++ = '\\', *p++ = 't';
230 else if (c == '\n')
231 *p++ = '\\', *p++ = 'n';
232 else if (c == '\r')
233 *p++ = '\\', *p++ = 'r';
234 else if (c < ' ' || c >= 0x7f) {
235 *p++ = '\\';
236 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +0200237 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
238 *p++ = Py_hexdigits[c & 0xf];
Antoine Pitroud1188562010-06-09 16:38:55 +0000239 }
240 else
241 *p++ = c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 }
Antoine Pitroud1188562010-06-09 16:38:55 +0000243 *p = '\0';
244 if (_PyBytes_Resize(&v, (p - PyBytes_AS_STRING(v)))) {
245 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 }
Antoine Pitroud1188562010-06-09 16:38:55 +0000247 }
Walter Dörwald1ab83302007-05-18 17:15:44 +0000248
Antoine Pitroud1188562010-06-09 16:38:55 +0000249 return codec_tuple(v, size);
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000250}
251
Guido van Rossume2d67f92000-03-10 23:09:23 +0000252/* --- Decoder ------------------------------------------------------------ */
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300253/*[clinic input]
254_codecs.unicode_internal_decode
255 obj: object
256 errors: str(accept={str, NoneType}) = NULL
257 /
258[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000259
260static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300261_codecs_unicode_internal_decode_impl(PyObject *module, PyObject *obj,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300262 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300263/*[clinic end generated code: output=edbfe175e09eff9a input=8d57930aeda170c6]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000264{
Marc-André Lemburg29273c82003-02-04 19:35:03 +0000265 if (PyUnicode_Check(obj)) {
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100266 if (PyUnicode_READY(obj) < 0)
267 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 Py_INCREF(obj);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100269 return codec_tuple(obj, PyUnicode_GET_LENGTH(obj));
Marc-André Lemburg29273c82003-02-04 19:35:03 +0000270 }
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000271 else {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200272 Py_buffer view;
273 PyObject *result;
274 if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 return NULL;
Walter Dörwalda47d1c02005-08-30 10:23:14 +0000276
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200277 result = codec_tuple(
278 _PyUnicode_DecodeUnicodeInternal(view.buf, view.len, errors),
279 view.len);
280 PyBuffer_Release(&view);
281 return result;
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000282 }
Guido van Rossume2d67f92000-03-10 23:09:23 +0000283}
284
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300285/*[clinic input]
286_codecs.utf_7_decode
287 data: Py_buffer
288 errors: str(accept={str, NoneType}) = NULL
289 final: int(c_default="0") = False
290 /
291[clinic start generated code]*/
292
Guido van Rossume2d67f92000-03-10 23:09:23 +0000293static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300294_codecs_utf_7_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300295 const char *errors, int final)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300296/*[clinic end generated code: output=0cd3a944a32a4089 input=bc4d6247ecdb01e6]*/
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000297{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300298 Py_ssize_t consumed = data->len;
299 PyObject *decoded = PyUnicode_DecodeUTF7Stateful(data->buf, data->len,
300 errors,
301 final ? NULL : &consumed);
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000302 return codec_tuple(decoded, consumed);
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000303}
304
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300305/*[clinic input]
306_codecs.utf_8_decode
307 data: Py_buffer
308 errors: str(accept={str, NoneType}) = NULL
309 final: int(c_default="0") = False
310 /
311[clinic start generated code]*/
312
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000313static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300314_codecs_utf_8_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300315 const char *errors, int final)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300316/*[clinic end generated code: output=10f74dec8d9bb8bf input=39161d71e7422ee2]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000317{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300318 Py_ssize_t consumed = data->len;
319 PyObject *decoded = PyUnicode_DecodeUTF8Stateful(data->buf, data->len,
320 errors,
321 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000322 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000323}
324
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300325/*[clinic input]
326_codecs.utf_16_decode
327 data: Py_buffer
328 errors: str(accept={str, NoneType}) = NULL
329 final: int(c_default="0") = False
330 /
331[clinic start generated code]*/
332
Guido van Rossume2d67f92000-03-10 23:09:23 +0000333static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300334_codecs_utf_16_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300335 const char *errors, int final)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300336/*[clinic end generated code: output=783b442abcbcc2d0 input=f3cf01d1461007ce]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000337{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000338 int byteorder = 0;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300339 /* This is overwritten unless final is true. */
340 Py_ssize_t consumed = data->len;
341 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
342 errors, &byteorder,
343 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000344 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000345}
346
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300347/*[clinic input]
348_codecs.utf_16_le_decode
349 data: Py_buffer
350 errors: str(accept={str, NoneType}) = NULL
351 final: int(c_default="0") = False
352 /
353[clinic start generated code]*/
354
Guido van Rossume2d67f92000-03-10 23:09:23 +0000355static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300356_codecs_utf_16_le_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300357 const char *errors, int final)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300358/*[clinic end generated code: output=899b9e6364379dcd input=a77e3bf97335d94e]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000359{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000360 int byteorder = -1;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300361 /* This is overwritten unless final is true. */
362 Py_ssize_t consumed = data->len;
363 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
364 errors, &byteorder,
365 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000366 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000367}
368
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300369/*[clinic input]
370_codecs.utf_16_be_decode
371 data: Py_buffer
372 errors: str(accept={str, NoneType}) = NULL
373 final: int(c_default="0") = False
374 /
375[clinic start generated code]*/
376
Guido van Rossume2d67f92000-03-10 23:09:23 +0000377static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300378_codecs_utf_16_be_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300379 const char *errors, int final)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300380/*[clinic end generated code: output=49f6465ea07669c8 input=606f69fae91b5563]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000381{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000382 int byteorder = 1;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300383 /* This is overwritten unless final is true. */
384 Py_ssize_t consumed = data->len;
385 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
386 errors, &byteorder,
387 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000388 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000389}
390
391/* This non-standard version also provides access to the byteorder
392 parameter of the builtin UTF-16 codec.
393
394 It returns a tuple (unicode, bytesread, byteorder) with byteorder
395 being the value in effect at the end of data.
396
397*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300398/*[clinic input]
399_codecs.utf_16_ex_decode
400 data: Py_buffer
401 errors: str(accept={str, NoneType}) = NULL
402 byteorder: int = 0
403 final: int(c_default="0") = False
404 /
405[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000406
407static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300408_codecs_utf_16_ex_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300409 const char *errors, int byteorder, int final)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300410/*[clinic end generated code: output=0f385f251ecc1988 input=f6e7f697658c013e]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000411{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300412 /* This is overwritten unless final is true. */
413 Py_ssize_t consumed = data->len;
Walter Dörwald69652032004-09-07 20:24:22 +0000414
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300415 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
416 errors, &byteorder,
417 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000418 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 return NULL;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300420 return Py_BuildValue("Nni", decoded, consumed, byteorder);
421}
422
423/*[clinic input]
424_codecs.utf_32_decode
425 data: Py_buffer
426 errors: str(accept={str, NoneType}) = NULL
427 final: int(c_default="0") = False
428 /
429[clinic start generated code]*/
430
431static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300432_codecs_utf_32_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300433 const char *errors, int final)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300434/*[clinic end generated code: output=2fc961807f7b145f input=86d4f41c6c2e763d]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300435{
436 int byteorder = 0;
437 /* This is overwritten unless final is true. */
438 Py_ssize_t consumed = data->len;
439 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
440 errors, &byteorder,
441 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000442 return codec_tuple(decoded, consumed);
443}
444
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300445/*[clinic input]
446_codecs.utf_32_le_decode
447 data: Py_buffer
448 errors: str(accept={str, NoneType}) = NULL
449 final: int(c_default="0") = False
450 /
451[clinic start generated code]*/
452
Walter Dörwald41980ca2007-08-16 21:55:45 +0000453static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300454_codecs_utf_32_le_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300455 const char *errors, int final)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300456/*[clinic end generated code: output=ec8f46b67a94f3e6 input=d18b650772d188ba]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000457{
Walter Dörwald41980ca2007-08-16 21:55:45 +0000458 int byteorder = -1;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300459 /* This is overwritten unless final is true. */
460 Py_ssize_t consumed = data->len;
461 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
462 errors, &byteorder,
463 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000464 return codec_tuple(decoded, consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000465}
466
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300467/*[clinic input]
468_codecs.utf_32_be_decode
469 data: Py_buffer
470 errors: str(accept={str, NoneType}) = NULL
471 final: int(c_default="0") = False
472 /
473[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000474
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300475static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300476_codecs_utf_32_be_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300477 const char *errors, int final)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300478/*[clinic end generated code: output=ff82bae862c92c4e input=19c271b5d34926d8]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300479{
480 int byteorder = 1;
481 /* This is overwritten unless final is true. */
482 Py_ssize_t consumed = data->len;
483 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
484 errors, &byteorder,
485 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000486 return codec_tuple(decoded, consumed);
487}
488
489/* This non-standard version also provides access to the byteorder
490 parameter of the builtin UTF-32 codec.
491
492 It returns a tuple (unicode, bytesread, byteorder) with byteorder
493 being the value in effect at the end of data.
494
495*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300496/*[clinic input]
497_codecs.utf_32_ex_decode
498 data: Py_buffer
499 errors: str(accept={str, NoneType}) = NULL
500 byteorder: int = 0
501 final: int(c_default="0") = False
502 /
503[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000504
505static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300506_codecs_utf_32_ex_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300507 const char *errors, int byteorder, int final)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300508/*[clinic end generated code: output=6bfb177dceaf4848 input=4af3e6ccfe34a076]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000509{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300510 Py_ssize_t consumed = data->len;
511 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
512 errors, &byteorder,
513 final ? NULL : &consumed);
514 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 return NULL;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300516 return Py_BuildValue("Nni", decoded, consumed, byteorder);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000517}
518
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300519/*[clinic input]
520_codecs.unicode_escape_decode
521 data: Py_buffer(accept={str, buffer})
522 errors: str(accept={str, NoneType}) = NULL
523 /
524[clinic start generated code]*/
525
Walter Dörwald41980ca2007-08-16 21:55:45 +0000526static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300527_codecs_unicode_escape_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300528 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300529/*[clinic end generated code: output=3ca3c917176b82ab input=49fd27d06813a7f5]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000530{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300531 PyObject *decoded = PyUnicode_DecodeUnicodeEscape(data->buf, data->len,
532 errors);
533 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000534}
535
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300536/*[clinic input]
537_codecs.raw_unicode_escape_decode
538 data: Py_buffer(accept={str, buffer})
539 errors: str(accept={str, NoneType}) = NULL
540 /
541[clinic start generated code]*/
542
Guido van Rossume2d67f92000-03-10 23:09:23 +0000543static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300544_codecs_raw_unicode_escape_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300545 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300546/*[clinic end generated code: output=c98eeb56028070a6 input=770903a211434ebc]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000547{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300548 PyObject *decoded = PyUnicode_DecodeRawUnicodeEscape(data->buf, data->len,
549 errors);
550 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000551}
552
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300553/*[clinic input]
554_codecs.latin_1_decode
555 data: Py_buffer
556 errors: str(accept={str, NoneType}) = NULL
557 /
558[clinic start generated code]*/
559
Guido van Rossume2d67f92000-03-10 23:09:23 +0000560static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300561_codecs_latin_1_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300562 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300563/*[clinic end generated code: output=07f3dfa3f72c7d8f input=5cad0f1759c618ec]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000564{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300565 PyObject *decoded = PyUnicode_DecodeLatin1(data->buf, data->len, errors);
566 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000567}
568
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300569/*[clinic input]
570_codecs.ascii_decode
571 data: Py_buffer
572 errors: str(accept={str, NoneType}) = NULL
573 /
574[clinic start generated code]*/
575
Guido van Rossume2d67f92000-03-10 23:09:23 +0000576static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300577_codecs_ascii_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300578 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300579/*[clinic end generated code: output=2627d72058d42429 input=ad1106f64037bd16]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000580{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300581 PyObject *decoded = PyUnicode_DecodeASCII(data->buf, data->len, errors);
582 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000583}
584
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300585/*[clinic input]
586_codecs.charmap_decode
587 data: Py_buffer
588 errors: str(accept={str, NoneType}) = NULL
589 mapping: object = NULL
590 /
591[clinic start generated code]*/
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000592
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300593static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300594_codecs_charmap_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300595 const char *errors, PyObject *mapping)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300596/*[clinic end generated code: output=2c335b09778cf895 input=19712ca35c5a80e2]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300597{
598 PyObject *decoded;
599
Guido van Rossume2d67f92000-03-10 23:09:23 +0000600 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000602
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300603 decoded = PyUnicode_DecodeCharmap(data->buf, data->len, mapping, errors);
604 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000605}
606
Steve Dowercc16be82016-09-08 10:35:16 -0700607#ifdef MS_WINDOWS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000608
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300609/*[clinic input]
610_codecs.mbcs_decode
611 data: Py_buffer
612 errors: str(accept={str, NoneType}) = NULL
613 final: int(c_default="0") = False
614 /
615[clinic start generated code]*/
616
Guido van Rossum24bdb042000-03-28 20:29:59 +0000617static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300618_codecs_mbcs_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300619 const char *errors, int final)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300620/*[clinic end generated code: output=39b65b8598938c4b input=d492c1ca64f4fa8a]*/
Guido van Rossum24bdb042000-03-28 20:29:59 +0000621{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300622 Py_ssize_t consumed = data->len;
623 PyObject *decoded = PyUnicode_DecodeMBCSStateful(data->buf, data->len,
624 errors, final ? NULL : &consumed);
Martin v. Löwis423be952008-08-13 15:53:07 +0000625 return codec_tuple(decoded, consumed);
Guido van Rossum24bdb042000-03-28 20:29:59 +0000626}
627
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300628/*[clinic input]
Steve Dowerf5aba582016-09-06 19:42:27 -0700629_codecs.oem_decode
630 data: Py_buffer
631 errors: str(accept={str, NoneType}) = NULL
632 final: int(c_default="0") = False
633 /
634[clinic start generated code]*/
635
636static PyObject *
637_codecs_oem_decode_impl(PyObject *module, Py_buffer *data,
638 const char *errors, int final)
639/*[clinic end generated code: output=da1617612f3fcad8 input=95b8a92c446b03cd]*/
640{
641 Py_ssize_t consumed = data->len;
642 PyObject *decoded = PyUnicode_DecodeCodePageStateful(CP_OEMCP,
643 data->buf, data->len, errors, final ? NULL : &consumed);
644 return codec_tuple(decoded, consumed);
645}
646
647/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300648_codecs.code_page_decode
649 codepage: int
650 data: Py_buffer
651 errors: str(accept={str, NoneType}) = NULL
652 final: int(c_default="0") = False
653 /
654[clinic start generated code]*/
655
Victor Stinner3a50e702011-10-18 21:21:00 +0200656static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300657_codecs_code_page_decode_impl(PyObject *module, int codepage,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300658 Py_buffer *data, const char *errors, int final)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300659/*[clinic end generated code: output=53008ea967da3fff input=4f3152a304e21d51]*/
Victor Stinner3a50e702011-10-18 21:21:00 +0200660{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300661 Py_ssize_t consumed = data->len;
Serhiy Storchaka1aa5e1d2015-05-12 14:00:22 +0300662 PyObject *decoded = PyUnicode_DecodeCodePageStateful(codepage,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300663 data->buf, data->len,
664 errors,
665 final ? NULL : &consumed);
Victor Stinner3a50e702011-10-18 21:21:00 +0200666 return codec_tuple(decoded, consumed);
667}
668
Steve Dowercc16be82016-09-08 10:35:16 -0700669#endif /* MS_WINDOWS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000670
Guido van Rossume2d67f92000-03-10 23:09:23 +0000671/* --- Encoder ------------------------------------------------------------ */
672
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300673/*[clinic input]
674_codecs.readbuffer_encode
675 data: Py_buffer(accept={str, buffer})
676 errors: str(accept={str, NoneType}) = NULL
677 /
678[clinic start generated code]*/
679
Guido van Rossume2d67f92000-03-10 23:09:23 +0000680static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300681_codecs_readbuffer_encode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300682 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300683/*[clinic end generated code: output=c645ea7cdb3d6e86 input=b7c322b89d4ab923]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000684{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300685 PyObject *result = PyBytes_FromStringAndSize(data->buf, data->len);
686 return codec_tuple(result, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000687}
688
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300689/*[clinic input]
690_codecs.unicode_internal_encode
691 obj: object
692 errors: str(accept={str, NoneType}) = NULL
693 /
694[clinic start generated code]*/
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000695
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300696static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300697_codecs_unicode_internal_encode_impl(PyObject *module, PyObject *obj,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300698 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300699/*[clinic end generated code: output=a72507dde4ea558f input=8628f0280cf5ba61]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300700{
Ezio Melottiadc417c2011-11-17 12:23:34 +0200701 if (PyErr_WarnEx(PyExc_DeprecationWarning,
702 "unicode_internal codec has been deprecated",
703 1))
704 return NULL;
705
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000706 if (PyUnicode_Check(obj)) {
Victor Stinner9f4b1e92011-11-10 20:56:30 +0100707 Py_UNICODE *u;
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200708 Py_ssize_t len, size;
Victor Stinner9f4b1e92011-11-10 20:56:30 +0100709
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100710 if (PyUnicode_READY(obj) < 0)
711 return NULL;
Victor Stinner9f4b1e92011-11-10 20:56:30 +0100712
Victor Stinner9f4b1e92011-11-10 20:56:30 +0100713 u = PyUnicode_AsUnicodeAndSize(obj, &len);
714 if (u == NULL)
715 return NULL;
Victor Stinner049e5092014-08-17 22:20:00 +0200716 if ((size_t)len > (size_t)PY_SSIZE_T_MAX / sizeof(Py_UNICODE))
Victor Stinner9f4b1e92011-11-10 20:56:30 +0100717 return PyErr_NoMemory();
718 size = len * sizeof(Py_UNICODE);
719 return codec_tuple(PyBytes_FromStringAndSize((const char*)u, size),
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100720 PyUnicode_GET_LENGTH(obj));
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000721 }
722 else {
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200723 Py_buffer view;
724 PyObject *result;
725 if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 return NULL;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300727 result = codec_tuple(PyBytes_FromStringAndSize(view.buf, view.len),
728 view.len);
Serhiy Storchaka4fdb6842015-02-03 01:21:08 +0200729 PyBuffer_Release(&view);
730 return result;
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000731 }
732}
733
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300734/*[clinic input]
735_codecs.utf_7_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300736 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300737 errors: str(accept={str, NoneType}) = NULL
738 /
739[clinic start generated code]*/
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000740
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300741static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300742_codecs_utf_7_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300743 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300744/*[clinic end generated code: output=0feda21ffc921bc8 input=d1a47579e79cbe15]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300745{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300746 return codec_tuple(_PyUnicode_EncodeUTF7(str, 0, 0, errors),
747 PyUnicode_GET_LENGTH(str));
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000748}
749
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300750/*[clinic input]
751_codecs.utf_8_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300752 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300753 errors: str(accept={str, NoneType}) = NULL
754 /
755[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000756
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300757static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300758_codecs_utf_8_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300759 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300760/*[clinic end generated code: output=02bf47332b9c796c input=42e3ba73c4392eef]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300761{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300762 return codec_tuple(_PyUnicode_AsUTF8String(str, errors),
763 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000764}
765
766/* This version provides access to the byteorder parameter of the
767 builtin UTF-16 codecs as optional third argument. It defaults to 0
768 which means: use the native byte order and prepend the data with a
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000769 BOM mark.
Guido van Rossume2d67f92000-03-10 23:09:23 +0000770
771*/
772
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300773/*[clinic input]
774_codecs.utf_16_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300775 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300776 errors: str(accept={str, NoneType}) = NULL
777 byteorder: int = 0
778 /
779[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000780
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300781static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300782_codecs_utf_16_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300783 const char *errors, int byteorder)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300784/*[clinic end generated code: output=c654e13efa2e64e4 input=ff46416b04edb944]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300785{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300786 return codec_tuple(_PyUnicode_EncodeUTF16(str, errors, byteorder),
787 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000788}
789
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300790/*[clinic input]
791_codecs.utf_16_le_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300792 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300793 errors: str(accept={str, NoneType}) = NULL
794 /
795[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000796
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300797static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300798_codecs_utf_16_le_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300799 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300800/*[clinic end generated code: output=431b01e55f2d4995 input=cb385455ea8f2fe0]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300801{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300802 return codec_tuple(_PyUnicode_EncodeUTF16(str, errors, -1),
803 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000804}
805
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300806/*[clinic input]
807_codecs.utf_16_be_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300808 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300809 errors: str(accept={str, NoneType}) = NULL
810 /
811[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000812
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300813static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300814_codecs_utf_16_be_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300815 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300816/*[clinic end generated code: output=96886a6fd54dcae3 input=9119997066bdaefd]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300817{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300818 return codec_tuple(_PyUnicode_EncodeUTF16(str, errors, +1),
819 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000820}
821
Walter Dörwald41980ca2007-08-16 21:55:45 +0000822/* This version provides access to the byteorder parameter of the
823 builtin UTF-32 codecs as optional third argument. It defaults to 0
824 which means: use the native byte order and prepend the data with a
825 BOM mark.
826
827*/
828
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300829/*[clinic input]
830_codecs.utf_32_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300831 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300832 errors: str(accept={str, NoneType}) = NULL
833 byteorder: int = 0
834 /
835[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000836
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300837static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300838_codecs_utf_32_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300839 const char *errors, int byteorder)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300840/*[clinic end generated code: output=5c760da0c09a8b83 input=c5e77da82fbe5c2a]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300841{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300842 return codec_tuple(_PyUnicode_EncodeUTF32(str, errors, byteorder),
843 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000844}
845
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300846/*[clinic input]
847_codecs.utf_32_le_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300848 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300849 errors: str(accept={str, NoneType}) = NULL
850 /
851[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000852
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300853static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300854_codecs_utf_32_le_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300855 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300856/*[clinic end generated code: output=b65cd176de8e36d6 input=9993b25fe0877848]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300857{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300858 return codec_tuple(_PyUnicode_EncodeUTF32(str, errors, -1),
859 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000860}
861
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300862/*[clinic input]
863_codecs.utf_32_be_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300864 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300865 errors: str(accept={str, NoneType}) = NULL
866 /
867[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000868
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300869static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300870_codecs_utf_32_be_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300871 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300872/*[clinic end generated code: output=1d9e71a9358709e9 input=d3e0ccaa02920431]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300873{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300874 return codec_tuple(_PyUnicode_EncodeUTF32(str, errors, +1),
875 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000876}
877
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300878/*[clinic input]
879_codecs.unicode_escape_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300880 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300881 errors: str(accept={str, NoneType}) = NULL
882 /
883[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000884
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300885static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300886_codecs_unicode_escape_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300887 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300888/*[clinic end generated code: output=66271b30bc4f7a3c input=65d9eefca65b455a]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300889{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300890 return codec_tuple(PyUnicode_AsUnicodeEscapeString(str),
891 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000892}
893
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300894/*[clinic input]
895_codecs.raw_unicode_escape_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300896 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300897 errors: str(accept={str, NoneType}) = NULL
898 /
899[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000900
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300901static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300902_codecs_raw_unicode_escape_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300903 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300904/*[clinic end generated code: output=a66a806ed01c830a input=5aa33e4a133391ab]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300905{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300906 return codec_tuple(PyUnicode_AsRawUnicodeEscapeString(str),
907 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000908}
909
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300910/*[clinic input]
911_codecs.latin_1_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300912 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300913 errors: str(accept={str, NoneType}) = NULL
914 /
915[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000916
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300917static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300918_codecs_latin_1_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300919 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300920/*[clinic end generated code: output=2c28c83a27884e08 input=30b11c9e49a65150]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300921{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300922 return codec_tuple(_PyUnicode_AsLatin1String(str, errors),
923 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000924}
925
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300926/*[clinic input]
927_codecs.ascii_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300928 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300929 errors: str(accept={str, NoneType}) = NULL
930 /
931[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000932
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300933static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300934_codecs_ascii_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300935 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300936/*[clinic end generated code: output=b5e035182d33befc input=843a1d268e6dfa8e]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300937{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300938 return codec_tuple(_PyUnicode_AsASCIIString(str, errors),
939 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000940}
941
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300942/*[clinic input]
943_codecs.charmap_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300944 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300945 errors: str(accept={str, NoneType}) = NULL
946 mapping: object = NULL
947 /
948[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000949
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300950static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300951_codecs_charmap_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300952 const char *errors, PyObject *mapping)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300953/*[clinic end generated code: output=047476f48495a9e9 input=0752cde07a6d6d00]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300954{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000955 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000957
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300958 return codec_tuple(_PyUnicode_EncodeCharmap(str, mapping, errors),
959 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000960}
961
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300962/*[clinic input]
963_codecs.charmap_build
964 map: unicode
965 /
966[clinic start generated code]*/
967
968static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300969_codecs_charmap_build_impl(PyObject *module, PyObject *map)
970/*[clinic end generated code: output=bb073c27031db9ac input=d91a91d1717dbc6d]*/
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000971{
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000972 return PyUnicode_BuildEncodingMap(map);
973}
974
Steve Dowercc16be82016-09-08 10:35:16 -0700975#ifdef MS_WINDOWS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000976
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300977/*[clinic input]
978_codecs.mbcs_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300979 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300980 errors: str(accept={str, NoneType}) = NULL
981 /
982[clinic start generated code]*/
Guido van Rossum24bdb042000-03-28 20:29:59 +0000983
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300984static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300985_codecs_mbcs_encode_impl(PyObject *module, PyObject *str, const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300986/*[clinic end generated code: output=76e2e170c966c080 input=de471e0815947553]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300987{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300988 return codec_tuple(PyUnicode_EncodeCodePage(CP_ACP, str, errors),
989 PyUnicode_GET_LENGTH(str));
Guido van Rossum24bdb042000-03-28 20:29:59 +0000990}
991
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300992/*[clinic input]
Steve Dowerf5aba582016-09-06 19:42:27 -0700993_codecs.oem_encode
994 str: unicode
995 errors: str(accept={str, NoneType}) = NULL
996 /
997[clinic start generated code]*/
998
999static PyObject *
1000_codecs_oem_encode_impl(PyObject *module, PyObject *str, const char *errors)
1001/*[clinic end generated code: output=65d5982c737de649 input=3fc5f0028aad3cda]*/
1002{
1003 return codec_tuple(PyUnicode_EncodeCodePage(CP_OEMCP, str, errors),
1004 PyUnicode_GET_LENGTH(str));
1005}
1006
1007/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001008_codecs.code_page_encode
1009 code_page: int
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001010 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001011 errors: str(accept={str, NoneType}) = NULL
1012 /
1013[clinic start generated code]*/
Victor Stinner3a50e702011-10-18 21:21:00 +02001014
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001015static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001016_codecs_code_page_encode_impl(PyObject *module, int code_page, PyObject *str,
1017 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +03001018/*[clinic end generated code: output=45673f6085657a9e input=786421ae617d680b]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001019{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001020 return codec_tuple(PyUnicode_EncodeCodePage(code_page, str, errors),
1021 PyUnicode_GET_LENGTH(str));
Victor Stinner3a50e702011-10-18 21:21:00 +02001022}
1023
Steve Dowercc16be82016-09-08 10:35:16 -07001024#endif /* MS_WINDOWS */
Guido van Rossum24bdb042000-03-28 20:29:59 +00001025
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001026/* --- Error handler registry --------------------------------------------- */
1027
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001028/*[clinic input]
1029_codecs.register_error
1030 errors: str
1031 handler: object
1032 /
Walter Dörwald0ae29812002-10-31 13:36:29 +00001033
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001034Register the specified error handler under the name errors.
1035
1036handler must be a callable object, that will be called with an exception
1037instance containing information about the location of the encoding/decoding
1038error and must return a (replacement, new position) tuple.
1039[clinic start generated code]*/
1040
1041static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001042_codecs_register_error_impl(PyObject *module, const char *errors,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001043 PyObject *handler)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001044/*[clinic end generated code: output=fa2f7d1879b3067d input=5e6709203c2e33fe]*/
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001045{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001046 if (PyCodec_RegisterError(errors, handler))
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001047 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001048 Py_RETURN_NONE;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001049}
1050
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001051/*[clinic input]
1052_codecs.lookup_error
1053 name: str
1054 /
Walter Dörwald0ae29812002-10-31 13:36:29 +00001055
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001056lookup_error(errors) -> handler
1057
1058Return the error handler for the specified error handling name or raise a
1059LookupError, if no handler exists under this name.
1060[clinic start generated code]*/
1061
1062static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001063_codecs_lookup_error_impl(PyObject *module, const char *name)
1064/*[clinic end generated code: output=087f05dc0c9a98cc input=4775dd65e6235aba]*/
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001065{
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001066 return PyCodec_LookupError(name);
1067}
1068
Guido van Rossume2d67f92000-03-10 23:09:23 +00001069/* --- Module API --------------------------------------------------------- */
1070
1071static PyMethodDef _codecs_functions[] = {
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001072 _CODECS_REGISTER_METHODDEF
1073 _CODECS_LOOKUP_METHODDEF
1074 _CODECS_ENCODE_METHODDEF
1075 _CODECS_DECODE_METHODDEF
1076 _CODECS_ESCAPE_ENCODE_METHODDEF
1077 _CODECS_ESCAPE_DECODE_METHODDEF
1078 _CODECS_UTF_8_ENCODE_METHODDEF
1079 _CODECS_UTF_8_DECODE_METHODDEF
1080 _CODECS_UTF_7_ENCODE_METHODDEF
1081 _CODECS_UTF_7_DECODE_METHODDEF
1082 _CODECS_UTF_16_ENCODE_METHODDEF
1083 _CODECS_UTF_16_LE_ENCODE_METHODDEF
1084 _CODECS_UTF_16_BE_ENCODE_METHODDEF
1085 _CODECS_UTF_16_DECODE_METHODDEF
1086 _CODECS_UTF_16_LE_DECODE_METHODDEF
1087 _CODECS_UTF_16_BE_DECODE_METHODDEF
1088 _CODECS_UTF_16_EX_DECODE_METHODDEF
1089 _CODECS_UTF_32_ENCODE_METHODDEF
1090 _CODECS_UTF_32_LE_ENCODE_METHODDEF
1091 _CODECS_UTF_32_BE_ENCODE_METHODDEF
1092 _CODECS_UTF_32_DECODE_METHODDEF
1093 _CODECS_UTF_32_LE_DECODE_METHODDEF
1094 _CODECS_UTF_32_BE_DECODE_METHODDEF
1095 _CODECS_UTF_32_EX_DECODE_METHODDEF
1096 _CODECS_UNICODE_ESCAPE_ENCODE_METHODDEF
1097 _CODECS_UNICODE_ESCAPE_DECODE_METHODDEF
1098 _CODECS_UNICODE_INTERNAL_ENCODE_METHODDEF
1099 _CODECS_UNICODE_INTERNAL_DECODE_METHODDEF
1100 _CODECS_RAW_UNICODE_ESCAPE_ENCODE_METHODDEF
1101 _CODECS_RAW_UNICODE_ESCAPE_DECODE_METHODDEF
1102 _CODECS_LATIN_1_ENCODE_METHODDEF
1103 _CODECS_LATIN_1_DECODE_METHODDEF
1104 _CODECS_ASCII_ENCODE_METHODDEF
1105 _CODECS_ASCII_DECODE_METHODDEF
1106 _CODECS_CHARMAP_ENCODE_METHODDEF
1107 _CODECS_CHARMAP_DECODE_METHODDEF
1108 _CODECS_CHARMAP_BUILD_METHODDEF
1109 _CODECS_READBUFFER_ENCODE_METHODDEF
1110 _CODECS_MBCS_ENCODE_METHODDEF
1111 _CODECS_MBCS_DECODE_METHODDEF
Steve Dowerf5aba582016-09-06 19:42:27 -07001112 _CODECS_OEM_ENCODE_METHODDEF
1113 _CODECS_OEM_DECODE_METHODDEF
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001114 _CODECS_CODE_PAGE_ENCODE_METHODDEF
1115 _CODECS_CODE_PAGE_DECODE_METHODDEF
1116 _CODECS_REGISTER_ERROR_METHODDEF
1117 _CODECS_LOOKUP_ERROR_METHODDEF
Nick Coghlan8fad1672014-09-15 23:50:44 +12001118 _CODECS__FORGET_CODEC_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 {NULL, NULL} /* sentinel */
Guido van Rossume2d67f92000-03-10 23:09:23 +00001120};
1121
Martin v. Löwis1a214512008-06-11 05:26:20 +00001122static struct PyModuleDef codecsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 PyModuleDef_HEAD_INIT,
1124 "_codecs",
1125 NULL,
1126 -1,
1127 _codecs_functions,
1128 NULL,
1129 NULL,
1130 NULL,
1131 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001132};
1133
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001134PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001135PyInit__codecs(void)
Guido van Rossume2d67f92000-03-10 23:09:23 +00001136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 return PyModule_Create(&codecsmodule);
Guido van Rossume2d67f92000-03-10 23:09:23 +00001138}