blob: c9843c25889a2712470c126184c4bfb24aaaba36 [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
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +000023 <encoding>_encode() interfaces also accept non-Unicode object as
24 input. The objects are then converted to Unicode using
25 PyUnicode_FromObject() prior to applying the conversion.
26
Guido van Rossume2d67f92000-03-10 23:09:23 +000027 These <encoding>s are available: utf_8, unicode_escape,
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +000028 raw_unicode_escape, unicode_internal, latin_1, ascii (7-bit),
29 mbcs (on win32).
30
Guido van Rossume2d67f92000-03-10 23:09:23 +000031
32Written by Marc-Andre Lemburg (mal@lemburg.com).
33
Guido van Rossum16b1ad92000-08-03 16:24:25 +000034Copyright (c) Corporation for National Research Initiatives.
Guido van Rossume2d67f92000-03-10 23:09:23 +000035
36 ------------------------------------------------------------------------ */
37
Martin v. Löwis18e16552006-02-15 17:27:45 +000038#define PY_SSIZE_T_CLEAN
Guido van Rossume2d67f92000-03-10 23:09:23 +000039#include "Python.h"
40
41/* --- Registry ----------------------------------------------------------- */
42
Walter Dörwald0ae29812002-10-31 13:36:29 +000043PyDoc_STRVAR(register__doc__,
44"register(search_function)\n\
45\n\
46Register a codec search function. Search functions are expected to take\n\
47one argument, the encoding name in all lower case letters, and return\n\
Guido van Rossum36e0a922007-07-20 04:05:57 +000048a tuple of functions (encoder, decoder, stream_reader, stream_writer)\n\
49(or a CodecInfo object).");
Walter Dörwald0ae29812002-10-31 13:36:29 +000050
Guido van Rossume2d67f92000-03-10 23:09:23 +000051static
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000052PyObject *codec_register(PyObject *self, PyObject *search_function)
Guido van Rossume2d67f92000-03-10 23:09:23 +000053{
Guido van Rossume2d67f92000-03-10 23:09:23 +000054 if (PyCodec_Register(search_function))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000055 return NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +000056
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000057 Py_RETURN_NONE;
Guido van Rossume2d67f92000-03-10 23:09:23 +000058}
59
Walter Dörwald0ae29812002-10-31 13:36:29 +000060PyDoc_STRVAR(lookup__doc__,
Guido van Rossum36e0a922007-07-20 04:05:57 +000061"lookup(encoding) -> CodecInfo\n\
Walter Dörwald0ae29812002-10-31 13:36:29 +000062\n\
63Looks up a codec tuple in the Python codec registry and returns\n\
Benjamin Petersonf07d0022009-03-21 17:31:58 +000064a CodecInfo object.");
Walter Dörwald0ae29812002-10-31 13:36:29 +000065
Guido van Rossume2d67f92000-03-10 23:09:23 +000066static
Marc-André Lemburg3f419742004-07-10 12:06:10 +000067PyObject *codec_lookup(PyObject *self, PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +000068{
69 char *encoding;
70
71 if (!PyArg_ParseTuple(args, "s:lookup", &encoding))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000072 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +000073
74 return _PyCodec_Lookup(encoding);
Guido van Rossume2d67f92000-03-10 23:09:23 +000075}
76
Marc-André Lemburg3f419742004-07-10 12:06:10 +000077PyDoc_STRVAR(encode__doc__,
78"encode(obj, [encoding[,errors]]) -> object\n\
79\n\
80Encodes obj using the codec registered for encoding. encoding defaults\n\
81to the default encoding. errors may be given to set a different error\n\
82handling scheme. Default is 'strict' meaning that encoding errors raise\n\
83a ValueError. Other possible values are 'ignore', 'replace' and\n\
84'xmlcharrefreplace' as well as any other name registered with\n\
85codecs.register_error that can handle ValueErrors.");
86
87static PyObject *
88codec_encode(PyObject *self, PyObject *args)
89{
Brett Cannon3e377de2004-07-10 21:41:14 +000090 const char *encoding = NULL;
91 const char *errors = NULL;
Marc-André Lemburg3f419742004-07-10 12:06:10 +000092 PyObject *v;
Walter Dörwald9fd115c2005-11-02 08:30:08 +000093
Marc-André Lemburg3f419742004-07-10 12:06:10 +000094 if (!PyArg_ParseTuple(args, "O|ss:encode", &v, &encoding, &errors))
95 return NULL;
96
97 if (encoding == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000098 encoding = PyUnicode_GetDefaultEncoding();
Marc-André Lemburg3f419742004-07-10 12:06:10 +000099
100 /* Encode via the codec registry */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000101 return PyCodec_Encode(v, encoding, errors);
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000102}
103
104PyDoc_STRVAR(decode__doc__,
105"decode(obj, [encoding[,errors]]) -> object\n\
106\n\
107Decodes obj using the codec registered for encoding. encoding defaults\n\
108to the default encoding. errors may be given to set a different error\n\
109handling scheme. Default is 'strict' meaning that encoding errors raise\n\
110a ValueError. Other possible values are 'ignore' and 'replace'\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000111as well as any other name registered with codecs.register_error that is\n\
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000112able to handle ValueErrors.");
113
114static PyObject *
115codec_decode(PyObject *self, PyObject *args)
116{
Brett Cannon3e377de2004-07-10 21:41:14 +0000117 const char *encoding = NULL;
118 const char *errors = NULL;
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000119 PyObject *v;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000120
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000121 if (!PyArg_ParseTuple(args, "O|ss:decode", &v, &encoding, &errors))
122 return NULL;
123
124 if (encoding == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 encoding = PyUnicode_GetDefaultEncoding();
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000126
127 /* Decode via the codec registry */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000128 return PyCodec_Decode(v, encoding, errors);
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000129}
130
Guido van Rossume2d67f92000-03-10 23:09:23 +0000131/* --- Helpers ------------------------------------------------------------ */
132
133static
134PyObject *codec_tuple(PyObject *unicode,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000135 Py_ssize_t len)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000136{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000137 PyObject *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000138 if (unicode == NULL)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000139 return NULL;
140 v = Py_BuildValue("On", unicode, len);
141 Py_DECREF(unicode);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000142 return v;
143}
144
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000145/* --- String codecs ------------------------------------------------------ */
146static PyObject *
147escape_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000148 PyObject *args)
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000149{
150 const char *errors = NULL;
151 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000152 Py_ssize_t size;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000153
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000154 if (!PyArg_ParseTuple(args, "s#|z:escape_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000155 &data, &size, &errors))
156 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +0000157 return codec_tuple(PyBytes_DecodeEscape(data, size, errors, 0, NULL),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 size);
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000159}
160
161static PyObject *
162escape_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 PyObject *args)
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000164{
Antoine Pitroud1188562010-06-09 16:38:55 +0000165 static const char *hexdigits = "0123456789abcdef";
166 PyObject *str;
167 Py_ssize_t size;
168 Py_ssize_t newsize;
169 const char *errors = NULL;
170 PyObject *v;
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000171
Antoine Pitroud1188562010-06-09 16:38:55 +0000172 if (!PyArg_ParseTuple(args, "O!|z:escape_encode",
173 &PyBytes_Type, &str, &errors))
174 return NULL;
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000175
Antoine Pitroud1188562010-06-09 16:38:55 +0000176 size = PyBytes_GET_SIZE(str);
177 newsize = 4*size;
178 if (newsize > PY_SSIZE_T_MAX || newsize / 4 != size) {
179 PyErr_SetString(PyExc_OverflowError,
180 "string is too large to encode");
181 return NULL;
182 }
183 v = PyBytes_FromStringAndSize(NULL, newsize);
184
185 if (v == NULL) {
186 return NULL;
187 }
188 else {
189 register Py_ssize_t i;
190 register char c;
191 register char *p = PyBytes_AS_STRING(v);
192
193 for (i = 0; i < size; i++) {
194 /* There's at least enough room for a hex escape */
195 assert(newsize - (p - PyBytes_AS_STRING(v)) >= 4);
196 c = PyBytes_AS_STRING(str)[i];
197 if (c == '\'' || c == '\\')
198 *p++ = '\\', *p++ = c;
199 else if (c == '\t')
200 *p++ = '\\', *p++ = 't';
201 else if (c == '\n')
202 *p++ = '\\', *p++ = 'n';
203 else if (c == '\r')
204 *p++ = '\\', *p++ = 'r';
205 else if (c < ' ' || c >= 0x7f) {
206 *p++ = '\\';
207 *p++ = 'x';
208 *p++ = hexdigits[(c & 0xf0) >> 4];
209 *p++ = hexdigits[c & 0xf];
210 }
211 else
212 *p++ = c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 }
Antoine Pitroud1188562010-06-09 16:38:55 +0000214 *p = '\0';
215 if (_PyBytes_Resize(&v, (p - PyBytes_AS_STRING(v)))) {
216 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 }
Antoine Pitroud1188562010-06-09 16:38:55 +0000218 }
Walter Dörwald1ab83302007-05-18 17:15:44 +0000219
Antoine Pitroud1188562010-06-09 16:38:55 +0000220 return codec_tuple(v, size);
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000221}
222
Guido van Rossume2d67f92000-03-10 23:09:23 +0000223/* --- Decoder ------------------------------------------------------------ */
224
225static PyObject *
226unicode_internal_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000228{
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000229 PyObject *obj;
230 const char *errors = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000231 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000232 Py_ssize_t size;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000233
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000234 if (!PyArg_ParseTuple(args, "O|z:unicode_internal_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 &obj, &errors))
236 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000237
Marc-André Lemburg29273c82003-02-04 19:35:03 +0000238 if (PyUnicode_Check(obj)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 Py_INCREF(obj);
240 return codec_tuple(obj, PyUnicode_GET_SIZE(obj));
Marc-André Lemburg29273c82003-02-04 19:35:03 +0000241 }
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000242 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
244 return NULL;
Walter Dörwalda47d1c02005-08-30 10:23:14 +0000245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000246 return codec_tuple(_PyUnicode_DecodeUnicodeInternal(data, size, errors),
247 size);
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000248 }
Guido van Rossume2d67f92000-03-10 23:09:23 +0000249}
250
251static PyObject *
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000252utf_7_decode(PyObject *self,
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000253 PyObject *args)
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000254{
Antoine Pitroud1188562010-06-09 16:38:55 +0000255 Py_buffer pbuf;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000256 const char *errors = NULL;
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000257 int final = 0;
258 Py_ssize_t consumed;
259 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000260
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000261 if (!PyArg_ParseTuple(args, "y*|zi:utf_7_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 &pbuf, &errors, &final))
263 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000264 consumed = pbuf.len;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000265
Martin v. Löwis423be952008-08-13 15:53:07 +0000266 decoded = PyUnicode_DecodeUTF7Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000268 PyBuffer_Release(&pbuf);
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000269 if (decoded == NULL)
270 return NULL;
271 return codec_tuple(decoded, consumed);
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000272}
273
274static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000275utf_8_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000277{
Antoine Pitroud1188562010-06-09 16:38:55 +0000278 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000279 const char *errors = NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000280 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000281 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000282 PyObject *decoded = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000283
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000284 if (!PyArg_ParseTuple(args, "y*|zi:utf_8_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000285 &pbuf, &errors, &final))
286 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000287 consumed = pbuf.len;
288
289 decoded = PyUnicode_DecodeUTF8Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000291 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000292 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000294 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000295}
296
297static PyObject *
298utf_16_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000300{
Antoine Pitroud1188562010-06-09 16:38:55 +0000301 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000302 const char *errors = NULL;
303 int byteorder = 0;
Walter Dörwald69652032004-09-07 20:24:22 +0000304 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000305 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000306 PyObject *decoded;
307
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000308 if (!PyArg_ParseTuple(args, "y*|zi:utf_16_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 &pbuf, &errors, &final))
310 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000311 consumed = pbuf.len; /* This is overwritten unless final is true. */
312 decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000314 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000315 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000317 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000318}
319
320static PyObject *
321utf_16_le_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000323{
Antoine Pitroud1188562010-06-09 16:38:55 +0000324 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000325 const char *errors = NULL;
326 int byteorder = -1;
Walter Dörwald69652032004-09-07 20:24:22 +0000327 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000328 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000329 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000330
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000331 if (!PyArg_ParseTuple(args, "y*|zi:utf_16_le_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 &pbuf, &errors, &final))
333 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000334
Martin v. Löwis423be952008-08-13 15:53:07 +0000335 consumed = pbuf.len; /* This is overwritten unless final is true. */
336 decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000338 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000339 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000341 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000342}
343
344static PyObject *
345utf_16_be_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000347{
Antoine Pitroud1188562010-06-09 16:38:55 +0000348 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000349 const char *errors = NULL;
350 int byteorder = 1;
Walter Dörwald69652032004-09-07 20:24:22 +0000351 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000352 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000353 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000354
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000355 if (!PyArg_ParseTuple(args, "y*|zi:utf_16_be_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 &pbuf, &errors, &final))
357 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000358
359 consumed = pbuf.len; /* This is overwritten unless final is true. */
360 decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000362 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000363 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000365 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000366}
367
368/* This non-standard version also provides access to the byteorder
369 parameter of the builtin UTF-16 codec.
370
371 It returns a tuple (unicode, bytesread, byteorder) with byteorder
372 being the value in effect at the end of data.
373
374*/
375
376static PyObject *
377utf_16_ex_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000378 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000379{
Antoine Pitroud1188562010-06-09 16:38:55 +0000380 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000381 const char *errors = NULL;
382 int byteorder = 0;
383 PyObject *unicode, *tuple;
Walter Dörwald69652032004-09-07 20:24:22 +0000384 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000385 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000386
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000387 if (!PyArg_ParseTuple(args, "y*|zii:utf_16_ex_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 &pbuf, &errors, &byteorder, &final))
389 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000390 consumed = pbuf.len; /* This is overwritten unless final is true. */
391 unicode = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000393 PyBuffer_Release(&pbuf);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000394 if (unicode == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000396 tuple = Py_BuildValue("Oni", unicode, consumed, byteorder);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000397 Py_DECREF(unicode);
398 return tuple;
399}
400
401static PyObject *
Walter Dörwald41980ca2007-08-16 21:55:45 +0000402utf_32_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000404{
Antoine Pitroud1188562010-06-09 16:38:55 +0000405 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000406 const char *errors = NULL;
407 int byteorder = 0;
408 int final = 0;
409 Py_ssize_t consumed;
410 PyObject *decoded;
411
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000412 if (!PyArg_ParseTuple(args, "y*|zi:utf_32_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 &pbuf, &errors, &final))
414 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000415 consumed = pbuf.len; /* This is overwritten unless final is true. */
416 decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000418 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000419 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000421 return codec_tuple(decoded, consumed);
422}
423
424static PyObject *
425utf_32_le_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000426 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000427{
Antoine Pitroud1188562010-06-09 16:38:55 +0000428 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000429 const char *errors = NULL;
430 int byteorder = -1;
431 int final = 0;
432 Py_ssize_t consumed;
Martin v. Löwis423be952008-08-13 15:53:07 +0000433 PyObject *decoded;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000434
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000435 if (!PyArg_ParseTuple(args, "y*|zi:utf_32_le_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 &pbuf, &errors, &final))
437 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000438 consumed = pbuf.len; /* This is overwritten unless final is true. */
439 decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000441 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000442 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000443 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000444 return codec_tuple(decoded, consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000445}
446
447static PyObject *
448utf_32_be_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000450{
Antoine Pitroud1188562010-06-09 16:38:55 +0000451 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000452 const char *errors = NULL;
453 int byteorder = 1;
454 int final = 0;
455 Py_ssize_t consumed;
Martin v. Löwis423be952008-08-13 15:53:07 +0000456 PyObject *decoded;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000457
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000458 if (!PyArg_ParseTuple(args, "y*|zi:utf_32_be_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 &pbuf, &errors, &final))
460 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000461 consumed = pbuf.len; /* This is overwritten unless final is true. */
462 decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000464 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000465 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000467 return codec_tuple(decoded, consumed);
468}
469
470/* This non-standard version also provides access to the byteorder
471 parameter of the builtin UTF-32 codec.
472
473 It returns a tuple (unicode, bytesread, byteorder) with byteorder
474 being the value in effect at the end of data.
475
476*/
477
478static PyObject *
479utf_32_ex_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000481{
Antoine Pitroud1188562010-06-09 16:38:55 +0000482 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000483 const char *errors = NULL;
484 int byteorder = 0;
485 PyObject *unicode, *tuple;
486 int final = 0;
487 Py_ssize_t consumed;
488
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000489 if (!PyArg_ParseTuple(args, "y*|zii:utf_32_ex_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 &pbuf, &errors, &byteorder, &final))
491 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000492 consumed = pbuf.len; /* This is overwritten unless final is true. */
493 unicode = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000495 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000496 if (unicode == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000497 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000498 tuple = Py_BuildValue("Oni", unicode, consumed, byteorder);
499 Py_DECREF(unicode);
500 return tuple;
501}
502
503static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000504unicode_escape_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000506{
Antoine Pitroud1188562010-06-09 16:38:55 +0000507 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000508 const char *errors = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 PyObject *unicode;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000510
Martin v. Löwis423be952008-08-13 15:53:07 +0000511 if (!PyArg_ParseTuple(args, "s*|z:unicode_escape_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 &pbuf, &errors))
513 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000514
Antoine Pitroud1188562010-06-09 16:38:55 +0000515 unicode = PyUnicode_DecodeUnicodeEscape(pbuf.buf, pbuf.len, errors);
516 PyBuffer_Release(&pbuf);
517 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000518}
519
520static PyObject *
521raw_unicode_escape_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000523{
Antoine Pitroud1188562010-06-09 16:38:55 +0000524 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000525 const char *errors = NULL;
Antoine Pitroud1188562010-06-09 16:38:55 +0000526 PyObject *unicode;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000527
Martin v. Löwis423be952008-08-13 15:53:07 +0000528 if (!PyArg_ParseTuple(args, "s*|z:raw_unicode_escape_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 &pbuf, &errors))
530 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000531
Antoine Pitroud1188562010-06-09 16:38:55 +0000532 unicode = PyUnicode_DecodeRawUnicodeEscape(pbuf.buf, pbuf.len, errors);
533 PyBuffer_Release(&pbuf);
534 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000535}
536
537static PyObject *
538latin_1_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000540{
Antoine Pitroud1188562010-06-09 16:38:55 +0000541 Py_buffer pbuf;
542 PyObject *unicode;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000543 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000544
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000545 if (!PyArg_ParseTuple(args, "y*|z:latin_1_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 &pbuf, &errors))
547 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000548
Antoine Pitroud1188562010-06-09 16:38:55 +0000549 unicode = PyUnicode_DecodeLatin1(pbuf.buf, pbuf.len, errors);
550 PyBuffer_Release(&pbuf);
551 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000552}
553
554static PyObject *
555ascii_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000557{
Antoine Pitroud1188562010-06-09 16:38:55 +0000558 Py_buffer pbuf;
559 PyObject *unicode;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000560 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000561
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000562 if (!PyArg_ParseTuple(args, "y*|z:ascii_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 &pbuf, &errors))
564 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000565
Antoine Pitroud1188562010-06-09 16:38:55 +0000566 unicode = PyUnicode_DecodeASCII(pbuf.buf, pbuf.len, errors);
567 PyBuffer_Release(&pbuf);
568 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000569}
570
571static PyObject *
572charmap_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000574{
Antoine Pitroud1188562010-06-09 16:38:55 +0000575 Py_buffer pbuf;
576 PyObject *unicode;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000577 const char *errors = NULL;
578 PyObject *mapping = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000579
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000580 if (!PyArg_ParseTuple(args, "y*|zO:charmap_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 &pbuf, &errors, &mapping))
582 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000583 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000585
Antoine Pitroud1188562010-06-09 16:38:55 +0000586 unicode = PyUnicode_DecodeCharmap(pbuf.buf, pbuf.len, mapping, errors);
587 PyBuffer_Release(&pbuf);
588 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000589}
590
Victor Stinner99b95382011-07-04 14:23:54 +0200591#ifdef HAVE_MBCS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000592
593static PyObject *
594mbcs_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 PyObject *args)
Guido van Rossum24bdb042000-03-28 20:29:59 +0000596{
Antoine Pitroud1188562010-06-09 16:38:55 +0000597 Py_buffer pbuf;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000598 const char *errors = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000599 int final = 0;
Martin v. Löwis423be952008-08-13 15:53:07 +0000600 Py_ssize_t consumed;
601 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000602
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000603 if (!PyArg_ParseTuple(args, "y*|zi:mbcs_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 &pbuf, &errors, &final))
605 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000606 consumed = pbuf.len;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000607
Martin v. Löwis423be952008-08-13 15:53:07 +0000608 decoded = PyUnicode_DecodeMBCSStateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000610 PyBuffer_Release(&pbuf);
Martin v. Löwis423be952008-08-13 15:53:07 +0000611 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000613 return codec_tuple(decoded, consumed);
Guido van Rossum24bdb042000-03-28 20:29:59 +0000614}
615
Victor Stinner99b95382011-07-04 14:23:54 +0200616#endif /* HAVE_MBCS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000617
Guido van Rossume2d67f92000-03-10 23:09:23 +0000618/* --- Encoder ------------------------------------------------------------ */
619
620static PyObject *
621readbuffer_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000623{
Martin v. Löwis423be952008-08-13 15:53:07 +0000624 Py_buffer pdata;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000625 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000626 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000627 const char *errors = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000628 PyObject *result;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000629
Martin v. Löwis423be952008-08-13 15:53:07 +0000630 if (!PyArg_ParseTuple(args, "s*|z:readbuffer_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 &pdata, &errors))
632 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000633 data = pdata.buf;
634 size = pdata.len;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000635
Martin v. Löwis423be952008-08-13 15:53:07 +0000636 result = PyBytes_FromStringAndSize(data, size);
637 PyBuffer_Release(&pdata);
638 return codec_tuple(result, size);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000639}
640
641static PyObject *
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000642unicode_internal_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 PyObject *args)
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000644{
645 PyObject *obj;
646 const char *errors = NULL;
647 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000648 Py_ssize_t size;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000649
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000650 if (!PyArg_ParseTuple(args, "O|z:unicode_internal_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000651 &obj, &errors))
652 return NULL;
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000653
654 if (PyUnicode_Check(obj)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 data = PyUnicode_AS_DATA(obj);
656 size = PyUnicode_GET_DATA_SIZE(obj);
657 return codec_tuple(PyBytes_FromStringAndSize(data, size),
658 PyUnicode_GET_SIZE(obj));
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000659 }
660 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
662 return NULL;
663 return codec_tuple(PyBytes_FromStringAndSize(data, size), size);
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000664 }
665}
666
667static PyObject *
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000668utf_7_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 PyObject *args)
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000670{
671 PyObject *str, *v;
672 const char *errors = NULL;
673
674 if (!PyArg_ParseTuple(args, "O|z:utf_7_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 &str, &errors))
676 return NULL;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000677
678 str = PyUnicode_FromObject(str);
679 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 return NULL;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000681 v = codec_tuple(PyUnicode_EncodeUTF7(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 PyUnicode_GET_SIZE(str),
683 0,
684 0,
685 errors),
686 PyUnicode_GET_SIZE(str));
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000687 Py_DECREF(str);
688 return v;
689}
690
691static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000692utf_8_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000694{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000695 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000696 const char *errors = NULL;
697
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000698 if (!PyArg_ParseTuple(args, "O|z:utf_8_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 &str, &errors))
700 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000701
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000702 str = PyUnicode_FromObject(str);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200703 if (str == NULL || PyUnicode_READY(str) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200705 v = codec_tuple(PyUnicode_AsEncodedString(str, "utf-8", errors),
706 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000707 Py_DECREF(str);
708 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000709}
710
711/* This version provides access to the byteorder parameter of the
712 builtin UTF-16 codecs as optional third argument. It defaults to 0
713 which means: use the native byte order and prepend the data with a
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000714 BOM mark.
Guido van Rossume2d67f92000-03-10 23:09:23 +0000715
716*/
717
718static PyObject *
719utf_16_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000721{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000722 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000723 const char *errors = NULL;
724 int byteorder = 0;
725
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000726 if (!PyArg_ParseTuple(args, "O|zi:utf_16_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 &str, &errors, &byteorder))
728 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000729
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000730 str = PyUnicode_FromObject(str);
731 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000733 v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 PyUnicode_GET_SIZE(str),
735 errors,
736 byteorder),
737 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000738 Py_DECREF(str);
739 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000740}
741
742static PyObject *
743utf_16_le_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000745{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000746 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000747 const char *errors = NULL;
748
Marc-André Lemburg4157dd52001-06-17 18:32:36 +0000749 if (!PyArg_ParseTuple(args, "O|z:utf_16_le_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 &str, &errors))
751 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000752
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000753 str = PyUnicode_FromObject(str);
754 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000756 v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 PyUnicode_GET_SIZE(str),
758 errors,
759 -1),
760 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000761 Py_DECREF(str);
762 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000763}
764
765static PyObject *
766utf_16_be_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000768{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000769 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000770 const char *errors = NULL;
771
Marc-André Lemburg4157dd52001-06-17 18:32:36 +0000772 if (!PyArg_ParseTuple(args, "O|z:utf_16_be_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 &str, &errors))
774 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000775
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000776 str = PyUnicode_FromObject(str);
777 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000779 v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 PyUnicode_GET_SIZE(str),
781 errors,
782 +1),
783 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000784 Py_DECREF(str);
785 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000786}
787
Walter Dörwald41980ca2007-08-16 21:55:45 +0000788/* This version provides access to the byteorder parameter of the
789 builtin UTF-32 codecs as optional third argument. It defaults to 0
790 which means: use the native byte order and prepend the data with a
791 BOM mark.
792
793*/
794
795static PyObject *
796utf_32_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000798{
799 PyObject *str, *v;
800 const char *errors = NULL;
801 int byteorder = 0;
802
803 if (!PyArg_ParseTuple(args, "O|zi:utf_32_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 &str, &errors, &byteorder))
805 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000806
807 str = PyUnicode_FromObject(str);
808 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000810 v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 PyUnicode_GET_SIZE(str),
812 errors,
813 byteorder),
814 PyUnicode_GET_SIZE(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000815 Py_DECREF(str);
816 return v;
817}
818
819static PyObject *
820utf_32_le_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000822{
823 PyObject *str, *v;
824 const char *errors = NULL;
825
826 if (!PyArg_ParseTuple(args, "O|z:utf_32_le_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 &str, &errors))
828 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000829
830 str = PyUnicode_FromObject(str);
831 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000833 v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 PyUnicode_GET_SIZE(str),
835 errors,
836 -1),
837 PyUnicode_GET_SIZE(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000838 Py_DECREF(str);
839 return v;
840}
841
842static PyObject *
843utf_32_be_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000845{
846 PyObject *str, *v;
847 const char *errors = NULL;
848
849 if (!PyArg_ParseTuple(args, "O|z:utf_32_be_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 &str, &errors))
851 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000852
853 str = PyUnicode_FromObject(str);
854 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000856 v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 PyUnicode_GET_SIZE(str),
858 errors,
859 +1),
860 PyUnicode_GET_SIZE(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000861 Py_DECREF(str);
862 return v;
863}
864
Guido van Rossume2d67f92000-03-10 23:09:23 +0000865static PyObject *
866unicode_escape_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000868{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000869 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000870 const char *errors = NULL;
871
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000872 if (!PyArg_ParseTuple(args, "O|z:unicode_escape_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 &str, &errors))
874 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000875
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000876 str = PyUnicode_FromObject(str);
877 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 return NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000879 v = codec_tuple(PyUnicode_EncodeUnicodeEscape(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 PyUnicode_GET_SIZE(str)),
881 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000882 Py_DECREF(str);
883 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000884}
885
886static PyObject *
887raw_unicode_escape_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000889{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000890 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000891 const char *errors = NULL;
892
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000893 if (!PyArg_ParseTuple(args, "O|z:raw_unicode_escape_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 &str, &errors))
895 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000896
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000897 str = PyUnicode_FromObject(str);
898 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000900 v = codec_tuple(PyUnicode_EncodeRawUnicodeEscape(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 PyUnicode_AS_UNICODE(str),
902 PyUnicode_GET_SIZE(str)),
903 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000904 Py_DECREF(str);
905 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000906}
907
908static PyObject *
909latin_1_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000911{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000912 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000913 const char *errors = NULL;
914
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000915 if (!PyArg_ParseTuple(args, "O|z:latin_1_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 &str, &errors))
917 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000918
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000919 str = PyUnicode_FromObject(str);
920 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000922 v = codec_tuple(PyUnicode_EncodeLatin1(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 PyUnicode_AS_UNICODE(str),
924 PyUnicode_GET_SIZE(str),
925 errors),
926 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000927 Py_DECREF(str);
928 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000929}
930
931static PyObject *
932ascii_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000934{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000935 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000936 const char *errors = NULL;
937
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000938 if (!PyArg_ParseTuple(args, "O|z:ascii_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 &str, &errors))
940 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000941
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000942 str = PyUnicode_FromObject(str);
943 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000945 v = codec_tuple(PyUnicode_EncodeASCII(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 PyUnicode_AS_UNICODE(str),
947 PyUnicode_GET_SIZE(str),
948 errors),
949 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000950 Py_DECREF(str);
951 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000952}
953
954static PyObject *
955charmap_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000957{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000958 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000959 const char *errors = NULL;
960 PyObject *mapping = NULL;
961
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000962 if (!PyArg_ParseTuple(args, "O|zO:charmap_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 &str, &errors, &mapping))
964 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000965 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000967
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000968 str = PyUnicode_FromObject(str);
969 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000971 v = codec_tuple(PyUnicode_EncodeCharmap(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 PyUnicode_AS_UNICODE(str),
973 PyUnicode_GET_SIZE(str),
974 mapping,
975 errors),
976 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000977 Py_DECREF(str);
978 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000979}
980
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000981static PyObject*
982charmap_build(PyObject *self, PyObject *args)
983{
984 PyObject *map;
985 if (!PyArg_ParseTuple(args, "U:charmap_build", &map))
986 return NULL;
987 return PyUnicode_BuildEncodingMap(map);
988}
989
Victor Stinner99b95382011-07-04 14:23:54 +0200990#ifdef HAVE_MBCS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000991
992static PyObject *
993mbcs_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 PyObject *args)
Guido van Rossum24bdb042000-03-28 20:29:59 +0000995{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000996 PyObject *str, *v;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000997 const char *errors = NULL;
998
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000999 if (!PyArg_ParseTuple(args, "O|z:mbcs_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 &str, &errors))
1001 return NULL;
Guido van Rossum24bdb042000-03-28 20:29:59 +00001002
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +00001003 str = PyUnicode_FromObject(str);
1004 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +00001006 v = codec_tuple(PyUnicode_EncodeMBCS(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001007 PyUnicode_AS_UNICODE(str),
1008 PyUnicode_GET_SIZE(str),
1009 errors),
1010 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +00001011 Py_DECREF(str);
1012 return v;
Guido van Rossum24bdb042000-03-28 20:29:59 +00001013}
1014
Victor Stinner99b95382011-07-04 14:23:54 +02001015#endif /* HAVE_MBCS */
Guido van Rossum24bdb042000-03-28 20:29:59 +00001016
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001017/* --- Error handler registry --------------------------------------------- */
1018
Walter Dörwald0ae29812002-10-31 13:36:29 +00001019PyDoc_STRVAR(register_error__doc__,
1020"register_error(errors, handler)\n\
1021\n\
1022Register the specified error handler under the name\n\
1023errors. handler must be a callable object, that\n\
1024will be called with an exception instance containing\n\
1025information about the location of the encoding/decoding\n\
1026error and must return a (replacement, new position) tuple.");
1027
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001028static PyObject *register_error(PyObject *self, PyObject *args)
1029{
1030 const char *name;
1031 PyObject *handler;
1032
1033 if (!PyArg_ParseTuple(args, "sO:register_error",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 &name, &handler))
1035 return NULL;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001036 if (PyCodec_RegisterError(name, handler))
1037 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001038 Py_RETURN_NONE;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001039}
1040
Walter Dörwald0ae29812002-10-31 13:36:29 +00001041PyDoc_STRVAR(lookup_error__doc__,
1042"lookup_error(errors) -> handler\n\
1043\n\
1044Return the error handler for the specified error handling name\n\
1045or raise a LookupError, if no handler exists under this name.");
1046
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001047static PyObject *lookup_error(PyObject *self, PyObject *args)
1048{
1049 const char *name;
1050
1051 if (!PyArg_ParseTuple(args, "s:lookup_error",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 &name))
1053 return NULL;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001054 return PyCodec_LookupError(name);
1055}
1056
Guido van Rossume2d67f92000-03-10 23:09:23 +00001057/* --- Module API --------------------------------------------------------- */
1058
1059static PyMethodDef _codecs_functions[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 {"register", codec_register, METH_O,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001061 register__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 {"lookup", codec_lookup, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001063 lookup__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 {"encode", codec_encode, METH_VARARGS,
1065 encode__doc__},
1066 {"decode", codec_decode, METH_VARARGS,
1067 decode__doc__},
1068 {"escape_encode", escape_encode, METH_VARARGS},
1069 {"escape_decode", escape_decode, METH_VARARGS},
1070 {"utf_8_encode", utf_8_encode, METH_VARARGS},
1071 {"utf_8_decode", utf_8_decode, METH_VARARGS},
1072 {"utf_7_encode", utf_7_encode, METH_VARARGS},
1073 {"utf_7_decode", utf_7_decode, METH_VARARGS},
1074 {"utf_16_encode", utf_16_encode, METH_VARARGS},
1075 {"utf_16_le_encode", utf_16_le_encode, METH_VARARGS},
1076 {"utf_16_be_encode", utf_16_be_encode, METH_VARARGS},
1077 {"utf_16_decode", utf_16_decode, METH_VARARGS},
1078 {"utf_16_le_decode", utf_16_le_decode, METH_VARARGS},
1079 {"utf_16_be_decode", utf_16_be_decode, METH_VARARGS},
1080 {"utf_16_ex_decode", utf_16_ex_decode, METH_VARARGS},
1081 {"utf_32_encode", utf_32_encode, METH_VARARGS},
1082 {"utf_32_le_encode", utf_32_le_encode, METH_VARARGS},
1083 {"utf_32_be_encode", utf_32_be_encode, METH_VARARGS},
1084 {"utf_32_decode", utf_32_decode, METH_VARARGS},
1085 {"utf_32_le_decode", utf_32_le_decode, METH_VARARGS},
1086 {"utf_32_be_decode", utf_32_be_decode, METH_VARARGS},
1087 {"utf_32_ex_decode", utf_32_ex_decode, METH_VARARGS},
1088 {"unicode_escape_encode", unicode_escape_encode, METH_VARARGS},
1089 {"unicode_escape_decode", unicode_escape_decode, METH_VARARGS},
1090 {"unicode_internal_encode", unicode_internal_encode, METH_VARARGS},
1091 {"unicode_internal_decode", unicode_internal_decode, METH_VARARGS},
1092 {"raw_unicode_escape_encode", raw_unicode_escape_encode, METH_VARARGS},
1093 {"raw_unicode_escape_decode", raw_unicode_escape_decode, METH_VARARGS},
1094 {"latin_1_encode", latin_1_encode, METH_VARARGS},
1095 {"latin_1_decode", latin_1_decode, METH_VARARGS},
1096 {"ascii_encode", ascii_encode, METH_VARARGS},
1097 {"ascii_decode", ascii_decode, METH_VARARGS},
1098 {"charmap_encode", charmap_encode, METH_VARARGS},
1099 {"charmap_decode", charmap_decode, METH_VARARGS},
1100 {"charmap_build", charmap_build, METH_VARARGS},
1101 {"readbuffer_encode", readbuffer_encode, METH_VARARGS},
Victor Stinner99b95382011-07-04 14:23:54 +02001102#ifdef HAVE_MBCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 {"mbcs_encode", mbcs_encode, METH_VARARGS},
1104 {"mbcs_decode", mbcs_decode, METH_VARARGS},
Guido van Rossum24bdb042000-03-28 20:29:59 +00001105#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 {"register_error", register_error, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001107 register_error__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 {"lookup_error", lookup_error, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001109 lookup_error__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 {NULL, NULL} /* sentinel */
Guido van Rossume2d67f92000-03-10 23:09:23 +00001111};
1112
Martin v. Löwis1a214512008-06-11 05:26:20 +00001113static struct PyModuleDef codecsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 PyModuleDef_HEAD_INIT,
1115 "_codecs",
1116 NULL,
1117 -1,
1118 _codecs_functions,
1119 NULL,
1120 NULL,
1121 NULL,
1122 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001123};
1124
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001125PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001126PyInit__codecs(void)
Guido van Rossume2d67f92000-03-10 23:09:23 +00001127{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 return PyModule_Create(&codecsmodule);
Guido van Rossume2d67f92000-03-10 23:09:23 +00001129}