blob: c500073ca771b98665104cf74798d4fe793db272 [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']) ->
Guido van Rossume2d67f92000-03-10 23:09:23 +000018 (string object, bytes consumed)
19
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\
Guido van Rossum36e0a922007-07-20 04:05:57 +000064a tuple of function (or a 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)
98 encoding = PyUnicode_GetDefaultEncoding();
99
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\
111as well as any other name registerd with codecs.register_error that is\n\
112able 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)
125 encoding = PyUnicode_GetDefaultEncoding();
126
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,
Thomas Wouters477c8d52006-05-27 19:21:47 +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,
148 PyObject *args)
149{
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",
155 &data, &size, &errors))
156 return NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000157 return codec_tuple(PyString_DecodeEscape(data, size, errors, 0, NULL),
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000158 size);
159}
160
161static PyObject *
162escape_encode(PyObject *self,
163 PyObject *args)
164{
Walter Dörwald1ab83302007-05-18 17:15:44 +0000165 static const char *hexdigits = "0123456789abcdef";
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000166 PyObject *str;
Walter Dörwald1ab83302007-05-18 17:15:44 +0000167 Py_ssize_t size;
168 Py_ssize_t newsize;
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000169 const char *errors = NULL;
Walter Dörwald1ab83302007-05-18 17:15:44 +0000170 PyObject *v;
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000171
172 if (!PyArg_ParseTuple(args, "O!|z:escape_encode",
173 &PyString_Type, &str, &errors))
174 return NULL;
175
Martin v. Löwis5b222132007-06-10 09:51:05 +0000176 size = PyString_GET_SIZE(str);
Walter Dörwald1ab83302007-05-18 17:15:44 +0000177 newsize = 4*size;
178 if (newsize > PY_SSIZE_T_MAX || newsize / 4 != size) {
179 PyErr_SetString(PyExc_OverflowError,
180 "string is too large to encode");
181 return NULL;
182 }
183 v = PyBytes_FromStringAndSize(NULL, newsize);
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000184
Walter Dörwald1ab83302007-05-18 17:15:44 +0000185 if (v == NULL) {
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000186 return NULL;
Walter Dörwald1ab83302007-05-18 17:15:44 +0000187 }
188 else {
189 register Py_ssize_t i;
190 register char c;
191 register char *p = PyBytes_AS_STRING(v);
192
193 for (i = 0; i < size; i++) {
194 /* There's at least enough room for a hex escape */
195 assert(newsize - (p - PyBytes_AS_STRING(v)) >= 4);
196 c = PyString_AS_STRING(str)[i];
197 if (c == '\'' || c == '\\')
198 *p++ = '\\', *p++ = c;
199 else if (c == '\t')
200 *p++ = '\\', *p++ = 't';
201 else if (c == '\n')
202 *p++ = '\\', *p++ = 'n';
203 else if (c == '\r')
204 *p++ = '\\', *p++ = 'r';
205 else if (c < ' ' || c >= 0x7f) {
206 *p++ = '\\';
207 *p++ = 'x';
208 *p++ = hexdigits[(c & 0xf0) >> 4];
209 *p++ = hexdigits[c & 0xf];
210 }
211 else
212 *p++ = c;
213 }
214 *p = '\0';
215 if (PyBytes_Resize(v, (p - PyBytes_AS_STRING(v)))) {
216 Py_DECREF(v);
217 return NULL;
218 }
219 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000220
Walter Dörwald1ab83302007-05-18 17:15:44 +0000221 return codec_tuple(v, PyBytes_Size(v));
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000222}
223
Guido van Rossume2d67f92000-03-10 23:09:23 +0000224/* --- Decoder ------------------------------------------------------------ */
225
226static PyObject *
227unicode_internal_decode(PyObject *self,
228 PyObject *args)
229{
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000230 PyObject *obj;
231 const char *errors = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000232 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000233 Py_ssize_t size;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000234
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000235 if (!PyArg_ParseTuple(args, "O|z:unicode_internal_decode",
236 &obj, &errors))
Guido van Rossume2d67f92000-03-10 23:09:23 +0000237 return NULL;
238
Marc-André Lemburg29273c82003-02-04 19:35:03 +0000239 if (PyUnicode_Check(obj)) {
240 Py_INCREF(obj);
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000241 return codec_tuple(obj, PyUnicode_GET_SIZE(obj));
Marc-André Lemburg29273c82003-02-04 19:35:03 +0000242 }
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000243 else {
244 if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
245 return NULL;
Walter Dörwalda47d1c02005-08-30 10:23:14 +0000246
247 return codec_tuple(_PyUnicode_DecodeUnicodeInternal(data, size, errors),
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000248 size);
249 }
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,
254 PyObject *args)
255{
256 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000257 Py_ssize_t size;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000258 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000259
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000260 if (!PyArg_ParseTuple(args, "t#|z:utf_7_decode",
261 &data, &size, &errors))
262 return NULL;
263
264 return codec_tuple(PyUnicode_DecodeUTF7(data, size, errors),
265 size);
266}
267
268static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000269utf_8_decode(PyObject *self,
270 PyObject *args)
271{
272 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000273 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000274 const char *errors = NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000275 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000276 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000277 PyObject *decoded = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000278
Walter Dörwald69652032004-09-07 20:24:22 +0000279 if (!PyArg_ParseTuple(args, "t#|zi:utf_8_decode",
280 &data, &size, &errors, &final))
281 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000282 if (size < 0) {
283 PyErr_SetString(PyExc_ValueError, "negative argument");
284 return 0;
285 }
Walter Dörwald69652032004-09-07 20:24:22 +0000286 consumed = size;
287
288 decoded = PyUnicode_DecodeUTF8Stateful(data, size, errors,
289 final ? NULL : &consumed);
290 if (decoded == NULL)
291 return NULL;
292 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000293}
294
295static PyObject *
296utf_16_decode(PyObject *self,
297 PyObject *args)
298{
299 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000300 Py_ssize_t size;
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
307 if (!PyArg_ParseTuple(args, "t#|zi:utf_16_decode",
308 &data, &size, &errors, &final))
Guido van Rossume2d67f92000-03-10 23:09:23 +0000309 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000310 if (size < 0) {
311 PyErr_SetString(PyExc_ValueError, "negative argument");
312 return 0;
313 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000314 consumed = size; /* This is overwritten unless final is true. */
Walter Dörwald69652032004-09-07 20:24:22 +0000315 decoded = PyUnicode_DecodeUTF16Stateful(data, size, errors, &byteorder,
316 final ? NULL : &consumed);
317 if (decoded == NULL)
318 return NULL;
319 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000320}
321
322static PyObject *
323utf_16_le_decode(PyObject *self,
324 PyObject *args)
325{
326 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000327 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000328 const char *errors = NULL;
329 int byteorder = -1;
Walter Dörwald69652032004-09-07 20:24:22 +0000330 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000331 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000332 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000333
Walter Dörwald69652032004-09-07 20:24:22 +0000334 if (!PyArg_ParseTuple(args, "t#|zi:utf_16_le_decode",
335 &data, &size, &errors, &final))
Guido van Rossume2d67f92000-03-10 23:09:23 +0000336 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000337
Martin v. Löwis18e16552006-02-15 17:27:45 +0000338 if (size < 0) {
339 PyErr_SetString(PyExc_ValueError, "negative argument");
340 return 0;
341 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000342 consumed = size; /* This is overwritten unless final is true. */
Walter Dörwald69652032004-09-07 20:24:22 +0000343 decoded = PyUnicode_DecodeUTF16Stateful(data, size, errors,
344 &byteorder, final ? NULL : &consumed);
345 if (decoded == NULL)
346 return NULL;
347 return codec_tuple(decoded, consumed);
348
Guido van Rossume2d67f92000-03-10 23:09:23 +0000349}
350
351static PyObject *
352utf_16_be_decode(PyObject *self,
353 PyObject *args)
354{
355 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000356 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000357 const char *errors = NULL;
358 int byteorder = 1;
Walter Dörwald69652032004-09-07 20:24:22 +0000359 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000360 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000361 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000362
Walter Dörwald69652032004-09-07 20:24:22 +0000363 if (!PyArg_ParseTuple(args, "t#|zi:utf_16_be_decode",
364 &data, &size, &errors, &final))
Guido van Rossume2d67f92000-03-10 23:09:23 +0000365 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000366 if (size < 0) {
367 PyErr_SetString(PyExc_ValueError, "negative argument");
368 return 0;
369 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000370 consumed = size; /* This is overwritten unless final is true. */
Walter Dörwald69652032004-09-07 20:24:22 +0000371 decoded = PyUnicode_DecodeUTF16Stateful(data, size, errors,
372 &byteorder, final ? NULL : &consumed);
373 if (decoded == NULL)
374 return NULL;
375 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000376}
377
378/* This non-standard version also provides access to the byteorder
379 parameter of the builtin UTF-16 codec.
380
381 It returns a tuple (unicode, bytesread, byteorder) with byteorder
382 being the value in effect at the end of data.
383
384*/
385
386static PyObject *
387utf_16_ex_decode(PyObject *self,
388 PyObject *args)
389{
390 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000391 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000392 const char *errors = NULL;
393 int byteorder = 0;
394 PyObject *unicode, *tuple;
Walter Dörwald69652032004-09-07 20:24:22 +0000395 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000396 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000397
398 if (!PyArg_ParseTuple(args, "t#|zii:utf_16_ex_decode",
399 &data, &size, &errors, &byteorder, &final))
Guido van Rossume2d67f92000-03-10 23:09:23 +0000400 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000401 if (size < 0) {
402 PyErr_SetString(PyExc_ValueError, "negative argument");
403 return 0;
404 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000405 consumed = size; /* This is overwritten unless final is true. */
Walter Dörwald69652032004-09-07 20:24:22 +0000406 unicode = PyUnicode_DecodeUTF16Stateful(data, size, errors, &byteorder,
407 final ? NULL : &consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000408 if (unicode == NULL)
409 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000410 tuple = Py_BuildValue("Oni", unicode, consumed, byteorder);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000411 Py_DECREF(unicode);
412 return tuple;
413}
414
415static PyObject *
416unicode_escape_decode(PyObject *self,
417 PyObject *args)
418{
419 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000420 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000421 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000422
Guido van Rossume2d67f92000-03-10 23:09:23 +0000423 if (!PyArg_ParseTuple(args, "t#|z:unicode_escape_decode",
424 &data, &size, &errors))
425 return NULL;
426
427 return codec_tuple(PyUnicode_DecodeUnicodeEscape(data, size, errors),
428 size);
429}
430
431static PyObject *
432raw_unicode_escape_decode(PyObject *self,
433 PyObject *args)
434{
435 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000436 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000437 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000438
Guido van Rossume2d67f92000-03-10 23:09:23 +0000439 if (!PyArg_ParseTuple(args, "t#|z:raw_unicode_escape_decode",
440 &data, &size, &errors))
441 return NULL;
442
443 return codec_tuple(PyUnicode_DecodeRawUnicodeEscape(data, size, errors),
444 size);
445}
446
447static PyObject *
448latin_1_decode(PyObject *self,
449 PyObject *args)
450{
451 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000452 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000453 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000454
Guido van Rossume2d67f92000-03-10 23:09:23 +0000455 if (!PyArg_ParseTuple(args, "t#|z:latin_1_decode",
456 &data, &size, &errors))
457 return NULL;
458
459 return codec_tuple(PyUnicode_DecodeLatin1(data, size, errors),
460 size);
461}
462
463static PyObject *
464ascii_decode(PyObject *self,
465 PyObject *args)
466{
467 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000468 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000469 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000470
Guido van Rossume2d67f92000-03-10 23:09:23 +0000471 if (!PyArg_ParseTuple(args, "t#|z:ascii_decode",
472 &data, &size, &errors))
473 return NULL;
474
475 return codec_tuple(PyUnicode_DecodeASCII(data, size, errors),
476 size);
477}
478
479static PyObject *
480charmap_decode(PyObject *self,
481 PyObject *args)
482{
483 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000484 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000485 const char *errors = NULL;
486 PyObject *mapping = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000487
Guido van Rossume2d67f92000-03-10 23:09:23 +0000488 if (!PyArg_ParseTuple(args, "t#|zO:charmap_decode",
489 &data, &size, &errors, &mapping))
490 return NULL;
491 if (mapping == Py_None)
492 mapping = NULL;
493
494 return codec_tuple(PyUnicode_DecodeCharmap(data, size, mapping, errors),
495 size);
496}
497
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000498#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
Guido van Rossum24bdb042000-03-28 20:29:59 +0000499
500static PyObject *
501mbcs_decode(PyObject *self,
502 PyObject *args)
503{
504 const char *data;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000505 Py_ssize_t size, consumed;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000506 const char *errors = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000507 int final = 0;
508 PyObject *decoded;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000509
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000510 if (!PyArg_ParseTuple(args, "t#|zi:mbcs_decode",
511 &data, &size, &errors, &final))
Guido van Rossum24bdb042000-03-28 20:29:59 +0000512 return NULL;
513
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000514 decoded = PyUnicode_DecodeMBCSStateful(
515 data, size, errors, final ? NULL : &consumed);
516 if (!decoded)
517 return NULL;
518 return codec_tuple(decoded, final ? size : consumed);
Guido van Rossum24bdb042000-03-28 20:29:59 +0000519}
520
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000521#endif /* MS_WINDOWS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000522
Guido van Rossume2d67f92000-03-10 23:09:23 +0000523/* --- Encoder ------------------------------------------------------------ */
524
525static PyObject *
526readbuffer_encode(PyObject *self,
527 PyObject *args)
528{
529 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000530 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000531 const char *errors = NULL;
532
533 if (!PyArg_ParseTuple(args, "s#|z:readbuffer_encode",
534 &data, &size, &errors))
535 return NULL;
536
Walter Dörwald2233d272007-06-22 12:17:08 +0000537 return codec_tuple(PyBytes_FromStringAndSize(data, size), size);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000538}
539
540static PyObject *
541charbuffer_encode(PyObject *self,
542 PyObject *args)
543{
544 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000545 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000546 const char *errors = NULL;
547
548 if (!PyArg_ParseTuple(args, "t#|z:charbuffer_encode",
549 &data, &size, &errors))
550 return NULL;
551
Walter Dörwald2233d272007-06-22 12:17:08 +0000552 return codec_tuple(PyBytes_FromStringAndSize(data, size), size);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000553}
554
555static PyObject *
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000556unicode_internal_encode(PyObject *self,
557 PyObject *args)
558{
559 PyObject *obj;
560 const char *errors = NULL;
561 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000562 Py_ssize_t size;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000563
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000564 if (!PyArg_ParseTuple(args, "O|z:unicode_internal_encode",
565 &obj, &errors))
566 return NULL;
567
568 if (PyUnicode_Check(obj)) {
569 data = PyUnicode_AS_DATA(obj);
570 size = PyUnicode_GET_DATA_SIZE(obj);
Walter Dörwald2233d272007-06-22 12:17:08 +0000571 return codec_tuple(PyBytes_FromStringAndSize(data, size), size);
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000572 }
573 else {
574 if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
575 return NULL;
Walter Dörwald2233d272007-06-22 12:17:08 +0000576 return codec_tuple(PyBytes_FromStringAndSize(data, size), size);
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000577 }
578}
579
580static PyObject *
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000581utf_7_encode(PyObject *self,
582 PyObject *args)
583{
584 PyObject *str, *v;
585 const char *errors = NULL;
586
587 if (!PyArg_ParseTuple(args, "O|z:utf_7_encode",
588 &str, &errors))
589 return NULL;
590
591 str = PyUnicode_FromObject(str);
592 if (str == NULL)
593 return NULL;
594 v = codec_tuple(PyUnicode_EncodeUTF7(PyUnicode_AS_UNICODE(str),
595 PyUnicode_GET_SIZE(str),
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000596 0,
597 0,
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000598 errors),
599 PyUnicode_GET_SIZE(str));
600 Py_DECREF(str);
601 return v;
602}
603
604static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000605utf_8_encode(PyObject *self,
606 PyObject *args)
607{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000608 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000609 const char *errors = NULL;
610
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000611 if (!PyArg_ParseTuple(args, "O|z:utf_8_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000612 &str, &errors))
613 return NULL;
614
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000615 str = PyUnicode_FromObject(str);
616 if (str == NULL)
617 return NULL;
618 v = codec_tuple(PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(str),
619 PyUnicode_GET_SIZE(str),
620 errors),
621 PyUnicode_GET_SIZE(str));
622 Py_DECREF(str);
623 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000624}
625
626/* This version provides access to the byteorder parameter of the
627 builtin UTF-16 codecs as optional third argument. It defaults to 0
628 which means: use the native byte order and prepend the data with a
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000629 BOM mark.
Guido van Rossume2d67f92000-03-10 23:09:23 +0000630
631*/
632
633static PyObject *
634utf_16_encode(PyObject *self,
635 PyObject *args)
636{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000637 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000638 const char *errors = NULL;
639 int byteorder = 0;
640
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000641 if (!PyArg_ParseTuple(args, "O|zi:utf_16_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000642 &str, &errors, &byteorder))
643 return NULL;
644
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000645 str = PyUnicode_FromObject(str);
646 if (str == NULL)
647 return NULL;
648 v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
649 PyUnicode_GET_SIZE(str),
650 errors,
651 byteorder),
652 PyUnicode_GET_SIZE(str));
653 Py_DECREF(str);
654 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000655}
656
657static PyObject *
658utf_16_le_encode(PyObject *self,
659 PyObject *args)
660{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000661 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000662 const char *errors = NULL;
663
Marc-André Lemburg4157dd52001-06-17 18:32:36 +0000664 if (!PyArg_ParseTuple(args, "O|z:utf_16_le_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000665 &str, &errors))
666 return NULL;
667
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000668 str = PyUnicode_FromObject(str);
669 if (str == NULL)
670 return NULL;
671 v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
Guido van Rossume2d67f92000-03-10 23:09:23 +0000672 PyUnicode_GET_SIZE(str),
673 errors,
674 -1),
675 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000676 Py_DECREF(str);
677 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000678}
679
680static PyObject *
681utf_16_be_encode(PyObject *self,
682 PyObject *args)
683{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000684 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000685 const char *errors = NULL;
686
Marc-André Lemburg4157dd52001-06-17 18:32:36 +0000687 if (!PyArg_ParseTuple(args, "O|z:utf_16_be_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000688 &str, &errors))
689 return NULL;
690
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000691 str = PyUnicode_FromObject(str);
692 if (str == NULL)
693 return NULL;
694 v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
695 PyUnicode_GET_SIZE(str),
696 errors,
697 +1),
698 PyUnicode_GET_SIZE(str));
699 Py_DECREF(str);
700 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000701}
702
703static PyObject *
704unicode_escape_encode(PyObject *self,
705 PyObject *args)
706{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000707 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000708 const char *errors = NULL;
709
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000710 if (!PyArg_ParseTuple(args, "O|z:unicode_escape_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000711 &str, &errors))
712 return NULL;
713
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000714 str = PyUnicode_FromObject(str);
715 if (str == NULL)
716 return NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000717 v = codec_tuple(PyUnicode_EncodeUnicodeEscape(PyUnicode_AS_UNICODE(str),
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000718 PyUnicode_GET_SIZE(str)),
719 PyUnicode_GET_SIZE(str));
720 Py_DECREF(str);
721 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000722}
723
724static PyObject *
725raw_unicode_escape_encode(PyObject *self,
726 PyObject *args)
727{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000728 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000729 const char *errors = NULL;
730
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000731 if (!PyArg_ParseTuple(args, "O|z:raw_unicode_escape_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000732 &str, &errors))
733 return NULL;
734
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000735 str = PyUnicode_FromObject(str);
736 if (str == NULL)
737 return NULL;
738 v = codec_tuple(PyUnicode_EncodeRawUnicodeEscape(
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000739 PyUnicode_AS_UNICODE(str),
Guido van Rossume2d67f92000-03-10 23:09:23 +0000740 PyUnicode_GET_SIZE(str)),
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000741 PyUnicode_GET_SIZE(str));
742 Py_DECREF(str);
743 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000744}
745
746static PyObject *
747latin_1_encode(PyObject *self,
748 PyObject *args)
749{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000750 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000751 const char *errors = NULL;
752
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000753 if (!PyArg_ParseTuple(args, "O|z:latin_1_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000754 &str, &errors))
755 return NULL;
756
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000757 str = PyUnicode_FromObject(str);
758 if (str == NULL)
759 return NULL;
760 v = codec_tuple(PyUnicode_EncodeLatin1(
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000761 PyUnicode_AS_UNICODE(str),
Guido van Rossume2d67f92000-03-10 23:09:23 +0000762 PyUnicode_GET_SIZE(str),
763 errors),
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000764 PyUnicode_GET_SIZE(str));
765 Py_DECREF(str);
766 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000767}
768
769static PyObject *
770ascii_encode(PyObject *self,
771 PyObject *args)
772{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000773 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000774 const char *errors = NULL;
775
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000776 if (!PyArg_ParseTuple(args, "O|z:ascii_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000777 &str, &errors))
778 return NULL;
779
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000780 str = PyUnicode_FromObject(str);
781 if (str == NULL)
782 return NULL;
783 v = codec_tuple(PyUnicode_EncodeASCII(
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000784 PyUnicode_AS_UNICODE(str),
Guido van Rossume2d67f92000-03-10 23:09:23 +0000785 PyUnicode_GET_SIZE(str),
786 errors),
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000787 PyUnicode_GET_SIZE(str));
788 Py_DECREF(str);
789 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000790}
791
792static PyObject *
793charmap_encode(PyObject *self,
794 PyObject *args)
795{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000796 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000797 const char *errors = NULL;
798 PyObject *mapping = NULL;
799
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000800 if (!PyArg_ParseTuple(args, "O|zO:charmap_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000801 &str, &errors, &mapping))
802 return NULL;
803 if (mapping == Py_None)
804 mapping = NULL;
805
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000806 str = PyUnicode_FromObject(str);
807 if (str == NULL)
808 return NULL;
809 v = codec_tuple(PyUnicode_EncodeCharmap(
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000810 PyUnicode_AS_UNICODE(str),
Guido van Rossume2d67f92000-03-10 23:09:23 +0000811 PyUnicode_GET_SIZE(str),
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000812 mapping,
Guido van Rossume2d67f92000-03-10 23:09:23 +0000813 errors),
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000814 PyUnicode_GET_SIZE(str));
815 Py_DECREF(str);
816 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000817}
818
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000819static PyObject*
820charmap_build(PyObject *self, PyObject *args)
821{
822 PyObject *map;
823 if (!PyArg_ParseTuple(args, "U:charmap_build", &map))
824 return NULL;
825 return PyUnicode_BuildEncodingMap(map);
826}
827
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000828#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
Guido van Rossum24bdb042000-03-28 20:29:59 +0000829
830static PyObject *
831mbcs_encode(PyObject *self,
832 PyObject *args)
833{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000834 PyObject *str, *v;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000835 const char *errors = NULL;
836
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000837 if (!PyArg_ParseTuple(args, "O|z:mbcs_encode",
Guido van Rossum24bdb042000-03-28 20:29:59 +0000838 &str, &errors))
839 return NULL;
840
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000841 str = PyUnicode_FromObject(str);
842 if (str == NULL)
843 return NULL;
844 v = codec_tuple(PyUnicode_EncodeMBCS(
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000845 PyUnicode_AS_UNICODE(str),
Guido van Rossum24bdb042000-03-28 20:29:59 +0000846 PyUnicode_GET_SIZE(str),
847 errors),
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000848 PyUnicode_GET_SIZE(str));
849 Py_DECREF(str);
850 return v;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000851}
852
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000853#endif /* MS_WINDOWS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000854
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000855/* --- Error handler registry --------------------------------------------- */
856
Walter Dörwald0ae29812002-10-31 13:36:29 +0000857PyDoc_STRVAR(register_error__doc__,
858"register_error(errors, handler)\n\
859\n\
860Register the specified error handler under the name\n\
861errors. handler must be a callable object, that\n\
862will be called with an exception instance containing\n\
863information about the location of the encoding/decoding\n\
864error and must return a (replacement, new position) tuple.");
865
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000866static PyObject *register_error(PyObject *self, PyObject *args)
867{
868 const char *name;
869 PyObject *handler;
870
871 if (!PyArg_ParseTuple(args, "sO:register_error",
872 &name, &handler))
873 return NULL;
874 if (PyCodec_RegisterError(name, handler))
875 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000876 Py_RETURN_NONE;
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000877}
878
Walter Dörwald0ae29812002-10-31 13:36:29 +0000879PyDoc_STRVAR(lookup_error__doc__,
880"lookup_error(errors) -> handler\n\
881\n\
882Return the error handler for the specified error handling name\n\
883or raise a LookupError, if no handler exists under this name.");
884
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000885static PyObject *lookup_error(PyObject *self, PyObject *args)
886{
887 const char *name;
888
889 if (!PyArg_ParseTuple(args, "s:lookup_error",
890 &name))
891 return NULL;
892 return PyCodec_LookupError(name);
893}
894
Guido van Rossume2d67f92000-03-10 23:09:23 +0000895/* --- Module API --------------------------------------------------------- */
896
897static PyMethodDef _codecs_functions[] = {
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000898 {"register", codec_register, METH_O,
Walter Dörwald0ae29812002-10-31 13:36:29 +0000899 register__doc__},
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000900 {"lookup", codec_lookup, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +0000901 lookup__doc__},
Brett Cannon3e377de2004-07-10 21:41:14 +0000902 {"encode", codec_encode, METH_VARARGS,
903 encode__doc__},
904 {"decode", codec_decode, METH_VARARGS,
905 decode__doc__},
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000906 {"escape_encode", escape_encode, METH_VARARGS},
907 {"escape_decode", escape_decode, METH_VARARGS},
Martin v. Löwis43b936d2002-01-17 23:15:58 +0000908 {"utf_8_encode", utf_8_encode, METH_VARARGS},
909 {"utf_8_decode", utf_8_decode, METH_VARARGS},
910 {"utf_7_encode", utf_7_encode, METH_VARARGS},
911 {"utf_7_decode", utf_7_decode, METH_VARARGS},
912 {"utf_16_encode", utf_16_encode, METH_VARARGS},
913 {"utf_16_le_encode", utf_16_le_encode, METH_VARARGS},
914 {"utf_16_be_encode", utf_16_be_encode, METH_VARARGS},
915 {"utf_16_decode", utf_16_decode, METH_VARARGS},
916 {"utf_16_le_decode", utf_16_le_decode, METH_VARARGS},
917 {"utf_16_be_decode", utf_16_be_decode, METH_VARARGS},
918 {"utf_16_ex_decode", utf_16_ex_decode, METH_VARARGS},
919 {"unicode_escape_encode", unicode_escape_encode, METH_VARARGS},
920 {"unicode_escape_decode", unicode_escape_decode, METH_VARARGS},
921 {"unicode_internal_encode", unicode_internal_encode, METH_VARARGS},
922 {"unicode_internal_decode", unicode_internal_decode, METH_VARARGS},
923 {"raw_unicode_escape_encode", raw_unicode_escape_encode, METH_VARARGS},
924 {"raw_unicode_escape_decode", raw_unicode_escape_decode, METH_VARARGS},
925 {"latin_1_encode", latin_1_encode, METH_VARARGS},
926 {"latin_1_decode", latin_1_decode, METH_VARARGS},
927 {"ascii_encode", ascii_encode, METH_VARARGS},
928 {"ascii_decode", ascii_decode, METH_VARARGS},
929 {"charmap_encode", charmap_encode, METH_VARARGS},
930 {"charmap_decode", charmap_decode, METH_VARARGS},
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000931 {"charmap_build", charmap_build, METH_VARARGS},
Martin v. Löwis43b936d2002-01-17 23:15:58 +0000932 {"readbuffer_encode", readbuffer_encode, METH_VARARGS},
933 {"charbuffer_encode", charbuffer_encode, METH_VARARGS},
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000934#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
Martin v. Löwis43b936d2002-01-17 23:15:58 +0000935 {"mbcs_encode", mbcs_encode, METH_VARARGS},
936 {"mbcs_decode", mbcs_decode, METH_VARARGS},
Guido van Rossum24bdb042000-03-28 20:29:59 +0000937#endif
Walter Dörwald0ae29812002-10-31 13:36:29 +0000938 {"register_error", register_error, METH_VARARGS,
939 register_error__doc__},
940 {"lookup_error", lookup_error, METH_VARARGS,
941 lookup_error__doc__},
Guido van Rossume2d67f92000-03-10 23:09:23 +0000942 {NULL, NULL} /* sentinel */
943};
944
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000945PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000946init_codecs(void)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000947{
948 Py_InitModule("_codecs", _codecs_functions);
949}