blob: 61e5516f0cbf010ea6b35b292edf16cf95ce1bd4 [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)) {
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100238 if (PyUnicode_READY(obj) < 0)
239 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 Py_INCREF(obj);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100241 return codec_tuple(obj, PyUnicode_GET_LENGTH(obj));
Marc-André Lemburg29273c82003-02-04 19:35:03 +0000242 }
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000243 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
245 return NULL;
Walter Dörwalda47d1c02005-08-30 10:23:14 +0000246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 return codec_tuple(_PyUnicode_DecodeUnicodeInternal(data, size, errors),
248 size);
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000249 }
Guido van Rossume2d67f92000-03-10 23:09:23 +0000250}
251
252static PyObject *
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000253utf_7_decode(PyObject *self,
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000254 PyObject *args)
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000255{
Antoine Pitroud1188562010-06-09 16:38:55 +0000256 Py_buffer pbuf;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000257 const char *errors = NULL;
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000258 int final = 0;
259 Py_ssize_t consumed;
260 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000261
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000262 if (!PyArg_ParseTuple(args, "y*|zi:utf_7_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 &pbuf, &errors, &final))
264 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000265 consumed = pbuf.len;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000266
Martin v. Löwis423be952008-08-13 15:53:07 +0000267 decoded = PyUnicode_DecodeUTF7Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000269 PyBuffer_Release(&pbuf);
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000270 if (decoded == NULL)
271 return NULL;
272 return codec_tuple(decoded, consumed);
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000273}
274
275static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000276utf_8_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000278{
Antoine Pitroud1188562010-06-09 16:38:55 +0000279 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000280 const char *errors = NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000281 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000282 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000283 PyObject *decoded = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000284
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000285 if (!PyArg_ParseTuple(args, "y*|zi:utf_8_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000286 &pbuf, &errors, &final))
287 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000288 consumed = pbuf.len;
289
290 decoded = PyUnicode_DecodeUTF8Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000292 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000293 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000295 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000296}
297
298static PyObject *
299utf_16_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000300 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000301{
Antoine Pitroud1188562010-06-09 16:38:55 +0000302 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000303 const char *errors = NULL;
304 int byteorder = 0;
Walter Dörwald69652032004-09-07 20:24:22 +0000305 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000306 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000307 PyObject *decoded;
308
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000309 if (!PyArg_ParseTuple(args, "y*|zi:utf_16_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 &pbuf, &errors, &final))
311 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000312 consumed = pbuf.len; /* This is overwritten unless final is true. */
313 decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000315 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000316 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000318 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000319}
320
321static PyObject *
322utf_16_le_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000323 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000324{
Antoine Pitroud1188562010-06-09 16:38:55 +0000325 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000326 const char *errors = NULL;
327 int byteorder = -1;
Walter Dörwald69652032004-09-07 20:24:22 +0000328 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000329 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000330 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000331
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000332 if (!PyArg_ParseTuple(args, "y*|zi:utf_16_le_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000333 &pbuf, &errors, &final))
334 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000335
Martin v. Löwis423be952008-08-13 15:53:07 +0000336 consumed = pbuf.len; /* This is overwritten unless final is true. */
337 decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000339 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000340 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000342 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000343}
344
345static PyObject *
346utf_16_be_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000348{
Antoine Pitroud1188562010-06-09 16:38:55 +0000349 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000350 const char *errors = NULL;
351 int byteorder = 1;
Walter Dörwald69652032004-09-07 20:24:22 +0000352 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000353 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000354 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000355
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000356 if (!PyArg_ParseTuple(args, "y*|zi:utf_16_be_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 &pbuf, &errors, &final))
358 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000359
360 consumed = pbuf.len; /* This is overwritten unless final is true. */
361 decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000362 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000363 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000364 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000366 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000367}
368
369/* This non-standard version also provides access to the byteorder
370 parameter of the builtin UTF-16 codec.
371
372 It returns a tuple (unicode, bytesread, byteorder) with byteorder
373 being the value in effect at the end of data.
374
375*/
376
377static PyObject *
378utf_16_ex_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000380{
Antoine Pitroud1188562010-06-09 16:38:55 +0000381 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000382 const char *errors = NULL;
383 int byteorder = 0;
384 PyObject *unicode, *tuple;
Walter Dörwald69652032004-09-07 20:24:22 +0000385 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000386 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000387
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000388 if (!PyArg_ParseTuple(args, "y*|zii:utf_16_ex_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 &pbuf, &errors, &byteorder, &final))
390 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000391 consumed = pbuf.len; /* This is overwritten unless final is true. */
392 unicode = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000394 PyBuffer_Release(&pbuf);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000395 if (unicode == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000397 tuple = Py_BuildValue("Oni", unicode, consumed, byteorder);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000398 Py_DECREF(unicode);
399 return tuple;
400}
401
402static PyObject *
Walter Dörwald41980ca2007-08-16 21:55:45 +0000403utf_32_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000405{
Antoine Pitroud1188562010-06-09 16:38:55 +0000406 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000407 const char *errors = NULL;
408 int byteorder = 0;
409 int final = 0;
410 Py_ssize_t consumed;
411 PyObject *decoded;
412
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000413 if (!PyArg_ParseTuple(args, "y*|zi:utf_32_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 &pbuf, &errors, &final))
415 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000416 consumed = pbuf.len; /* This is overwritten unless final is true. */
417 decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000419 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000420 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000422 return codec_tuple(decoded, consumed);
423}
424
425static PyObject *
426utf_32_le_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000428{
Antoine Pitroud1188562010-06-09 16:38:55 +0000429 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000430 const char *errors = NULL;
431 int byteorder = -1;
432 int final = 0;
433 Py_ssize_t consumed;
Martin v. Löwis423be952008-08-13 15:53:07 +0000434 PyObject *decoded;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000435
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000436 if (!PyArg_ParseTuple(args, "y*|zi:utf_32_le_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 &pbuf, &errors, &final))
438 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000439 consumed = pbuf.len; /* This is overwritten unless final is true. */
440 decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000442 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000443 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000444 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000445 return codec_tuple(decoded, consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000446}
447
448static PyObject *
449utf_32_be_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000450 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000451{
Antoine Pitroud1188562010-06-09 16:38:55 +0000452 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000453 const char *errors = NULL;
454 int byteorder = 1;
455 int final = 0;
456 Py_ssize_t consumed;
Martin v. Löwis423be952008-08-13 15:53:07 +0000457 PyObject *decoded;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000458
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000459 if (!PyArg_ParseTuple(args, "y*|zi:utf_32_be_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 &pbuf, &errors, &final))
461 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000462 consumed = pbuf.len; /* This is overwritten unless final is true. */
463 decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000465 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000466 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000468 return codec_tuple(decoded, consumed);
469}
470
471/* This non-standard version also provides access to the byteorder
472 parameter of the builtin UTF-32 codec.
473
474 It returns a tuple (unicode, bytesread, byteorder) with byteorder
475 being the value in effect at the end of data.
476
477*/
478
479static PyObject *
480utf_32_ex_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000482{
Antoine Pitroud1188562010-06-09 16:38:55 +0000483 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000484 const char *errors = NULL;
485 int byteorder = 0;
486 PyObject *unicode, *tuple;
487 int final = 0;
488 Py_ssize_t consumed;
489
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000490 if (!PyArg_ParseTuple(args, "y*|zii:utf_32_ex_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 &pbuf, &errors, &byteorder, &final))
492 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000493 consumed = pbuf.len; /* This is overwritten unless final is true. */
494 unicode = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000496 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000497 if (unicode == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000499 tuple = Py_BuildValue("Oni", unicode, consumed, byteorder);
500 Py_DECREF(unicode);
501 return tuple;
502}
503
504static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000505unicode_escape_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000507{
Antoine Pitroud1188562010-06-09 16:38:55 +0000508 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000509 const char *errors = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 PyObject *unicode;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000511
Martin v. Löwis423be952008-08-13 15:53:07 +0000512 if (!PyArg_ParseTuple(args, "s*|z:unicode_escape_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 &pbuf, &errors))
514 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000515
Antoine Pitroud1188562010-06-09 16:38:55 +0000516 unicode = PyUnicode_DecodeUnicodeEscape(pbuf.buf, pbuf.len, errors);
517 PyBuffer_Release(&pbuf);
518 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000519}
520
521static PyObject *
522raw_unicode_escape_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000524{
Antoine Pitroud1188562010-06-09 16:38:55 +0000525 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000526 const char *errors = NULL;
Antoine Pitroud1188562010-06-09 16:38:55 +0000527 PyObject *unicode;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000528
Martin v. Löwis423be952008-08-13 15:53:07 +0000529 if (!PyArg_ParseTuple(args, "s*|z:raw_unicode_escape_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 &pbuf, &errors))
531 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000532
Antoine Pitroud1188562010-06-09 16:38:55 +0000533 unicode = PyUnicode_DecodeRawUnicodeEscape(pbuf.buf, pbuf.len, errors);
534 PyBuffer_Release(&pbuf);
535 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000536}
537
538static PyObject *
539latin_1_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000541{
Antoine Pitroud1188562010-06-09 16:38:55 +0000542 Py_buffer pbuf;
543 PyObject *unicode;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000544 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000545
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000546 if (!PyArg_ParseTuple(args, "y*|z:latin_1_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 &pbuf, &errors))
548 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000549
Antoine Pitroud1188562010-06-09 16:38:55 +0000550 unicode = PyUnicode_DecodeLatin1(pbuf.buf, pbuf.len, errors);
551 PyBuffer_Release(&pbuf);
552 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000553}
554
555static PyObject *
556ascii_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000558{
Antoine Pitroud1188562010-06-09 16:38:55 +0000559 Py_buffer pbuf;
560 PyObject *unicode;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000561 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000562
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000563 if (!PyArg_ParseTuple(args, "y*|z:ascii_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 &pbuf, &errors))
565 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000566
Antoine Pitroud1188562010-06-09 16:38:55 +0000567 unicode = PyUnicode_DecodeASCII(pbuf.buf, pbuf.len, errors);
568 PyBuffer_Release(&pbuf);
569 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000570}
571
572static PyObject *
573charmap_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000575{
Antoine Pitroud1188562010-06-09 16:38:55 +0000576 Py_buffer pbuf;
577 PyObject *unicode;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000578 const char *errors = NULL;
579 PyObject *mapping = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000580
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000581 if (!PyArg_ParseTuple(args, "y*|zO:charmap_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 &pbuf, &errors, &mapping))
583 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000584 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000586
Antoine Pitroud1188562010-06-09 16:38:55 +0000587 unicode = PyUnicode_DecodeCharmap(pbuf.buf, pbuf.len, mapping, errors);
588 PyBuffer_Release(&pbuf);
589 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000590}
591
Victor Stinner99b95382011-07-04 14:23:54 +0200592#ifdef HAVE_MBCS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000593
594static PyObject *
595mbcs_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 PyObject *args)
Guido van Rossum24bdb042000-03-28 20:29:59 +0000597{
Antoine Pitroud1188562010-06-09 16:38:55 +0000598 Py_buffer pbuf;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000599 const char *errors = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000600 int final = 0;
Martin v. Löwis423be952008-08-13 15:53:07 +0000601 Py_ssize_t consumed;
602 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000603
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000604 if (!PyArg_ParseTuple(args, "y*|zi:mbcs_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 &pbuf, &errors, &final))
606 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000607 consumed = pbuf.len;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000608
Martin v. Löwis423be952008-08-13 15:53:07 +0000609 decoded = PyUnicode_DecodeMBCSStateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000611 PyBuffer_Release(&pbuf);
Martin v. Löwis423be952008-08-13 15:53:07 +0000612 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000614 return codec_tuple(decoded, consumed);
Guido van Rossum24bdb042000-03-28 20:29:59 +0000615}
616
Victor Stinner3a50e702011-10-18 21:21:00 +0200617static PyObject *
618code_page_decode(PyObject *self,
619 PyObject *args)
620{
621 Py_buffer pbuf;
622 const char *errors = NULL;
623 int final = 0;
624 Py_ssize_t consumed;
625 PyObject *decoded = NULL;
626 int code_page;
627
628 if (!PyArg_ParseTuple(args, "iy*|zi:code_page_decode",
629 &code_page, &pbuf, &errors, &final))
630 return NULL;
631 consumed = pbuf.len;
632
633 decoded = PyUnicode_DecodeCodePageStateful(code_page,
634 pbuf.buf, pbuf.len, errors,
635 final ? NULL : &consumed);
636 PyBuffer_Release(&pbuf);
637 if (decoded == NULL)
638 return NULL;
639 return codec_tuple(decoded, consumed);
640}
641
Victor Stinner99b95382011-07-04 14:23:54 +0200642#endif /* HAVE_MBCS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000643
Guido van Rossume2d67f92000-03-10 23:09:23 +0000644/* --- Encoder ------------------------------------------------------------ */
645
646static PyObject *
647readbuffer_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000649{
Martin v. Löwis423be952008-08-13 15:53:07 +0000650 Py_buffer pdata;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000651 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000652 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000653 const char *errors = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000654 PyObject *result;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000655
Martin v. Löwis423be952008-08-13 15:53:07 +0000656 if (!PyArg_ParseTuple(args, "s*|z:readbuffer_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 &pdata, &errors))
658 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000659 data = pdata.buf;
660 size = pdata.len;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000661
Martin v. Löwis423be952008-08-13 15:53:07 +0000662 result = PyBytes_FromStringAndSize(data, size);
663 PyBuffer_Release(&pdata);
664 return codec_tuple(result, size);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000665}
666
667static PyObject *
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000668unicode_internal_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 PyObject *args)
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000670{
671 PyObject *obj;
672 const char *errors = NULL;
673 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000674 Py_ssize_t size;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000675
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000676 if (!PyArg_ParseTuple(args, "O|z:unicode_internal_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 &obj, &errors))
678 return NULL;
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000679
680 if (PyUnicode_Check(obj)) {
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100681 if (PyUnicode_READY(obj) < 0)
682 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 data = PyUnicode_AS_DATA(obj);
684 size = PyUnicode_GET_DATA_SIZE(obj);
685 return codec_tuple(PyBytes_FromStringAndSize(data, size),
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100686 PyUnicode_GET_LENGTH(obj));
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000687 }
688 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
690 return NULL;
691 return codec_tuple(PyBytes_FromStringAndSize(data, size), size);
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000692 }
693}
694
695static PyObject *
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000696utf_7_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 PyObject *args)
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000698{
699 PyObject *str, *v;
700 const char *errors = NULL;
701
702 if (!PyArg_ParseTuple(args, "O|z:utf_7_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 &str, &errors))
704 return NULL;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000705
706 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100707 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100709 v = codec_tuple(_PyUnicode_EncodeUTF7(str, 0, 0, errors),
710 PyUnicode_GET_LENGTH(str));
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000711 Py_DECREF(str);
712 return v;
713}
714
715static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000716utf_8_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000718{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000719 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000720 const char *errors = NULL;
721
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000722 if (!PyArg_ParseTuple(args, "O|z:utf_8_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 &str, &errors))
724 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000725
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000726 str = PyUnicode_FromObject(str);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200727 if (str == NULL || PyUnicode_READY(str) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200729 v = codec_tuple(PyUnicode_AsEncodedString(str, "utf-8", errors),
730 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000731 Py_DECREF(str);
732 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000733}
734
735/* This version provides access to the byteorder parameter of the
736 builtin UTF-16 codecs as optional third argument. It defaults to 0
737 which means: use the native byte order and prepend the data with a
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000738 BOM mark.
Guido van Rossume2d67f92000-03-10 23:09:23 +0000739
740*/
741
742static PyObject *
743utf_16_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 int byteorder = 0;
749
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000750 if (!PyArg_ParseTuple(args, "O|zi:utf_16_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 &str, &errors, &byteorder))
752 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000753
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000754 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100755 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100757 v = codec_tuple(_PyUnicode_EncodeUTF16(str, errors, byteorder),
758 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000759 Py_DECREF(str);
760 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000761}
762
763static PyObject *
764utf_16_le_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000766{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000767 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000768 const char *errors = NULL;
769
Marc-André Lemburg4157dd52001-06-17 18:32:36 +0000770 if (!PyArg_ParseTuple(args, "O|z:utf_16_le_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 &str, &errors))
772 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000773
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000774 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100775 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100777 v = codec_tuple(_PyUnicode_EncodeUTF16(str, errors, -1),
778 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000779 Py_DECREF(str);
780 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000781}
782
783static PyObject *
784utf_16_be_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000786{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000787 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000788 const char *errors = NULL;
789
Marc-André Lemburg4157dd52001-06-17 18:32:36 +0000790 if (!PyArg_ParseTuple(args, "O|z:utf_16_be_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 &str, &errors))
792 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000793
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000794 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100795 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100797 v = codec_tuple(_PyUnicode_EncodeUTF16(str, errors, +1),
798 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000799 Py_DECREF(str);
800 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000801}
802
Walter Dörwald41980ca2007-08-16 21:55:45 +0000803/* This version provides access to the byteorder parameter of the
804 builtin UTF-32 codecs as optional third argument. It defaults to 0
805 which means: use the native byte order and prepend the data with a
806 BOM mark.
807
808*/
809
810static PyObject *
811utf_32_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000813{
814 PyObject *str, *v;
815 const char *errors = NULL;
816 int byteorder = 0;
817
818 if (!PyArg_ParseTuple(args, "O|zi:utf_32_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 &str, &errors, &byteorder))
820 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000821
822 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100823 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100825 v = codec_tuple(_PyUnicode_EncodeUTF32(str, errors, byteorder),
826 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000827 Py_DECREF(str);
828 return v;
829}
830
831static PyObject *
832utf_32_le_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000834{
835 PyObject *str, *v;
836 const char *errors = NULL;
837
838 if (!PyArg_ParseTuple(args, "O|z:utf_32_le_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 &str, &errors))
840 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000841
842 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100843 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100845 v = codec_tuple(_PyUnicode_EncodeUTF32(str, errors, -1),
846 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000847 Py_DECREF(str);
848 return v;
849}
850
851static PyObject *
852utf_32_be_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000854{
855 PyObject *str, *v;
856 const char *errors = NULL;
857
858 if (!PyArg_ParseTuple(args, "O|z:utf_32_be_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 &str, &errors))
860 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000861
862 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100863 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100865 v = codec_tuple(_PyUnicode_EncodeUTF32(str, errors, +1),
866 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000867 Py_DECREF(str);
868 return v;
869}
870
Guido van Rossume2d67f92000-03-10 23:09:23 +0000871static PyObject *
872unicode_escape_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000874{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000875 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000876 const char *errors = NULL;
877
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000878 if (!PyArg_ParseTuple(args, "O|z:unicode_escape_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 &str, &errors))
880 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000881
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000882 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100883 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100885 v = codec_tuple(PyUnicode_AsUnicodeEscapeString(str),
886 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000887 Py_DECREF(str);
888 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000889}
890
891static PyObject *
892raw_unicode_escape_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000894{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000895 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000896 const char *errors = NULL;
897
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000898 if (!PyArg_ParseTuple(args, "O|z:raw_unicode_escape_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 &str, &errors))
900 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000901
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000902 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100903 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100905 v = codec_tuple(PyUnicode_AsRawUnicodeEscapeString(str),
906 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000907 Py_DECREF(str);
908 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000909}
910
911static PyObject *
912latin_1_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000914{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000915 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000916 const char *errors = NULL;
917
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000918 if (!PyArg_ParseTuple(args, "O|z:latin_1_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 &str, &errors))
920 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000921
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000922 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100923 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100925 v = codec_tuple(_PyUnicode_AsLatin1String(str, errors),
926 PyUnicode_GET_LENGTH(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);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100943 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100945 v = codec_tuple(_PyUnicode_AsASCIIString(str, errors),
946 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000947 Py_DECREF(str);
948 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000949}
950
951static PyObject *
952charmap_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000954{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000955 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000956 const char *errors = NULL;
957 PyObject *mapping = NULL;
958
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000959 if (!PyArg_ParseTuple(args, "O|zO:charmap_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 &str, &errors, &mapping))
961 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000962 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000964
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000965 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100966 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 return NULL;
Martin v. Löwis23e275b2011-11-02 18:02:51 +0100968 v = codec_tuple(_PyUnicode_EncodeCharmap(str, mapping, errors),
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100969 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000970 Py_DECREF(str);
971 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000972}
973
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000974static PyObject*
975charmap_build(PyObject *self, PyObject *args)
976{
977 PyObject *map;
978 if (!PyArg_ParseTuple(args, "U:charmap_build", &map))
979 return NULL;
980 return PyUnicode_BuildEncodingMap(map);
981}
982
Victor Stinner99b95382011-07-04 14:23:54 +0200983#ifdef HAVE_MBCS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000984
985static PyObject *
986mbcs_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 PyObject *args)
Guido van Rossum24bdb042000-03-28 20:29:59 +0000988{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000989 PyObject *str, *v;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000990 const char *errors = NULL;
991
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000992 if (!PyArg_ParseTuple(args, "O|z:mbcs_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 &str, &errors))
994 return NULL;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000995
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000996 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100997 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100999 v = codec_tuple(PyUnicode_EncodeCodePage(CP_ACP, str, errors),
1000 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +00001001 Py_DECREF(str);
1002 return v;
Guido van Rossum24bdb042000-03-28 20:29:59 +00001003}
1004
Victor Stinner3a50e702011-10-18 21:21:00 +02001005static PyObject *
1006code_page_encode(PyObject *self,
1007 PyObject *args)
1008{
1009 PyObject *str, *v;
1010 const char *errors = NULL;
1011 int code_page;
1012
1013 if (!PyArg_ParseTuple(args, "iO|z:code_page_encode",
1014 &code_page, &str, &errors))
1015 return NULL;
1016
1017 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +01001018 if (str == NULL || PyUnicode_READY(str) < 0)
Victor Stinner3a50e702011-10-18 21:21:00 +02001019 return NULL;
1020 v = codec_tuple(PyUnicode_EncodeCodePage(code_page,
1021 str,
1022 errors),
1023 PyUnicode_GET_LENGTH(str));
1024 Py_DECREF(str);
1025 return v;
1026}
1027
Victor Stinner99b95382011-07-04 14:23:54 +02001028#endif /* HAVE_MBCS */
Guido van Rossum24bdb042000-03-28 20:29:59 +00001029
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001030/* --- Error handler registry --------------------------------------------- */
1031
Walter Dörwald0ae29812002-10-31 13:36:29 +00001032PyDoc_STRVAR(register_error__doc__,
1033"register_error(errors, handler)\n\
1034\n\
1035Register the specified error handler under the name\n\
1036errors. handler must be a callable object, that\n\
1037will be called with an exception instance containing\n\
1038information about the location of the encoding/decoding\n\
1039error and must return a (replacement, new position) tuple.");
1040
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001041static PyObject *register_error(PyObject *self, PyObject *args)
1042{
1043 const char *name;
1044 PyObject *handler;
1045
1046 if (!PyArg_ParseTuple(args, "sO:register_error",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 &name, &handler))
1048 return NULL;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001049 if (PyCodec_RegisterError(name, handler))
1050 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001051 Py_RETURN_NONE;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001052}
1053
Walter Dörwald0ae29812002-10-31 13:36:29 +00001054PyDoc_STRVAR(lookup_error__doc__,
1055"lookup_error(errors) -> handler\n\
1056\n\
1057Return the error handler for the specified error handling name\n\
1058or raise a LookupError, if no handler exists under this name.");
1059
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001060static PyObject *lookup_error(PyObject *self, PyObject *args)
1061{
1062 const char *name;
1063
1064 if (!PyArg_ParseTuple(args, "s:lookup_error",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 &name))
1066 return NULL;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001067 return PyCodec_LookupError(name);
1068}
1069
Guido van Rossume2d67f92000-03-10 23:09:23 +00001070/* --- Module API --------------------------------------------------------- */
1071
1072static PyMethodDef _codecs_functions[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 {"register", codec_register, METH_O,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001074 register__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 {"lookup", codec_lookup, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001076 lookup__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 {"encode", codec_encode, METH_VARARGS,
1078 encode__doc__},
1079 {"decode", codec_decode, METH_VARARGS,
1080 decode__doc__},
1081 {"escape_encode", escape_encode, METH_VARARGS},
1082 {"escape_decode", escape_decode, METH_VARARGS},
1083 {"utf_8_encode", utf_8_encode, METH_VARARGS},
1084 {"utf_8_decode", utf_8_decode, METH_VARARGS},
1085 {"utf_7_encode", utf_7_encode, METH_VARARGS},
1086 {"utf_7_decode", utf_7_decode, METH_VARARGS},
1087 {"utf_16_encode", utf_16_encode, METH_VARARGS},
1088 {"utf_16_le_encode", utf_16_le_encode, METH_VARARGS},
1089 {"utf_16_be_encode", utf_16_be_encode, METH_VARARGS},
1090 {"utf_16_decode", utf_16_decode, METH_VARARGS},
1091 {"utf_16_le_decode", utf_16_le_decode, METH_VARARGS},
1092 {"utf_16_be_decode", utf_16_be_decode, METH_VARARGS},
1093 {"utf_16_ex_decode", utf_16_ex_decode, METH_VARARGS},
1094 {"utf_32_encode", utf_32_encode, METH_VARARGS},
1095 {"utf_32_le_encode", utf_32_le_encode, METH_VARARGS},
1096 {"utf_32_be_encode", utf_32_be_encode, METH_VARARGS},
1097 {"utf_32_decode", utf_32_decode, METH_VARARGS},
1098 {"utf_32_le_decode", utf_32_le_decode, METH_VARARGS},
1099 {"utf_32_be_decode", utf_32_be_decode, METH_VARARGS},
1100 {"utf_32_ex_decode", utf_32_ex_decode, METH_VARARGS},
1101 {"unicode_escape_encode", unicode_escape_encode, METH_VARARGS},
1102 {"unicode_escape_decode", unicode_escape_decode, METH_VARARGS},
1103 {"unicode_internal_encode", unicode_internal_encode, METH_VARARGS},
1104 {"unicode_internal_decode", unicode_internal_decode, METH_VARARGS},
1105 {"raw_unicode_escape_encode", raw_unicode_escape_encode, METH_VARARGS},
1106 {"raw_unicode_escape_decode", raw_unicode_escape_decode, METH_VARARGS},
1107 {"latin_1_encode", latin_1_encode, METH_VARARGS},
1108 {"latin_1_decode", latin_1_decode, METH_VARARGS},
1109 {"ascii_encode", ascii_encode, METH_VARARGS},
1110 {"ascii_decode", ascii_decode, METH_VARARGS},
1111 {"charmap_encode", charmap_encode, METH_VARARGS},
1112 {"charmap_decode", charmap_decode, METH_VARARGS},
1113 {"charmap_build", charmap_build, METH_VARARGS},
1114 {"readbuffer_encode", readbuffer_encode, METH_VARARGS},
Victor Stinner99b95382011-07-04 14:23:54 +02001115#ifdef HAVE_MBCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 {"mbcs_encode", mbcs_encode, METH_VARARGS},
1117 {"mbcs_decode", mbcs_decode, METH_VARARGS},
Victor Stinner3a50e702011-10-18 21:21:00 +02001118 {"code_page_encode", code_page_encode, METH_VARARGS},
1119 {"code_page_decode", code_page_decode, METH_VARARGS},
Guido van Rossum24bdb042000-03-28 20:29:59 +00001120#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 {"register_error", register_error, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001122 register_error__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 {"lookup_error", lookup_error, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001124 lookup_error__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 {NULL, NULL} /* sentinel */
Guido van Rossume2d67f92000-03-10 23:09:23 +00001126};
1127
Martin v. Löwis1a214512008-06-11 05:26:20 +00001128static struct PyModuleDef codecsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 PyModuleDef_HEAD_INIT,
1130 "_codecs",
1131 NULL,
1132 -1,
1133 _codecs_functions,
1134 NULL,
1135 NULL,
1136 NULL,
1137 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001138};
1139
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001140PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001141PyInit__codecs(void)
Guido van Rossume2d67f92000-03-10 23:09:23 +00001142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 return PyModule_Create(&codecsmodule);
Guido van Rossume2d67f92000-03-10 23:09:23 +00001144}