blob: 26c87880bc235644a103b33a44a3d79e018eef10 [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 PyObject *str;
166 Py_ssize_t size;
167 Py_ssize_t newsize;
168 const char *errors = NULL;
169 PyObject *v;
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000170
Antoine Pitroud1188562010-06-09 16:38:55 +0000171 if (!PyArg_ParseTuple(args, "O!|z:escape_encode",
172 &PyBytes_Type, &str, &errors))
173 return NULL;
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000174
Antoine Pitroud1188562010-06-09 16:38:55 +0000175 size = PyBytes_GET_SIZE(str);
176 newsize = 4*size;
177 if (newsize > PY_SSIZE_T_MAX || newsize / 4 != size) {
178 PyErr_SetString(PyExc_OverflowError,
179 "string is too large to encode");
180 return NULL;
181 }
182 v = PyBytes_FromStringAndSize(NULL, newsize);
183
184 if (v == NULL) {
185 return NULL;
186 }
187 else {
188 register Py_ssize_t i;
189 register char c;
190 register char *p = PyBytes_AS_STRING(v);
191
192 for (i = 0; i < size; i++) {
193 /* There's at least enough room for a hex escape */
194 assert(newsize - (p - PyBytes_AS_STRING(v)) >= 4);
195 c = PyBytes_AS_STRING(str)[i];
196 if (c == '\'' || c == '\\')
197 *p++ = '\\', *p++ = c;
198 else if (c == '\t')
199 *p++ = '\\', *p++ = 't';
200 else if (c == '\n')
201 *p++ = '\\', *p++ = 'n';
202 else if (c == '\r')
203 *p++ = '\\', *p++ = 'r';
204 else if (c < ' ' || c >= 0x7f) {
205 *p++ = '\\';
206 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +0200207 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
208 *p++ = Py_hexdigits[c & 0xf];
Antoine Pitroud1188562010-06-09 16:38:55 +0000209 }
210 else
211 *p++ = c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 }
Antoine Pitroud1188562010-06-09 16:38:55 +0000213 *p = '\0';
214 if (_PyBytes_Resize(&v, (p - PyBytes_AS_STRING(v)))) {
215 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000216 }
Antoine Pitroud1188562010-06-09 16:38:55 +0000217 }
Walter Dörwald1ab83302007-05-18 17:15:44 +0000218
Antoine Pitroud1188562010-06-09 16:38:55 +0000219 return codec_tuple(v, size);
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000220}
221
Guido van Rossume2d67f92000-03-10 23:09:23 +0000222/* --- Decoder ------------------------------------------------------------ */
223
224static PyObject *
225unicode_internal_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000226 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000227{
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000228 PyObject *obj;
229 const char *errors = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000230 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000231 Py_ssize_t size;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000232
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000233 if (!PyArg_ParseTuple(args, "O|z:unicode_internal_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 &obj, &errors))
235 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000236
Marc-André Lemburg29273c82003-02-04 19:35:03 +0000237 if (PyUnicode_Check(obj)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 Py_INCREF(obj);
239 return codec_tuple(obj, PyUnicode_GET_SIZE(obj));
Marc-André Lemburg29273c82003-02-04 19:35:03 +0000240 }
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000241 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
243 return NULL;
Walter Dörwalda47d1c02005-08-30 10:23:14 +0000244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000245 return codec_tuple(_PyUnicode_DecodeUnicodeInternal(data, size, errors),
246 size);
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000247 }
Guido van Rossume2d67f92000-03-10 23:09:23 +0000248}
249
250static PyObject *
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000251utf_7_decode(PyObject *self,
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000252 PyObject *args)
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000253{
Antoine Pitroud1188562010-06-09 16:38:55 +0000254 Py_buffer pbuf;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000255 const char *errors = NULL;
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000256 int final = 0;
257 Py_ssize_t consumed;
258 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000259
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000260 if (!PyArg_ParseTuple(args, "y*|zi:utf_7_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 &pbuf, &errors, &final))
262 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000263 consumed = pbuf.len;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000264
Martin v. Löwis423be952008-08-13 15:53:07 +0000265 decoded = PyUnicode_DecodeUTF7Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000267 PyBuffer_Release(&pbuf);
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000268 if (decoded == NULL)
269 return NULL;
270 return codec_tuple(decoded, consumed);
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000271}
272
273static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000274utf_8_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000276{
Antoine Pitroud1188562010-06-09 16:38:55 +0000277 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000278 const char *errors = NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000279 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000280 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000281 PyObject *decoded = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000282
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000283 if (!PyArg_ParseTuple(args, "y*|zi:utf_8_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 &pbuf, &errors, &final))
285 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000286 consumed = pbuf.len;
287
288 decoded = PyUnicode_DecodeUTF8Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000290 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000291 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000293 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000294}
295
296static PyObject *
297utf_16_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000299{
Antoine Pitroud1188562010-06-09 16:38:55 +0000300 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000301 const char *errors = NULL;
302 int byteorder = 0;
Walter Dörwald69652032004-09-07 20:24:22 +0000303 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000304 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000305 PyObject *decoded;
306
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000307 if (!PyArg_ParseTuple(args, "y*|zi:utf_16_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 &pbuf, &errors, &final))
309 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000310 consumed = pbuf.len; /* This is overwritten unless final is true. */
311 decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000313 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000314 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000316 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000317}
318
319static PyObject *
320utf_16_le_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000322{
Antoine Pitroud1188562010-06-09 16:38:55 +0000323 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000324 const char *errors = NULL;
325 int byteorder = -1;
Walter Dörwald69652032004-09-07 20:24:22 +0000326 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000327 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000328 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000329
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000330 if (!PyArg_ParseTuple(args, "y*|zi:utf_16_le_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 &pbuf, &errors, &final))
332 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000333
Martin v. Löwis423be952008-08-13 15:53:07 +0000334 consumed = pbuf.len; /* This is overwritten unless final is true. */
335 decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000337 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000338 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000340 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000341}
342
343static PyObject *
344utf_16_be_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000346{
Antoine Pitroud1188562010-06-09 16:38:55 +0000347 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000348 const char *errors = NULL;
349 int byteorder = 1;
Walter Dörwald69652032004-09-07 20:24:22 +0000350 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000351 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000352 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000353
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000354 if (!PyArg_ParseTuple(args, "y*|zi:utf_16_be_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 &pbuf, &errors, &final))
356 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000357
358 consumed = pbuf.len; /* This is overwritten unless final is true. */
359 decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000361 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000362 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000364 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000365}
366
367/* This non-standard version also provides access to the byteorder
368 parameter of the builtin UTF-16 codec.
369
370 It returns a tuple (unicode, bytesread, byteorder) with byteorder
371 being the value in effect at the end of data.
372
373*/
374
375static PyObject *
376utf_16_ex_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000378{
Antoine Pitroud1188562010-06-09 16:38:55 +0000379 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000380 const char *errors = NULL;
381 int byteorder = 0;
382 PyObject *unicode, *tuple;
Walter Dörwald69652032004-09-07 20:24:22 +0000383 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000384 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000385
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000386 if (!PyArg_ParseTuple(args, "y*|zii:utf_16_ex_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387 &pbuf, &errors, &byteorder, &final))
388 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000389 consumed = pbuf.len; /* This is overwritten unless final is true. */
390 unicode = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000392 PyBuffer_Release(&pbuf);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000393 if (unicode == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000395 tuple = Py_BuildValue("Oni", unicode, consumed, byteorder);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000396 Py_DECREF(unicode);
397 return tuple;
398}
399
400static PyObject *
Walter Dörwald41980ca2007-08-16 21:55:45 +0000401utf_32_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000403{
Antoine Pitroud1188562010-06-09 16:38:55 +0000404 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000405 const char *errors = NULL;
406 int byteorder = 0;
407 int final = 0;
408 Py_ssize_t consumed;
409 PyObject *decoded;
410
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000411 if (!PyArg_ParseTuple(args, "y*|zi:utf_32_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 &pbuf, &errors, &final))
413 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000414 consumed = pbuf.len; /* This is overwritten unless final is true. */
415 decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000417 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000418 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000420 return codec_tuple(decoded, consumed);
421}
422
423static PyObject *
424utf_32_le_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000426{
Antoine Pitroud1188562010-06-09 16:38:55 +0000427 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000428 const char *errors = NULL;
429 int byteorder = -1;
430 int final = 0;
431 Py_ssize_t consumed;
Martin v. Löwis423be952008-08-13 15:53:07 +0000432 PyObject *decoded;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000433
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000434 if (!PyArg_ParseTuple(args, "y*|zi:utf_32_le_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 &pbuf, &errors, &final))
436 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000437 consumed = pbuf.len; /* This is overwritten unless final is true. */
438 decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000440 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000441 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000443 return codec_tuple(decoded, consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000444}
445
446static PyObject *
447utf_32_be_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000449{
Antoine Pitroud1188562010-06-09 16:38:55 +0000450 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000451 const char *errors = NULL;
452 int byteorder = 1;
453 int final = 0;
454 Py_ssize_t consumed;
Martin v. Löwis423be952008-08-13 15:53:07 +0000455 PyObject *decoded;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000456
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000457 if (!PyArg_ParseTuple(args, "y*|zi:utf_32_be_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 &pbuf, &errors, &final))
459 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000460 consumed = pbuf.len; /* This is overwritten unless final is true. */
461 decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000463 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000464 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000466 return codec_tuple(decoded, consumed);
467}
468
469/* This non-standard version also provides access to the byteorder
470 parameter of the builtin UTF-32 codec.
471
472 It returns a tuple (unicode, bytesread, byteorder) with byteorder
473 being the value in effect at the end of data.
474
475*/
476
477static PyObject *
478utf_32_ex_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000480{
Antoine Pitroud1188562010-06-09 16:38:55 +0000481 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000482 const char *errors = NULL;
483 int byteorder = 0;
484 PyObject *unicode, *tuple;
485 int final = 0;
486 Py_ssize_t consumed;
487
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000488 if (!PyArg_ParseTuple(args, "y*|zii:utf_32_ex_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 &pbuf, &errors, &byteorder, &final))
490 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000491 consumed = pbuf.len; /* This is overwritten unless final is true. */
492 unicode = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000494 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000495 if (unicode == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000497 tuple = Py_BuildValue("Oni", unicode, consumed, byteorder);
498 Py_DECREF(unicode);
499 return tuple;
500}
501
502static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000503unicode_escape_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000505{
Antoine Pitroud1188562010-06-09 16:38:55 +0000506 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000507 const char *errors = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 PyObject *unicode;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000509
Martin v. Löwis423be952008-08-13 15:53:07 +0000510 if (!PyArg_ParseTuple(args, "s*|z:unicode_escape_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 &pbuf, &errors))
512 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000513
Antoine Pitroud1188562010-06-09 16:38:55 +0000514 unicode = PyUnicode_DecodeUnicodeEscape(pbuf.buf, pbuf.len, errors);
515 PyBuffer_Release(&pbuf);
516 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000517}
518
519static PyObject *
520raw_unicode_escape_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000522{
Antoine Pitroud1188562010-06-09 16:38:55 +0000523 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000524 const char *errors = NULL;
Antoine Pitroud1188562010-06-09 16:38:55 +0000525 PyObject *unicode;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000526
Martin v. Löwis423be952008-08-13 15:53:07 +0000527 if (!PyArg_ParseTuple(args, "s*|z:raw_unicode_escape_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 &pbuf, &errors))
529 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000530
Antoine Pitroud1188562010-06-09 16:38:55 +0000531 unicode = PyUnicode_DecodeRawUnicodeEscape(pbuf.buf, pbuf.len, errors);
532 PyBuffer_Release(&pbuf);
533 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000534}
535
536static PyObject *
537latin_1_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000539{
Antoine Pitroud1188562010-06-09 16:38:55 +0000540 Py_buffer pbuf;
541 PyObject *unicode;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000542 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000543
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000544 if (!PyArg_ParseTuple(args, "y*|z:latin_1_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 &pbuf, &errors))
546 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000547
Antoine Pitroud1188562010-06-09 16:38:55 +0000548 unicode = PyUnicode_DecodeLatin1(pbuf.buf, pbuf.len, errors);
549 PyBuffer_Release(&pbuf);
550 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000551}
552
553static PyObject *
554ascii_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000556{
Antoine Pitroud1188562010-06-09 16:38:55 +0000557 Py_buffer pbuf;
558 PyObject *unicode;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000559 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000560
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000561 if (!PyArg_ParseTuple(args, "y*|z:ascii_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 &pbuf, &errors))
563 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000564
Antoine Pitroud1188562010-06-09 16:38:55 +0000565 unicode = PyUnicode_DecodeASCII(pbuf.buf, pbuf.len, errors);
566 PyBuffer_Release(&pbuf);
567 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000568}
569
570static PyObject *
571charmap_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000573{
Antoine Pitroud1188562010-06-09 16:38:55 +0000574 Py_buffer pbuf;
575 PyObject *unicode;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000576 const char *errors = NULL;
577 PyObject *mapping = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000578
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000579 if (!PyArg_ParseTuple(args, "y*|zO:charmap_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 &pbuf, &errors, &mapping))
581 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000582 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000584
Antoine Pitroud1188562010-06-09 16:38:55 +0000585 unicode = PyUnicode_DecodeCharmap(pbuf.buf, pbuf.len, mapping, errors);
586 PyBuffer_Release(&pbuf);
587 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000588}
589
Victor Stinner99b95382011-07-04 14:23:54 +0200590#ifdef HAVE_MBCS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000591
592static PyObject *
593mbcs_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 PyObject *args)
Guido van Rossum24bdb042000-03-28 20:29:59 +0000595{
Antoine Pitroud1188562010-06-09 16:38:55 +0000596 Py_buffer pbuf;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000597 const char *errors = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000598 int final = 0;
Martin v. Löwis423be952008-08-13 15:53:07 +0000599 Py_ssize_t consumed;
600 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000601
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000602 if (!PyArg_ParseTuple(args, "y*|zi:mbcs_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 &pbuf, &errors, &final))
604 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000605 consumed = pbuf.len;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000606
Martin v. Löwis423be952008-08-13 15:53:07 +0000607 decoded = PyUnicode_DecodeMBCSStateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000609 PyBuffer_Release(&pbuf);
Martin v. Löwis423be952008-08-13 15:53:07 +0000610 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000612 return codec_tuple(decoded, consumed);
Guido van Rossum24bdb042000-03-28 20:29:59 +0000613}
614
Victor Stinner99b95382011-07-04 14:23:54 +0200615#endif /* HAVE_MBCS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000616
Guido van Rossume2d67f92000-03-10 23:09:23 +0000617/* --- Encoder ------------------------------------------------------------ */
618
619static PyObject *
620readbuffer_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000622{
Martin v. Löwis423be952008-08-13 15:53:07 +0000623 Py_buffer pdata;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000624 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000625 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000626 const char *errors = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000627 PyObject *result;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000628
Martin v. Löwis423be952008-08-13 15:53:07 +0000629 if (!PyArg_ParseTuple(args, "s*|z:readbuffer_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000630 &pdata, &errors))
631 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000632 data = pdata.buf;
633 size = pdata.len;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000634
Martin v. Löwis423be952008-08-13 15:53:07 +0000635 result = PyBytes_FromStringAndSize(data, size);
636 PyBuffer_Release(&pdata);
637 return codec_tuple(result, size);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000638}
639
640static PyObject *
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000641unicode_internal_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 PyObject *args)
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000643{
644 PyObject *obj;
645 const char *errors = NULL;
646 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000647 Py_ssize_t size;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000648
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000649 if (!PyArg_ParseTuple(args, "O|z:unicode_internal_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 &obj, &errors))
651 return NULL;
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000652
653 if (PyUnicode_Check(obj)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 data = PyUnicode_AS_DATA(obj);
655 size = PyUnicode_GET_DATA_SIZE(obj);
656 return codec_tuple(PyBytes_FromStringAndSize(data, size),
657 PyUnicode_GET_SIZE(obj));
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000658 }
659 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
661 return NULL;
662 return codec_tuple(PyBytes_FromStringAndSize(data, size), size);
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000663 }
664}
665
666static PyObject *
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000667utf_7_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 PyObject *args)
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000669{
670 PyObject *str, *v;
671 const char *errors = NULL;
672
673 if (!PyArg_ParseTuple(args, "O|z:utf_7_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 &str, &errors))
675 return NULL;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000676
677 str = PyUnicode_FromObject(str);
678 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 return NULL;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000680 v = codec_tuple(PyUnicode_EncodeUTF7(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 PyUnicode_GET_SIZE(str),
682 0,
683 0,
684 errors),
685 PyUnicode_GET_SIZE(str));
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000686 Py_DECREF(str);
687 return v;
688}
689
690static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000691utf_8_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000693{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000694 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000695 const char *errors = NULL;
696
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000697 if (!PyArg_ParseTuple(args, "O|z:utf_8_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 &str, &errors))
699 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000700
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000701 str = PyUnicode_FromObject(str);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200702 if (str == NULL || PyUnicode_READY(str) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200704 v = codec_tuple(PyUnicode_AsEncodedString(str, "utf-8", errors),
705 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000706 Py_DECREF(str);
707 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000708}
709
710/* This version provides access to the byteorder parameter of the
711 builtin UTF-16 codecs as optional third argument. It defaults to 0
712 which means: use the native byte order and prepend the data with a
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000713 BOM mark.
Guido van Rossume2d67f92000-03-10 23:09:23 +0000714
715*/
716
717static PyObject *
718utf_16_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000720{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000721 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000722 const char *errors = NULL;
723 int byteorder = 0;
724
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000725 if (!PyArg_ParseTuple(args, "O|zi:utf_16_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 &str, &errors, &byteorder))
727 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000728
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000729 str = PyUnicode_FromObject(str);
730 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000732 v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 PyUnicode_GET_SIZE(str),
734 errors,
735 byteorder),
736 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000737 Py_DECREF(str);
738 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000739}
740
741static PyObject *
742utf_16_le_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000744{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000745 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000746 const char *errors = NULL;
747
Marc-André Lemburg4157dd52001-06-17 18:32:36 +0000748 if (!PyArg_ParseTuple(args, "O|z:utf_16_le_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 &str, &errors))
750 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000751
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000752 str = PyUnicode_FromObject(str);
753 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000755 v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 PyUnicode_GET_SIZE(str),
757 errors,
758 -1),
759 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000760 Py_DECREF(str);
761 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000762}
763
764static PyObject *
765utf_16_be_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000767{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000768 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000769 const char *errors = NULL;
770
Marc-André Lemburg4157dd52001-06-17 18:32:36 +0000771 if (!PyArg_ParseTuple(args, "O|z:utf_16_be_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 &str, &errors))
773 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000774
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000775 str = PyUnicode_FromObject(str);
776 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000777 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000778 v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 PyUnicode_GET_SIZE(str),
780 errors,
781 +1),
782 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000783 Py_DECREF(str);
784 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000785}
786
Walter Dörwald41980ca2007-08-16 21:55:45 +0000787/* This version provides access to the byteorder parameter of the
788 builtin UTF-32 codecs as optional third argument. It defaults to 0
789 which means: use the native byte order and prepend the data with a
790 BOM mark.
791
792*/
793
794static PyObject *
795utf_32_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000797{
798 PyObject *str, *v;
799 const char *errors = NULL;
800 int byteorder = 0;
801
802 if (!PyArg_ParseTuple(args, "O|zi:utf_32_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 &str, &errors, &byteorder))
804 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000805
806 str = PyUnicode_FromObject(str);
807 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000809 v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 PyUnicode_GET_SIZE(str),
811 errors,
812 byteorder),
813 PyUnicode_GET_SIZE(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000814 Py_DECREF(str);
815 return v;
816}
817
818static PyObject *
819utf_32_le_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000821{
822 PyObject *str, *v;
823 const char *errors = NULL;
824
825 if (!PyArg_ParseTuple(args, "O|z:utf_32_le_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 &str, &errors))
827 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000828
829 str = PyUnicode_FromObject(str);
830 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000832 v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 PyUnicode_GET_SIZE(str),
834 errors,
835 -1),
836 PyUnicode_GET_SIZE(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000837 Py_DECREF(str);
838 return v;
839}
840
841static PyObject *
842utf_32_be_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000844{
845 PyObject *str, *v;
846 const char *errors = NULL;
847
848 if (!PyArg_ParseTuple(args, "O|z:utf_32_be_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 &str, &errors))
850 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000851
852 str = PyUnicode_FromObject(str);
853 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000855 v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 PyUnicode_GET_SIZE(str),
857 errors,
858 +1),
859 PyUnicode_GET_SIZE(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000860 Py_DECREF(str);
861 return v;
862}
863
Guido van Rossume2d67f92000-03-10 23:09:23 +0000864static PyObject *
865unicode_escape_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000867{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000868 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000869 const char *errors = NULL;
870
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000871 if (!PyArg_ParseTuple(args, "O|z:unicode_escape_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 &str, &errors))
873 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000874
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000875 str = PyUnicode_FromObject(str);
876 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 return NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000878 v = codec_tuple(PyUnicode_EncodeUnicodeEscape(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 PyUnicode_GET_SIZE(str)),
880 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000881 Py_DECREF(str);
882 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000883}
884
885static PyObject *
886raw_unicode_escape_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000888{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000889 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000890 const char *errors = NULL;
891
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000892 if (!PyArg_ParseTuple(args, "O|z:raw_unicode_escape_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 &str, &errors))
894 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000895
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000896 str = PyUnicode_FromObject(str);
897 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000899 v = codec_tuple(PyUnicode_EncodeRawUnicodeEscape(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 PyUnicode_AS_UNICODE(str),
901 PyUnicode_GET_SIZE(str)),
902 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000903 Py_DECREF(str);
904 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000905}
906
907static PyObject *
908latin_1_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000910{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000911 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000912 const char *errors = NULL;
913
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000914 if (!PyArg_ParseTuple(args, "O|z:latin_1_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 &str, &errors))
916 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000917
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000918 str = PyUnicode_FromObject(str);
919 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000921 v = codec_tuple(PyUnicode_EncodeLatin1(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 PyUnicode_AS_UNICODE(str),
923 PyUnicode_GET_SIZE(str),
924 errors),
925 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000926 Py_DECREF(str);
927 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000928}
929
930static PyObject *
931ascii_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000933{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000934 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000935 const char *errors = NULL;
936
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000937 if (!PyArg_ParseTuple(args, "O|z:ascii_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 &str, &errors))
939 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000940
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000941 str = PyUnicode_FromObject(str);
942 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000944 v = codec_tuple(PyUnicode_EncodeASCII(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 PyUnicode_AS_UNICODE(str),
946 PyUnicode_GET_SIZE(str),
947 errors),
948 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000949 Py_DECREF(str);
950 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000951}
952
953static PyObject *
954charmap_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000956{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000957 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000958 const char *errors = NULL;
959 PyObject *mapping = NULL;
960
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000961 if (!PyArg_ParseTuple(args, "O|zO:charmap_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 &str, &errors, &mapping))
963 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000964 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000966
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000967 str = PyUnicode_FromObject(str);
968 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000970 v = codec_tuple(PyUnicode_EncodeCharmap(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 PyUnicode_AS_UNICODE(str),
972 PyUnicode_GET_SIZE(str),
973 mapping,
974 errors),
975 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000976 Py_DECREF(str);
977 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000978}
979
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000980static PyObject*
981charmap_build(PyObject *self, PyObject *args)
982{
983 PyObject *map;
984 if (!PyArg_ParseTuple(args, "U:charmap_build", &map))
985 return NULL;
986 return PyUnicode_BuildEncodingMap(map);
987}
988
Victor Stinner99b95382011-07-04 14:23:54 +0200989#ifdef HAVE_MBCS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000990
991static PyObject *
992mbcs_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 PyObject *args)
Guido van Rossum24bdb042000-03-28 20:29:59 +0000994{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000995 PyObject *str, *v;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000996 const char *errors = NULL;
997
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000998 if (!PyArg_ParseTuple(args, "O|z:mbcs_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 &str, &errors))
1000 return NULL;
Guido van Rossum24bdb042000-03-28 20:29:59 +00001001
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +00001002 str = PyUnicode_FromObject(str);
1003 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +00001005 v = codec_tuple(PyUnicode_EncodeMBCS(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001006 PyUnicode_AS_UNICODE(str),
1007 PyUnicode_GET_SIZE(str),
1008 errors),
1009 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +00001010 Py_DECREF(str);
1011 return v;
Guido van Rossum24bdb042000-03-28 20:29:59 +00001012}
1013
Victor Stinner99b95382011-07-04 14:23:54 +02001014#endif /* HAVE_MBCS */
Guido van Rossum24bdb042000-03-28 20:29:59 +00001015
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001016/* --- Error handler registry --------------------------------------------- */
1017
Walter Dörwald0ae29812002-10-31 13:36:29 +00001018PyDoc_STRVAR(register_error__doc__,
1019"register_error(errors, handler)\n\
1020\n\
1021Register the specified error handler under the name\n\
1022errors. handler must be a callable object, that\n\
1023will be called with an exception instance containing\n\
1024information about the location of the encoding/decoding\n\
1025error and must return a (replacement, new position) tuple.");
1026
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001027static PyObject *register_error(PyObject *self, PyObject *args)
1028{
1029 const char *name;
1030 PyObject *handler;
1031
1032 if (!PyArg_ParseTuple(args, "sO:register_error",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 &name, &handler))
1034 return NULL;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001035 if (PyCodec_RegisterError(name, handler))
1036 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001037 Py_RETURN_NONE;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001038}
1039
Walter Dörwald0ae29812002-10-31 13:36:29 +00001040PyDoc_STRVAR(lookup_error__doc__,
1041"lookup_error(errors) -> handler\n\
1042\n\
1043Return the error handler for the specified error handling name\n\
1044or raise a LookupError, if no handler exists under this name.");
1045
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001046static PyObject *lookup_error(PyObject *self, PyObject *args)
1047{
1048 const char *name;
1049
1050 if (!PyArg_ParseTuple(args, "s:lookup_error",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 &name))
1052 return NULL;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001053 return PyCodec_LookupError(name);
1054}
1055
Guido van Rossume2d67f92000-03-10 23:09:23 +00001056/* --- Module API --------------------------------------------------------- */
1057
1058static PyMethodDef _codecs_functions[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 {"register", codec_register, METH_O,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001060 register__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 {"lookup", codec_lookup, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001062 lookup__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 {"encode", codec_encode, METH_VARARGS,
1064 encode__doc__},
1065 {"decode", codec_decode, METH_VARARGS,
1066 decode__doc__},
1067 {"escape_encode", escape_encode, METH_VARARGS},
1068 {"escape_decode", escape_decode, METH_VARARGS},
1069 {"utf_8_encode", utf_8_encode, METH_VARARGS},
1070 {"utf_8_decode", utf_8_decode, METH_VARARGS},
1071 {"utf_7_encode", utf_7_encode, METH_VARARGS},
1072 {"utf_7_decode", utf_7_decode, METH_VARARGS},
1073 {"utf_16_encode", utf_16_encode, METH_VARARGS},
1074 {"utf_16_le_encode", utf_16_le_encode, METH_VARARGS},
1075 {"utf_16_be_encode", utf_16_be_encode, METH_VARARGS},
1076 {"utf_16_decode", utf_16_decode, METH_VARARGS},
1077 {"utf_16_le_decode", utf_16_le_decode, METH_VARARGS},
1078 {"utf_16_be_decode", utf_16_be_decode, METH_VARARGS},
1079 {"utf_16_ex_decode", utf_16_ex_decode, METH_VARARGS},
1080 {"utf_32_encode", utf_32_encode, METH_VARARGS},
1081 {"utf_32_le_encode", utf_32_le_encode, METH_VARARGS},
1082 {"utf_32_be_encode", utf_32_be_encode, METH_VARARGS},
1083 {"utf_32_decode", utf_32_decode, METH_VARARGS},
1084 {"utf_32_le_decode", utf_32_le_decode, METH_VARARGS},
1085 {"utf_32_be_decode", utf_32_be_decode, METH_VARARGS},
1086 {"utf_32_ex_decode", utf_32_ex_decode, METH_VARARGS},
1087 {"unicode_escape_encode", unicode_escape_encode, METH_VARARGS},
1088 {"unicode_escape_decode", unicode_escape_decode, METH_VARARGS},
1089 {"unicode_internal_encode", unicode_internal_encode, METH_VARARGS},
1090 {"unicode_internal_decode", unicode_internal_decode, METH_VARARGS},
1091 {"raw_unicode_escape_encode", raw_unicode_escape_encode, METH_VARARGS},
1092 {"raw_unicode_escape_decode", raw_unicode_escape_decode, METH_VARARGS},
1093 {"latin_1_encode", latin_1_encode, METH_VARARGS},
1094 {"latin_1_decode", latin_1_decode, METH_VARARGS},
1095 {"ascii_encode", ascii_encode, METH_VARARGS},
1096 {"ascii_decode", ascii_decode, METH_VARARGS},
1097 {"charmap_encode", charmap_encode, METH_VARARGS},
1098 {"charmap_decode", charmap_decode, METH_VARARGS},
1099 {"charmap_build", charmap_build, METH_VARARGS},
1100 {"readbuffer_encode", readbuffer_encode, METH_VARARGS},
Victor Stinner99b95382011-07-04 14:23:54 +02001101#ifdef HAVE_MBCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 {"mbcs_encode", mbcs_encode, METH_VARARGS},
1103 {"mbcs_decode", mbcs_decode, METH_VARARGS},
Guido van Rossum24bdb042000-03-28 20:29:59 +00001104#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 {"register_error", register_error, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001106 register_error__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 {"lookup_error", lookup_error, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001108 lookup_error__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 {NULL, NULL} /* sentinel */
Guido van Rossume2d67f92000-03-10 23:09:23 +00001110};
1111
Martin v. Löwis1a214512008-06-11 05:26:20 +00001112static struct PyModuleDef codecsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 PyModuleDef_HEAD_INIT,
1114 "_codecs",
1115 NULL,
1116 -1,
1117 _codecs_functions,
1118 NULL,
1119 NULL,
1120 NULL,
1121 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001122};
1123
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001124PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001125PyInit__codecs(void)
Guido van Rossume2d67f92000-03-10 23:09:23 +00001126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 return PyModule_Create(&codecsmodule);
Guido van Rossume2d67f92000-03-10 23:09:23 +00001128}