blob: be31fd23b0952b3284dbf5edfa3cfe87ba9b09d1 [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 Stinner3a50e702011-10-18 21:21:00 +0200615static PyObject *
616code_page_decode(PyObject *self,
617 PyObject *args)
618{
619 Py_buffer pbuf;
620 const char *errors = NULL;
621 int final = 0;
622 Py_ssize_t consumed;
623 PyObject *decoded = NULL;
624 int code_page;
625
626 if (!PyArg_ParseTuple(args, "iy*|zi:code_page_decode",
627 &code_page, &pbuf, &errors, &final))
628 return NULL;
629 consumed = pbuf.len;
630
631 decoded = PyUnicode_DecodeCodePageStateful(code_page,
632 pbuf.buf, pbuf.len, errors,
633 final ? NULL : &consumed);
634 PyBuffer_Release(&pbuf);
635 if (decoded == NULL)
636 return NULL;
637 return codec_tuple(decoded, consumed);
638}
639
Victor Stinner99b95382011-07-04 14:23:54 +0200640#endif /* HAVE_MBCS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000641
Guido van Rossume2d67f92000-03-10 23:09:23 +0000642/* --- Encoder ------------------------------------------------------------ */
643
644static PyObject *
645readbuffer_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000647{
Martin v. Löwis423be952008-08-13 15:53:07 +0000648 Py_buffer pdata;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000649 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000650 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000651 const char *errors = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000652 PyObject *result;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000653
Martin v. Löwis423be952008-08-13 15:53:07 +0000654 if (!PyArg_ParseTuple(args, "s*|z:readbuffer_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 &pdata, &errors))
656 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000657 data = pdata.buf;
658 size = pdata.len;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000659
Martin v. Löwis423be952008-08-13 15:53:07 +0000660 result = PyBytes_FromStringAndSize(data, size);
661 PyBuffer_Release(&pdata);
662 return codec_tuple(result, size);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000663}
664
665static PyObject *
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000666unicode_internal_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 PyObject *args)
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000668{
669 PyObject *obj;
670 const char *errors = NULL;
671 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000672 Py_ssize_t size;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000673
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000674 if (!PyArg_ParseTuple(args, "O|z:unicode_internal_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000675 &obj, &errors))
676 return NULL;
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000677
678 if (PyUnicode_Check(obj)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 data = PyUnicode_AS_DATA(obj);
680 size = PyUnicode_GET_DATA_SIZE(obj);
681 return codec_tuple(PyBytes_FromStringAndSize(data, size),
682 PyUnicode_GET_SIZE(obj));
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000683 }
684 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
686 return NULL;
687 return codec_tuple(PyBytes_FromStringAndSize(data, size), size);
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000688 }
689}
690
691static PyObject *
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000692utf_7_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 PyObject *args)
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000694{
695 PyObject *str, *v;
696 const char *errors = NULL;
697
698 if (!PyArg_ParseTuple(args, "O|z:utf_7_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 &str, &errors))
700 return NULL;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000701
702 str = PyUnicode_FromObject(str);
703 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 return NULL;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000705 v = codec_tuple(PyUnicode_EncodeUTF7(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 PyUnicode_GET_SIZE(str),
707 0,
708 0,
709 errors),
710 PyUnicode_GET_SIZE(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);
755 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000757 v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 PyUnicode_GET_SIZE(str),
759 errors,
760 byteorder),
761 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000762 Py_DECREF(str);
763 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000764}
765
766static PyObject *
767utf_16_le_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000769{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000770 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000771 const char *errors = NULL;
772
Marc-André Lemburg4157dd52001-06-17 18:32:36 +0000773 if (!PyArg_ParseTuple(args, "O|z:utf_16_le_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 &str, &errors))
775 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000776
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000777 str = PyUnicode_FromObject(str);
778 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000780 v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 PyUnicode_GET_SIZE(str),
782 errors,
783 -1),
784 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000785 Py_DECREF(str);
786 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000787}
788
789static PyObject *
790utf_16_be_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000792{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000793 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000794 const char *errors = NULL;
795
Marc-André Lemburg4157dd52001-06-17 18:32:36 +0000796 if (!PyArg_ParseTuple(args, "O|z:utf_16_be_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 &str, &errors))
798 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000799
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000800 str = PyUnicode_FromObject(str);
801 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000803 v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 PyUnicode_GET_SIZE(str),
805 errors,
806 +1),
807 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000808 Py_DECREF(str);
809 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000810}
811
Walter Dörwald41980ca2007-08-16 21:55:45 +0000812/* This version provides access to the byteorder parameter of the
813 builtin UTF-32 codecs as optional third argument. It defaults to 0
814 which means: use the native byte order and prepend the data with a
815 BOM mark.
816
817*/
818
819static PyObject *
820utf_32_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000822{
823 PyObject *str, *v;
824 const char *errors = NULL;
825 int byteorder = 0;
826
827 if (!PyArg_ParseTuple(args, "O|zi:utf_32_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 &str, &errors, &byteorder))
829 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000830
831 str = PyUnicode_FromObject(str);
832 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000834 v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 PyUnicode_GET_SIZE(str),
836 errors,
837 byteorder),
838 PyUnicode_GET_SIZE(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000839 Py_DECREF(str);
840 return v;
841}
842
843static PyObject *
844utf_32_le_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000846{
847 PyObject *str, *v;
848 const char *errors = NULL;
849
850 if (!PyArg_ParseTuple(args, "O|z:utf_32_le_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 &str, &errors))
852 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000853
854 str = PyUnicode_FromObject(str);
855 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000857 v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 PyUnicode_GET_SIZE(str),
859 errors,
860 -1),
861 PyUnicode_GET_SIZE(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000862 Py_DECREF(str);
863 return v;
864}
865
866static PyObject *
867utf_32_be_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000869{
870 PyObject *str, *v;
871 const char *errors = NULL;
872
873 if (!PyArg_ParseTuple(args, "O|z:utf_32_be_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 &str, &errors))
875 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000876
877 str = PyUnicode_FromObject(str);
878 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000880 v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 PyUnicode_GET_SIZE(str),
882 errors,
883 +1),
884 PyUnicode_GET_SIZE(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000885 Py_DECREF(str);
886 return v;
887}
888
Guido van Rossume2d67f92000-03-10 23:09:23 +0000889static PyObject *
890unicode_escape_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000892{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000893 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000894 const char *errors = NULL;
895
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000896 if (!PyArg_ParseTuple(args, "O|z:unicode_escape_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 &str, &errors))
898 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000899
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000900 str = PyUnicode_FromObject(str);
901 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 return NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000903 v = codec_tuple(PyUnicode_EncodeUnicodeEscape(PyUnicode_AS_UNICODE(str),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 PyUnicode_GET_SIZE(str)),
905 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000906 Py_DECREF(str);
907 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000908}
909
910static PyObject *
911raw_unicode_escape_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000913{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000914 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000915 const char *errors = NULL;
916
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000917 if (!PyArg_ParseTuple(args, "O|z:raw_unicode_escape_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 &str, &errors))
919 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000920
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000921 str = PyUnicode_FromObject(str);
922 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000924 v = codec_tuple(PyUnicode_EncodeRawUnicodeEscape(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 PyUnicode_AS_UNICODE(str),
926 PyUnicode_GET_SIZE(str)),
927 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000928 Py_DECREF(str);
929 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000930}
931
932static PyObject *
933latin_1_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000935{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000936 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000937 const char *errors = NULL;
938
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000939 if (!PyArg_ParseTuple(args, "O|z:latin_1_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 &str, &errors))
941 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000942
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000943 str = PyUnicode_FromObject(str);
944 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000946 v = codec_tuple(PyUnicode_EncodeLatin1(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 PyUnicode_AS_UNICODE(str),
948 PyUnicode_GET_SIZE(str),
949 errors),
950 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000951 Py_DECREF(str);
952 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000953}
954
955static PyObject *
956ascii_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000958{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000959 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000960 const char *errors = NULL;
961
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000962 if (!PyArg_ParseTuple(args, "O|z:ascii_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 &str, &errors))
964 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000965
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000966 str = PyUnicode_FromObject(str);
967 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000969 v = codec_tuple(PyUnicode_EncodeASCII(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 PyUnicode_AS_UNICODE(str),
971 PyUnicode_GET_SIZE(str),
972 errors),
973 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000974 Py_DECREF(str);
975 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000976}
977
978static PyObject *
979charmap_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000981{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000982 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000983 const char *errors = NULL;
984 PyObject *mapping = NULL;
985
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000986 if (!PyArg_ParseTuple(args, "O|zO:charmap_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 &str, &errors, &mapping))
988 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000989 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000991
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000992 str = PyUnicode_FromObject(str);
993 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000995 v = codec_tuple(PyUnicode_EncodeCharmap(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 PyUnicode_AS_UNICODE(str),
997 PyUnicode_GET_SIZE(str),
998 mapping,
999 errors),
1000 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +00001001 Py_DECREF(str);
1002 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +00001003}
1004
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00001005static PyObject*
1006charmap_build(PyObject *self, PyObject *args)
1007{
1008 PyObject *map;
1009 if (!PyArg_ParseTuple(args, "U:charmap_build", &map))
1010 return NULL;
1011 return PyUnicode_BuildEncodingMap(map);
1012}
1013
Victor Stinner99b95382011-07-04 14:23:54 +02001014#ifdef HAVE_MBCS
Guido van Rossum24bdb042000-03-28 20:29:59 +00001015
1016static PyObject *
1017mbcs_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 PyObject *args)
Guido van Rossum24bdb042000-03-28 20:29:59 +00001019{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +00001020 PyObject *str, *v;
Guido van Rossum24bdb042000-03-28 20:29:59 +00001021 const char *errors = NULL;
1022
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +00001023 if (!PyArg_ParseTuple(args, "O|z:mbcs_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 &str, &errors))
1025 return NULL;
Guido van Rossum24bdb042000-03-28 20:29:59 +00001026
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +00001027 str = PyUnicode_FromObject(str);
1028 if (str == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 return NULL;
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +00001030 v = codec_tuple(PyUnicode_EncodeMBCS(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 PyUnicode_AS_UNICODE(str),
1032 PyUnicode_GET_SIZE(str),
1033 errors),
1034 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +00001035 Py_DECREF(str);
1036 return v;
Guido van Rossum24bdb042000-03-28 20:29:59 +00001037}
1038
Victor Stinner3a50e702011-10-18 21:21:00 +02001039static PyObject *
1040code_page_encode(PyObject *self,
1041 PyObject *args)
1042{
1043 PyObject *str, *v;
1044 const char *errors = NULL;
1045 int code_page;
1046
1047 if (!PyArg_ParseTuple(args, "iO|z:code_page_encode",
1048 &code_page, &str, &errors))
1049 return NULL;
1050
1051 str = PyUnicode_FromObject(str);
1052 if (str == NULL)
1053 return NULL;
1054 v = codec_tuple(PyUnicode_EncodeCodePage(code_page,
1055 str,
1056 errors),
1057 PyUnicode_GET_LENGTH(str));
1058 Py_DECREF(str);
1059 return v;
1060}
1061
Victor Stinner99b95382011-07-04 14:23:54 +02001062#endif /* HAVE_MBCS */
Guido van Rossum24bdb042000-03-28 20:29:59 +00001063
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001064/* --- Error handler registry --------------------------------------------- */
1065
Walter Dörwald0ae29812002-10-31 13:36:29 +00001066PyDoc_STRVAR(register_error__doc__,
1067"register_error(errors, handler)\n\
1068\n\
1069Register the specified error handler under the name\n\
1070errors. handler must be a callable object, that\n\
1071will be called with an exception instance containing\n\
1072information about the location of the encoding/decoding\n\
1073error and must return a (replacement, new position) tuple.");
1074
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001075static PyObject *register_error(PyObject *self, PyObject *args)
1076{
1077 const char *name;
1078 PyObject *handler;
1079
1080 if (!PyArg_ParseTuple(args, "sO:register_error",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 &name, &handler))
1082 return NULL;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001083 if (PyCodec_RegisterError(name, handler))
1084 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001085 Py_RETURN_NONE;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001086}
1087
Walter Dörwald0ae29812002-10-31 13:36:29 +00001088PyDoc_STRVAR(lookup_error__doc__,
1089"lookup_error(errors) -> handler\n\
1090\n\
1091Return the error handler for the specified error handling name\n\
1092or raise a LookupError, if no handler exists under this name.");
1093
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001094static PyObject *lookup_error(PyObject *self, PyObject *args)
1095{
1096 const char *name;
1097
1098 if (!PyArg_ParseTuple(args, "s:lookup_error",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 &name))
1100 return NULL;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001101 return PyCodec_LookupError(name);
1102}
1103
Guido van Rossume2d67f92000-03-10 23:09:23 +00001104/* --- Module API --------------------------------------------------------- */
1105
1106static PyMethodDef _codecs_functions[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 {"register", codec_register, METH_O,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001108 register__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 {"lookup", codec_lookup, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001110 lookup__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 {"encode", codec_encode, METH_VARARGS,
1112 encode__doc__},
1113 {"decode", codec_decode, METH_VARARGS,
1114 decode__doc__},
1115 {"escape_encode", escape_encode, METH_VARARGS},
1116 {"escape_decode", escape_decode, METH_VARARGS},
1117 {"utf_8_encode", utf_8_encode, METH_VARARGS},
1118 {"utf_8_decode", utf_8_decode, METH_VARARGS},
1119 {"utf_7_encode", utf_7_encode, METH_VARARGS},
1120 {"utf_7_decode", utf_7_decode, METH_VARARGS},
1121 {"utf_16_encode", utf_16_encode, METH_VARARGS},
1122 {"utf_16_le_encode", utf_16_le_encode, METH_VARARGS},
1123 {"utf_16_be_encode", utf_16_be_encode, METH_VARARGS},
1124 {"utf_16_decode", utf_16_decode, METH_VARARGS},
1125 {"utf_16_le_decode", utf_16_le_decode, METH_VARARGS},
1126 {"utf_16_be_decode", utf_16_be_decode, METH_VARARGS},
1127 {"utf_16_ex_decode", utf_16_ex_decode, METH_VARARGS},
1128 {"utf_32_encode", utf_32_encode, METH_VARARGS},
1129 {"utf_32_le_encode", utf_32_le_encode, METH_VARARGS},
1130 {"utf_32_be_encode", utf_32_be_encode, METH_VARARGS},
1131 {"utf_32_decode", utf_32_decode, METH_VARARGS},
1132 {"utf_32_le_decode", utf_32_le_decode, METH_VARARGS},
1133 {"utf_32_be_decode", utf_32_be_decode, METH_VARARGS},
1134 {"utf_32_ex_decode", utf_32_ex_decode, METH_VARARGS},
1135 {"unicode_escape_encode", unicode_escape_encode, METH_VARARGS},
1136 {"unicode_escape_decode", unicode_escape_decode, METH_VARARGS},
1137 {"unicode_internal_encode", unicode_internal_encode, METH_VARARGS},
1138 {"unicode_internal_decode", unicode_internal_decode, METH_VARARGS},
1139 {"raw_unicode_escape_encode", raw_unicode_escape_encode, METH_VARARGS},
1140 {"raw_unicode_escape_decode", raw_unicode_escape_decode, METH_VARARGS},
1141 {"latin_1_encode", latin_1_encode, METH_VARARGS},
1142 {"latin_1_decode", latin_1_decode, METH_VARARGS},
1143 {"ascii_encode", ascii_encode, METH_VARARGS},
1144 {"ascii_decode", ascii_decode, METH_VARARGS},
1145 {"charmap_encode", charmap_encode, METH_VARARGS},
1146 {"charmap_decode", charmap_decode, METH_VARARGS},
1147 {"charmap_build", charmap_build, METH_VARARGS},
1148 {"readbuffer_encode", readbuffer_encode, METH_VARARGS},
Victor Stinner99b95382011-07-04 14:23:54 +02001149#ifdef HAVE_MBCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 {"mbcs_encode", mbcs_encode, METH_VARARGS},
1151 {"mbcs_decode", mbcs_decode, METH_VARARGS},
Victor Stinner3a50e702011-10-18 21:21:00 +02001152 {"code_page_encode", code_page_encode, METH_VARARGS},
1153 {"code_page_decode", code_page_decode, METH_VARARGS},
Guido van Rossum24bdb042000-03-28 20:29:59 +00001154#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 {"register_error", register_error, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001156 register_error__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 {"lookup_error", lookup_error, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001158 lookup_error__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 {NULL, NULL} /* sentinel */
Guido van Rossume2d67f92000-03-10 23:09:23 +00001160};
1161
Martin v. Löwis1a214512008-06-11 05:26:20 +00001162static struct PyModuleDef codecsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 PyModuleDef_HEAD_INIT,
1164 "_codecs",
1165 NULL,
1166 -1,
1167 _codecs_functions,
1168 NULL,
1169 NULL,
1170 NULL,
1171 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001172};
1173
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001174PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001175PyInit__codecs(void)
Guido van Rossume2d67f92000-03-10 23:09:23 +00001176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 return PyModule_Create(&codecsmodule);
Guido van Rossume2d67f92000-03-10 23:09:23 +00001178}