blob: 90b3e37d16414c547e67662fdfa91f81cee4b536 [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]
72_codecs.lookup
73 encoding: str
74 /
Walter Dörwald0ae29812002-10-31 13:36:29 +000075
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030076Looks up a codec tuple in the Python codec registry and returns a CodecInfo object.
77[clinic start generated code]*/
78
79static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030080_codecs_lookup_impl(PyObject *module, const char *encoding)
81/*[clinic end generated code: output=9f0afa572080c36d input=3c572c0db3febe9c]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +000082{
Guido van Rossume2d67f92000-03-10 23:09:23 +000083 return _PyCodec_Lookup(encoding);
Guido van Rossume2d67f92000-03-10 23:09:23 +000084}
85
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030086/*[clinic input]
87_codecs.encode
88 obj: object
Serhiy Storchakac97a9622015-08-09 12:23:08 +030089 encoding: str(c_default="NULL") = "utf-8"
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030090 errors: str(c_default="NULL") = "strict"
91
92Encodes obj using the codec registered for encoding.
93
Serhiy Storchakac97a9622015-08-09 12:23:08 +030094The default encoding is 'utf-8'. errors may be given to set a
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +030095different error handling scheme. Default is 'strict' meaning that encoding
96errors raise a ValueError. Other possible values are 'ignore', 'replace'
97and 'backslashreplace' as well as any other name registered with
98codecs.register_error that can handle ValueErrors.
99[clinic start generated code]*/
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000100
101static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300102_codecs_encode_impl(PyObject *module, PyObject *obj, const char *encoding,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300103 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300104/*[clinic end generated code: output=385148eb9a067c86 input=cd5b685040ff61f0]*/
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000105{
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000106 if (encoding == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 encoding = PyUnicode_GetDefaultEncoding();
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000108
109 /* Encode via the codec registry */
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300110 return PyCodec_Encode(obj, encoding, errors);
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000111}
112
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300113/*[clinic input]
114_codecs.decode
115 obj: object
Serhiy Storchakac97a9622015-08-09 12:23:08 +0300116 encoding: str(c_default="NULL") = "utf-8"
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300117 errors: str(c_default="NULL") = "strict"
118
119Decodes obj using the codec registered for encoding.
120
Serhiy Storchakac97a9622015-08-09 12:23:08 +0300121Default encoding is 'utf-8'. errors may be given to set a
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300122different error handling scheme. Default is 'strict' meaning that encoding
123errors raise a ValueError. Other possible values are 'ignore', 'replace'
124and 'backslashreplace' as well as any other name registered with
125codecs.register_error that can handle ValueErrors.
126[clinic start generated code]*/
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000127
128static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300129_codecs_decode_impl(PyObject *module, PyObject *obj, const char *encoding,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300130 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300131/*[clinic end generated code: output=679882417dc3a0bd input=7702c0cc2fa1add6]*/
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000132{
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000133 if (encoding == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 encoding = PyUnicode_GetDefaultEncoding();
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000135
136 /* Decode via the codec registry */
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300137 return PyCodec_Decode(obj, encoding, errors);
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000138}
139
Guido van Rossume2d67f92000-03-10 23:09:23 +0000140/* --- Helpers ------------------------------------------------------------ */
141
Nick Coghlan8fad1672014-09-15 23:50:44 +1200142/*[clinic input]
143_codecs._forget_codec
144
145 encoding: str
146 /
147
148Purge the named codec from the internal codec lookup cache
149[clinic start generated code]*/
150
Nick Coghlan8fad1672014-09-15 23:50:44 +1200151static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300152_codecs__forget_codec_impl(PyObject *module, const char *encoding)
153/*[clinic end generated code: output=0bde9f0a5b084aa2 input=18d5d92d0e386c38]*/
Nick Coghlan8fad1672014-09-15 23:50:44 +1200154{
155 if (_PyCodec_Forget(encoding) < 0) {
156 return NULL;
157 };
158 Py_RETURN_NONE;
159}
160
Guido van Rossume2d67f92000-03-10 23:09:23 +0000161static
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300162PyObject *codec_tuple(PyObject *decoded,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 Py_ssize_t len)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000164{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300165 if (decoded == NULL)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000166 return NULL;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300167 return Py_BuildValue("Nn", decoded, len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000168}
169
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000170/* --- String codecs ------------------------------------------------------ */
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300171/*[clinic input]
172_codecs.escape_decode
173 data: Py_buffer(accept={str, buffer})
174 errors: str(accept={str, NoneType}) = NULL
175 /
176[clinic start generated code]*/
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000177
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300178static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300179_codecs_escape_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300180 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300181/*[clinic end generated code: output=505200ba8056979a input=0018edfd99db714d]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300182{
183 PyObject *decoded = PyBytes_DecodeEscape(data->buf, data->len,
184 errors, 0, NULL);
185 return codec_tuple(decoded, data->len);
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000186}
187
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300188/*[clinic input]
189_codecs.escape_encode
190 data: object(subclass_of='&PyBytes_Type')
191 errors: str(accept={str, NoneType}) = NULL
192 /
193[clinic start generated code]*/
194
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000195static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300196_codecs_escape_encode_impl(PyObject *module, PyObject *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300197 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300198/*[clinic end generated code: output=4af1d477834bab34 input=da9ded00992f32f2]*/
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000199{
Antoine Pitroud1188562010-06-09 16:38:55 +0000200 Py_ssize_t size;
201 Py_ssize_t newsize;
Antoine Pitroud1188562010-06-09 16:38:55 +0000202 PyObject *v;
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000203
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300204 size = PyBytes_GET_SIZE(data);
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100205 if (size > PY_SSIZE_T_MAX / 4) {
Antoine Pitroud1188562010-06-09 16:38:55 +0000206 PyErr_SetString(PyExc_OverflowError,
207 "string is too large to encode");
208 return NULL;
209 }
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100210 newsize = 4*size;
Antoine Pitroud1188562010-06-09 16:38:55 +0000211 v = PyBytes_FromStringAndSize(NULL, newsize);
212
213 if (v == NULL) {
214 return NULL;
215 }
216 else {
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200217 Py_ssize_t i;
218 char c;
219 char *p = PyBytes_AS_STRING(v);
Antoine Pitroud1188562010-06-09 16:38:55 +0000220
221 for (i = 0; i < size; i++) {
222 /* There's at least enough room for a hex escape */
223 assert(newsize - (p - PyBytes_AS_STRING(v)) >= 4);
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300224 c = PyBytes_AS_STRING(data)[i];
Antoine Pitroud1188562010-06-09 16:38:55 +0000225 if (c == '\'' || c == '\\')
226 *p++ = '\\', *p++ = c;
227 else if (c == '\t')
228 *p++ = '\\', *p++ = 't';
229 else if (c == '\n')
230 *p++ = '\\', *p++ = 'n';
231 else if (c == '\r')
232 *p++ = '\\', *p++ = 'r';
233 else if (c < ' ' || c >= 0x7f) {
234 *p++ = '\\';
235 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +0200236 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
237 *p++ = Py_hexdigits[c & 0xf];
Antoine Pitroud1188562010-06-09 16:38:55 +0000238 }
239 else
240 *p++ = c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 }
Antoine Pitroud1188562010-06-09 16:38:55 +0000242 *p = '\0';
243 if (_PyBytes_Resize(&v, (p - PyBytes_AS_STRING(v)))) {
244 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 }
Antoine Pitroud1188562010-06-09 16:38:55 +0000246 }
Walter Dörwald1ab83302007-05-18 17:15:44 +0000247
Antoine Pitroud1188562010-06-09 16:38:55 +0000248 return codec_tuple(v, size);
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000249}
250
Guido van Rossume2d67f92000-03-10 23:09:23 +0000251/* --- Decoder ------------------------------------------------------------ */
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300252/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300253_codecs.utf_7_decode
254 data: Py_buffer
255 errors: str(accept={str, NoneType}) = NULL
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200256 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300257 /
258[clinic start generated code]*/
259
Guido van Rossume2d67f92000-03-10 23:09:23 +0000260static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300261_codecs_utf_7_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300262 const char *errors, int final)
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200263/*[clinic end generated code: output=0cd3a944a32a4089 input=2d94a5a1f170c8ae]*/
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000264{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300265 Py_ssize_t consumed = data->len;
266 PyObject *decoded = PyUnicode_DecodeUTF7Stateful(data->buf, data->len,
267 errors,
268 final ? NULL : &consumed);
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000269 return codec_tuple(decoded, consumed);
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000270}
271
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300272/*[clinic input]
273_codecs.utf_8_decode
274 data: Py_buffer
275 errors: str(accept={str, NoneType}) = NULL
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200276 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300277 /
278[clinic start generated code]*/
279
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000280static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300281_codecs_utf_8_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300282 const char *errors, int final)
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200283/*[clinic end generated code: output=10f74dec8d9bb8bf input=1ea6c21492e8bcbe]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000284{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300285 Py_ssize_t consumed = data->len;
286 PyObject *decoded = PyUnicode_DecodeUTF8Stateful(data->buf, data->len,
287 errors,
288 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000289 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000290}
291
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300292/*[clinic input]
293_codecs.utf_16_decode
294 data: Py_buffer
295 errors: str(accept={str, NoneType}) = NULL
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200296 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300297 /
298[clinic start generated code]*/
299
Guido van Rossume2d67f92000-03-10 23:09:23 +0000300static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300301_codecs_utf_16_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300302 const char *errors, int final)
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200303/*[clinic end generated code: output=783b442abcbcc2d0 input=2ba128c28ea0bb40]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000304{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000305 int byteorder = 0;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300306 /* This is overwritten unless final is true. */
307 Py_ssize_t consumed = data->len;
308 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
309 errors, &byteorder,
310 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000311 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000312}
313
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300314/*[clinic input]
315_codecs.utf_16_le_decode
316 data: Py_buffer
317 errors: str(accept={str, NoneType}) = NULL
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200318 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300319 /
320[clinic start generated code]*/
321
Guido van Rossume2d67f92000-03-10 23:09:23 +0000322static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300323_codecs_utf_16_le_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300324 const char *errors, int final)
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200325/*[clinic end generated code: output=899b9e6364379dcd input=43aeb8b0461cace5]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000326{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000327 int byteorder = -1;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300328 /* This is overwritten unless final is true. */
329 Py_ssize_t consumed = data->len;
330 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
331 errors, &byteorder,
332 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000333 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000334}
335
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300336/*[clinic input]
337_codecs.utf_16_be_decode
338 data: Py_buffer
339 errors: str(accept={str, NoneType}) = NULL
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200340 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300341 /
342[clinic start generated code]*/
343
Guido van Rossume2d67f92000-03-10 23:09:23 +0000344static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300345_codecs_utf_16_be_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300346 const char *errors, int final)
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200347/*[clinic end generated code: output=49f6465ea07669c8 input=339e554c804f34b2]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000348{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000349 int byteorder = 1;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300350 /* This is overwritten unless final is true. */
351 Py_ssize_t consumed = data->len;
352 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
353 errors, &byteorder,
354 final ? NULL : &consumed);
Walter Dörwald69652032004-09-07 20:24:22 +0000355 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000356}
357
358/* This non-standard version also provides access to the byteorder
359 parameter of the builtin UTF-16 codec.
360
361 It returns a tuple (unicode, bytesread, byteorder) with byteorder
362 being the value in effect at the end of data.
363
364*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300365/*[clinic input]
366_codecs.utf_16_ex_decode
367 data: Py_buffer
368 errors: str(accept={str, NoneType}) = NULL
369 byteorder: int = 0
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200370 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300371 /
372[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000373
374static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300375_codecs_utf_16_ex_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300376 const char *errors, int byteorder, int final)
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200377/*[clinic end generated code: output=0f385f251ecc1988 input=3201aeddb9636889]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000378{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300379 /* This is overwritten unless final is true. */
380 Py_ssize_t consumed = data->len;
Walter Dörwald69652032004-09-07 20:24:22 +0000381
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300382 PyObject *decoded = PyUnicode_DecodeUTF16Stateful(data->buf, data->len,
383 errors, &byteorder,
384 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000385 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 return NULL;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300387 return Py_BuildValue("Nni", decoded, consumed, byteorder);
388}
389
390/*[clinic input]
391_codecs.utf_32_decode
392 data: Py_buffer
393 errors: str(accept={str, NoneType}) = NULL
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200394 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300395 /
396[clinic start generated code]*/
397
398static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300399_codecs_utf_32_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300400 const char *errors, int final)
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200401/*[clinic end generated code: output=2fc961807f7b145f input=155a5c673a4e2514]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300402{
403 int byteorder = 0;
404 /* This is overwritten unless final is true. */
405 Py_ssize_t consumed = data->len;
406 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
407 errors, &byteorder,
408 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000409 return codec_tuple(decoded, consumed);
410}
411
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300412/*[clinic input]
413_codecs.utf_32_le_decode
414 data: Py_buffer
415 errors: str(accept={str, NoneType}) = NULL
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200416 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300417 /
418[clinic start generated code]*/
419
Walter Dörwald41980ca2007-08-16 21:55:45 +0000420static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300421_codecs_utf_32_le_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300422 const char *errors, int final)
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200423/*[clinic end generated code: output=ec8f46b67a94f3e6 input=7baf061069e92d3b]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000424{
Walter Dörwald41980ca2007-08-16 21:55:45 +0000425 int byteorder = -1;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300426 /* This is overwritten unless final is true. */
427 Py_ssize_t consumed = data->len;
428 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
429 errors, &byteorder,
430 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000431 return codec_tuple(decoded, consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000432}
433
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300434/*[clinic input]
435_codecs.utf_32_be_decode
436 data: Py_buffer
437 errors: str(accept={str, NoneType}) = NULL
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200438 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300439 /
440[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000441
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300442static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300443_codecs_utf_32_be_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300444 const char *errors, int final)
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200445/*[clinic end generated code: output=ff82bae862c92c4e input=b182026300dae595]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300446{
447 int byteorder = 1;
448 /* This is overwritten unless final is true. */
449 Py_ssize_t consumed = data->len;
450 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
451 errors, &byteorder,
452 final ? NULL : &consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000453 return codec_tuple(decoded, consumed);
454}
455
456/* This non-standard version also provides access to the byteorder
457 parameter of the builtin UTF-32 codec.
458
459 It returns a tuple (unicode, bytesread, byteorder) with byteorder
460 being the value in effect at the end of data.
461
462*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300463/*[clinic input]
464_codecs.utf_32_ex_decode
465 data: Py_buffer
466 errors: str(accept={str, NoneType}) = NULL
467 byteorder: int = 0
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200468 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300469 /
470[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000471
472static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300473_codecs_utf_32_ex_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300474 const char *errors, int byteorder, int final)
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200475/*[clinic end generated code: output=6bfb177dceaf4848 input=7b9c2cb819fb237a]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000476{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300477 Py_ssize_t consumed = data->len;
478 PyObject *decoded = PyUnicode_DecodeUTF32Stateful(data->buf, data->len,
479 errors, &byteorder,
480 final ? NULL : &consumed);
481 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 return NULL;
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300483 return Py_BuildValue("Nni", decoded, consumed, byteorder);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000484}
485
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300486/*[clinic input]
487_codecs.unicode_escape_decode
488 data: Py_buffer(accept={str, buffer})
489 errors: str(accept={str, NoneType}) = NULL
490 /
491[clinic start generated code]*/
492
Walter Dörwald41980ca2007-08-16 21:55:45 +0000493static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300494_codecs_unicode_escape_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300495 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300496/*[clinic end generated code: output=3ca3c917176b82ab input=49fd27d06813a7f5]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000497{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300498 PyObject *decoded = PyUnicode_DecodeUnicodeEscape(data->buf, data->len,
499 errors);
500 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000501}
502
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300503/*[clinic input]
504_codecs.raw_unicode_escape_decode
505 data: Py_buffer(accept={str, buffer})
506 errors: str(accept={str, NoneType}) = NULL
507 /
508[clinic start generated code]*/
509
Guido van Rossume2d67f92000-03-10 23:09:23 +0000510static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300511_codecs_raw_unicode_escape_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300512 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300513/*[clinic end generated code: output=c98eeb56028070a6 input=770903a211434ebc]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000514{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300515 PyObject *decoded = PyUnicode_DecodeRawUnicodeEscape(data->buf, data->len,
516 errors);
517 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000518}
519
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300520/*[clinic input]
521_codecs.latin_1_decode
522 data: Py_buffer
523 errors: str(accept={str, NoneType}) = NULL
524 /
525[clinic start generated code]*/
526
Guido van Rossume2d67f92000-03-10 23:09:23 +0000527static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300528_codecs_latin_1_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300529 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300530/*[clinic end generated code: output=07f3dfa3f72c7d8f input=5cad0f1759c618ec]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000531{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300532 PyObject *decoded = PyUnicode_DecodeLatin1(data->buf, data->len, 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.ascii_decode
538 data: Py_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_ascii_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=2627d72058d42429 input=ad1106f64037bd16]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000547{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300548 PyObject *decoded = PyUnicode_DecodeASCII(data->buf, data->len, errors);
549 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000550}
551
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300552/*[clinic input]
553_codecs.charmap_decode
554 data: Py_buffer
555 errors: str(accept={str, NoneType}) = NULL
556 mapping: object = NULL
557 /
558[clinic start generated code]*/
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000559
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300560static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300561_codecs_charmap_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300562 const char *errors, PyObject *mapping)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300563/*[clinic end generated code: output=2c335b09778cf895 input=19712ca35c5a80e2]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300564{
565 PyObject *decoded;
566
Guido van Rossume2d67f92000-03-10 23:09:23 +0000567 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000569
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300570 decoded = PyUnicode_DecodeCharmap(data->buf, data->len, mapping, errors);
571 return codec_tuple(decoded, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000572}
573
Steve Dowercc16be82016-09-08 10:35:16 -0700574#ifdef MS_WINDOWS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000575
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300576/*[clinic input]
577_codecs.mbcs_decode
578 data: Py_buffer
579 errors: str(accept={str, NoneType}) = NULL
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200580 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300581 /
582[clinic start generated code]*/
583
Guido van Rossum24bdb042000-03-28 20:29:59 +0000584static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300585_codecs_mbcs_decode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300586 const char *errors, int final)
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200587/*[clinic end generated code: output=39b65b8598938c4b input=b5f2fe568f311297]*/
Guido van Rossum24bdb042000-03-28 20:29:59 +0000588{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300589 Py_ssize_t consumed = data->len;
590 PyObject *decoded = PyUnicode_DecodeMBCSStateful(data->buf, data->len,
591 errors, final ? NULL : &consumed);
Martin v. Löwis423be952008-08-13 15:53:07 +0000592 return codec_tuple(decoded, consumed);
Guido van Rossum24bdb042000-03-28 20:29:59 +0000593}
594
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300595/*[clinic input]
Steve Dowerf5aba582016-09-06 19:42:27 -0700596_codecs.oem_decode
597 data: Py_buffer
598 errors: str(accept={str, NoneType}) = NULL
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200599 final: bool(accept={int}) = False
Steve Dowerf5aba582016-09-06 19:42:27 -0700600 /
601[clinic start generated code]*/
602
603static PyObject *
604_codecs_oem_decode_impl(PyObject *module, Py_buffer *data,
605 const char *errors, int final)
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200606/*[clinic end generated code: output=da1617612f3fcad8 input=278709bcfd374a9c]*/
Steve Dowerf5aba582016-09-06 19:42:27 -0700607{
608 Py_ssize_t consumed = data->len;
609 PyObject *decoded = PyUnicode_DecodeCodePageStateful(CP_OEMCP,
610 data->buf, data->len, errors, final ? NULL : &consumed);
611 return codec_tuple(decoded, consumed);
612}
613
614/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300615_codecs.code_page_decode
616 codepage: int
617 data: Py_buffer
618 errors: str(accept={str, NoneType}) = NULL
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200619 final: bool(accept={int}) = False
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300620 /
621[clinic start generated code]*/
622
Victor Stinner3a50e702011-10-18 21:21:00 +0200623static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300624_codecs_code_page_decode_impl(PyObject *module, int codepage,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300625 Py_buffer *data, const char *errors, int final)
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200626/*[clinic end generated code: output=53008ea967da3fff input=51f6169021c68dd5]*/
Victor Stinner3a50e702011-10-18 21:21:00 +0200627{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300628 Py_ssize_t consumed = data->len;
Serhiy Storchaka1aa5e1d2015-05-12 14:00:22 +0300629 PyObject *decoded = PyUnicode_DecodeCodePageStateful(codepage,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300630 data->buf, data->len,
631 errors,
632 final ? NULL : &consumed);
Victor Stinner3a50e702011-10-18 21:21:00 +0200633 return codec_tuple(decoded, consumed);
634}
635
Steve Dowercc16be82016-09-08 10:35:16 -0700636#endif /* MS_WINDOWS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000637
Guido van Rossume2d67f92000-03-10 23:09:23 +0000638/* --- Encoder ------------------------------------------------------------ */
639
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300640/*[clinic input]
641_codecs.readbuffer_encode
642 data: Py_buffer(accept={str, buffer})
643 errors: str(accept={str, NoneType}) = NULL
644 /
645[clinic start generated code]*/
646
Guido van Rossume2d67f92000-03-10 23:09:23 +0000647static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300648_codecs_readbuffer_encode_impl(PyObject *module, Py_buffer *data,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300649 const char *errors)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300650/*[clinic end generated code: output=c645ea7cdb3d6e86 input=b7c322b89d4ab923]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000651{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300652 PyObject *result = PyBytes_FromStringAndSize(data->buf, data->len);
653 return codec_tuple(result, data->len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000654}
655
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300656/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300657_codecs.utf_7_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300658 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300659 errors: str(accept={str, NoneType}) = NULL
660 /
661[clinic start generated code]*/
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000662
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300663static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300664_codecs_utf_7_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300665 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300666/*[clinic end generated code: output=0feda21ffc921bc8 input=d1a47579e79cbe15]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300667{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300668 return codec_tuple(_PyUnicode_EncodeUTF7(str, 0, 0, errors),
669 PyUnicode_GET_LENGTH(str));
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000670}
671
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300672/*[clinic input]
673_codecs.utf_8_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300674 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300675 errors: str(accept={str, NoneType}) = NULL
676 /
677[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000678
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300679static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300680_codecs_utf_8_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300681 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300682/*[clinic end generated code: output=02bf47332b9c796c input=42e3ba73c4392eef]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300683{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300684 return codec_tuple(_PyUnicode_AsUTF8String(str, errors),
685 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000686}
687
688/* This version provides access to the byteorder parameter of the
689 builtin UTF-16 codecs as optional third argument. It defaults to 0
690 which means: use the native byte order and prepend the data with a
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000691 BOM mark.
Guido van Rossume2d67f92000-03-10 23:09:23 +0000692
693*/
694
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300695/*[clinic input]
696_codecs.utf_16_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300697 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300698 errors: str(accept={str, NoneType}) = NULL
699 byteorder: int = 0
700 /
701[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000702
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300703static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300704_codecs_utf_16_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300705 const char *errors, int byteorder)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300706/*[clinic end generated code: output=c654e13efa2e64e4 input=ff46416b04edb944]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300707{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300708 return codec_tuple(_PyUnicode_EncodeUTF16(str, errors, byteorder),
709 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000710}
711
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300712/*[clinic input]
713_codecs.utf_16_le_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300714 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300715 errors: str(accept={str, NoneType}) = NULL
716 /
717[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000718
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300719static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300720_codecs_utf_16_le_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300721 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300722/*[clinic end generated code: output=431b01e55f2d4995 input=cb385455ea8f2fe0]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300723{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300724 return codec_tuple(_PyUnicode_EncodeUTF16(str, errors, -1),
725 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000726}
727
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300728/*[clinic input]
729_codecs.utf_16_be_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300730 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300731 errors: str(accept={str, NoneType}) = NULL
732 /
733[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000734
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300735static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300736_codecs_utf_16_be_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300737 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300738/*[clinic end generated code: output=96886a6fd54dcae3 input=9119997066bdaefd]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300739{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300740 return codec_tuple(_PyUnicode_EncodeUTF16(str, errors, +1),
741 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000742}
743
Walter Dörwald41980ca2007-08-16 21:55:45 +0000744/* This version provides access to the byteorder parameter of the
745 builtin UTF-32 codecs as optional third argument. It defaults to 0
746 which means: use the native byte order and prepend the data with a
747 BOM mark.
748
749*/
750
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300751/*[clinic input]
752_codecs.utf_32_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300753 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300754 errors: str(accept={str, NoneType}) = NULL
755 byteorder: int = 0
756 /
757[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000758
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300759static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300760_codecs_utf_32_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300761 const char *errors, int byteorder)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300762/*[clinic end generated code: output=5c760da0c09a8b83 input=c5e77da82fbe5c2a]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300763{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300764 return codec_tuple(_PyUnicode_EncodeUTF32(str, errors, byteorder),
765 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000766}
767
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300768/*[clinic input]
769_codecs.utf_32_le_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300770 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300771 errors: str(accept={str, NoneType}) = NULL
772 /
773[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000774
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300775static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300776_codecs_utf_32_le_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300777 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300778/*[clinic end generated code: output=b65cd176de8e36d6 input=9993b25fe0877848]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300779{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300780 return codec_tuple(_PyUnicode_EncodeUTF32(str, errors, -1),
781 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000782}
783
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300784/*[clinic input]
785_codecs.utf_32_be_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300786 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300787 errors: str(accept={str, NoneType}) = NULL
788 /
789[clinic start generated code]*/
Walter Dörwald41980ca2007-08-16 21:55:45 +0000790
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300791static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300792_codecs_utf_32_be_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300793 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300794/*[clinic end generated code: output=1d9e71a9358709e9 input=d3e0ccaa02920431]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300795{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300796 return codec_tuple(_PyUnicode_EncodeUTF32(str, errors, +1),
797 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000798}
799
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300800/*[clinic input]
801_codecs.unicode_escape_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300802 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300803 errors: str(accept={str, NoneType}) = NULL
804 /
805[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000806
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300807static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300808_codecs_unicode_escape_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300809 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300810/*[clinic end generated code: output=66271b30bc4f7a3c input=65d9eefca65b455a]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300811{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300812 return codec_tuple(PyUnicode_AsUnicodeEscapeString(str),
813 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000814}
815
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300816/*[clinic input]
817_codecs.raw_unicode_escape_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300818 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300819 errors: str(accept={str, NoneType}) = NULL
820 /
821[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000822
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300823static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300824_codecs_raw_unicode_escape_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300825 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300826/*[clinic end generated code: output=a66a806ed01c830a input=5aa33e4a133391ab]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300827{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300828 return codec_tuple(PyUnicode_AsRawUnicodeEscapeString(str),
829 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000830}
831
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300832/*[clinic input]
833_codecs.latin_1_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300834 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300835 errors: str(accept={str, NoneType}) = NULL
836 /
837[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000838
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300839static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300840_codecs_latin_1_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300841 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300842/*[clinic end generated code: output=2c28c83a27884e08 input=30b11c9e49a65150]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300843{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300844 return codec_tuple(_PyUnicode_AsLatin1String(str, errors),
845 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000846}
847
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300848/*[clinic input]
849_codecs.ascii_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300850 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300851 errors: str(accept={str, NoneType}) = NULL
852 /
853[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000854
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300855static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300856_codecs_ascii_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300857 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300858/*[clinic end generated code: output=b5e035182d33befc input=843a1d268e6dfa8e]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300859{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300860 return codec_tuple(_PyUnicode_AsASCIIString(str, errors),
861 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000862}
863
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300864/*[clinic input]
865_codecs.charmap_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300866 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300867 errors: str(accept={str, NoneType}) = NULL
868 mapping: object = NULL
869 /
870[clinic start generated code]*/
Guido van Rossume2d67f92000-03-10 23:09:23 +0000871
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300872static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300873_codecs_charmap_encode_impl(PyObject *module, PyObject *str,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300874 const char *errors, PyObject *mapping)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300875/*[clinic end generated code: output=047476f48495a9e9 input=0752cde07a6d6d00]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300876{
Guido van Rossume2d67f92000-03-10 23:09:23 +0000877 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000879
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300880 return codec_tuple(_PyUnicode_EncodeCharmap(str, mapping, errors),
881 PyUnicode_GET_LENGTH(str));
Guido van Rossume2d67f92000-03-10 23:09:23 +0000882}
883
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300884/*[clinic input]
885_codecs.charmap_build
886 map: unicode
887 /
888[clinic start generated code]*/
889
890static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300891_codecs_charmap_build_impl(PyObject *module, PyObject *map)
892/*[clinic end generated code: output=bb073c27031db9ac input=d91a91d1717dbc6d]*/
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000893{
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000894 return PyUnicode_BuildEncodingMap(map);
895}
896
Steve Dowercc16be82016-09-08 10:35:16 -0700897#ifdef MS_WINDOWS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000898
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300899/*[clinic input]
900_codecs.mbcs_encode
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300901 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300902 errors: str(accept={str, NoneType}) = NULL
903 /
904[clinic start generated code]*/
Guido van Rossum24bdb042000-03-28 20:29:59 +0000905
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300906static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300907_codecs_mbcs_encode_impl(PyObject *module, PyObject *str, const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300908/*[clinic end generated code: output=76e2e170c966c080 input=de471e0815947553]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300909{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300910 return codec_tuple(PyUnicode_EncodeCodePage(CP_ACP, str, errors),
911 PyUnicode_GET_LENGTH(str));
Guido van Rossum24bdb042000-03-28 20:29:59 +0000912}
913
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300914/*[clinic input]
Steve Dowerf5aba582016-09-06 19:42:27 -0700915_codecs.oem_encode
916 str: unicode
917 errors: str(accept={str, NoneType}) = NULL
918 /
919[clinic start generated code]*/
920
921static PyObject *
922_codecs_oem_encode_impl(PyObject *module, PyObject *str, const char *errors)
923/*[clinic end generated code: output=65d5982c737de649 input=3fc5f0028aad3cda]*/
924{
925 return codec_tuple(PyUnicode_EncodeCodePage(CP_OEMCP, str, errors),
926 PyUnicode_GET_LENGTH(str));
927}
928
929/*[clinic input]
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300930_codecs.code_page_encode
931 code_page: int
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300932 str: unicode
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300933 errors: str(accept={str, NoneType}) = NULL
934 /
935[clinic start generated code]*/
Victor Stinner3a50e702011-10-18 21:21:00 +0200936
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300937static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300938_codecs_code_page_encode_impl(PyObject *module, int code_page, PyObject *str,
939 const char *errors)
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300940/*[clinic end generated code: output=45673f6085657a9e input=786421ae617d680b]*/
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300941{
Serhiy Storchaka21a663e2016-04-13 15:37:23 +0300942 return codec_tuple(PyUnicode_EncodeCodePage(code_page, str, errors),
943 PyUnicode_GET_LENGTH(str));
Victor Stinner3a50e702011-10-18 21:21:00 +0200944}
945
Steve Dowercc16be82016-09-08 10:35:16 -0700946#endif /* MS_WINDOWS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000947
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000948/* --- Error handler registry --------------------------------------------- */
949
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300950/*[clinic input]
951_codecs.register_error
952 errors: str
953 handler: object
954 /
Walter Dörwald0ae29812002-10-31 13:36:29 +0000955
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300956Register the specified error handler under the name errors.
957
958handler must be a callable object, that will be called with an exception
959instance containing information about the location of the encoding/decoding
960error and must return a (replacement, new position) tuple.
961[clinic start generated code]*/
962
963static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300964_codecs_register_error_impl(PyObject *module, const char *errors,
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300965 PyObject *handler)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300966/*[clinic end generated code: output=fa2f7d1879b3067d input=5e6709203c2e33fe]*/
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000967{
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300968 if (PyCodec_RegisterError(errors, handler))
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000969 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000970 Py_RETURN_NONE;
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000971}
972
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300973/*[clinic input]
974_codecs.lookup_error
975 name: str
976 /
Walter Dörwald0ae29812002-10-31 13:36:29 +0000977
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300978lookup_error(errors) -> handler
979
980Return the error handler for the specified error handling name or raise a
981LookupError, if no handler exists under this name.
982[clinic start generated code]*/
983
984static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300985_codecs_lookup_error_impl(PyObject *module, const char *name)
986/*[clinic end generated code: output=087f05dc0c9a98cc input=4775dd65e6235aba]*/
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000987{
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000988 return PyCodec_LookupError(name);
989}
990
Guido van Rossume2d67f92000-03-10 23:09:23 +0000991/* --- Module API --------------------------------------------------------- */
992
993static PyMethodDef _codecs_functions[] = {
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +0300994 _CODECS_REGISTER_METHODDEF
995 _CODECS_LOOKUP_METHODDEF
996 _CODECS_ENCODE_METHODDEF
997 _CODECS_DECODE_METHODDEF
998 _CODECS_ESCAPE_ENCODE_METHODDEF
999 _CODECS_ESCAPE_DECODE_METHODDEF
1000 _CODECS_UTF_8_ENCODE_METHODDEF
1001 _CODECS_UTF_8_DECODE_METHODDEF
1002 _CODECS_UTF_7_ENCODE_METHODDEF
1003 _CODECS_UTF_7_DECODE_METHODDEF
1004 _CODECS_UTF_16_ENCODE_METHODDEF
1005 _CODECS_UTF_16_LE_ENCODE_METHODDEF
1006 _CODECS_UTF_16_BE_ENCODE_METHODDEF
1007 _CODECS_UTF_16_DECODE_METHODDEF
1008 _CODECS_UTF_16_LE_DECODE_METHODDEF
1009 _CODECS_UTF_16_BE_DECODE_METHODDEF
1010 _CODECS_UTF_16_EX_DECODE_METHODDEF
1011 _CODECS_UTF_32_ENCODE_METHODDEF
1012 _CODECS_UTF_32_LE_ENCODE_METHODDEF
1013 _CODECS_UTF_32_BE_ENCODE_METHODDEF
1014 _CODECS_UTF_32_DECODE_METHODDEF
1015 _CODECS_UTF_32_LE_DECODE_METHODDEF
1016 _CODECS_UTF_32_BE_DECODE_METHODDEF
1017 _CODECS_UTF_32_EX_DECODE_METHODDEF
1018 _CODECS_UNICODE_ESCAPE_ENCODE_METHODDEF
1019 _CODECS_UNICODE_ESCAPE_DECODE_METHODDEF
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001020 _CODECS_RAW_UNICODE_ESCAPE_ENCODE_METHODDEF
1021 _CODECS_RAW_UNICODE_ESCAPE_DECODE_METHODDEF
1022 _CODECS_LATIN_1_ENCODE_METHODDEF
1023 _CODECS_LATIN_1_DECODE_METHODDEF
1024 _CODECS_ASCII_ENCODE_METHODDEF
1025 _CODECS_ASCII_DECODE_METHODDEF
1026 _CODECS_CHARMAP_ENCODE_METHODDEF
1027 _CODECS_CHARMAP_DECODE_METHODDEF
1028 _CODECS_CHARMAP_BUILD_METHODDEF
1029 _CODECS_READBUFFER_ENCODE_METHODDEF
1030 _CODECS_MBCS_ENCODE_METHODDEF
1031 _CODECS_MBCS_DECODE_METHODDEF
Steve Dowerf5aba582016-09-06 19:42:27 -07001032 _CODECS_OEM_ENCODE_METHODDEF
1033 _CODECS_OEM_DECODE_METHODDEF
Serhiy Storchaka0c59ff62015-05-12 13:15:57 +03001034 _CODECS_CODE_PAGE_ENCODE_METHODDEF
1035 _CODECS_CODE_PAGE_DECODE_METHODDEF
1036 _CODECS_REGISTER_ERROR_METHODDEF
1037 _CODECS_LOOKUP_ERROR_METHODDEF
Nick Coghlan8fad1672014-09-15 23:50:44 +12001038 _CODECS__FORGET_CODEC_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001039 {NULL, NULL} /* sentinel */
Guido van Rossume2d67f92000-03-10 23:09:23 +00001040};
1041
Martin v. Löwis1a214512008-06-11 05:26:20 +00001042static struct PyModuleDef codecsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 PyModuleDef_HEAD_INIT,
1044 "_codecs",
1045 NULL,
1046 -1,
1047 _codecs_functions,
1048 NULL,
1049 NULL,
1050 NULL,
1051 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001052};
1053
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001054PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001055PyInit__codecs(void)
Guido van Rossume2d67f92000-03-10 23:09:23 +00001056{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 return PyModule_Create(&codecsmodule);
Guido van Rossume2d67f92000-03-10 23:09:23 +00001058}