blob: 405fd7a29aca37e73e493064607406901c0f6d56 [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
13 lookup(encoding) -> (encoder, decoder, stream_reader, stream_writer)
14
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\
48a tuple of functions (encoder, decoder, stream_reader, stream_writer).");
49
Guido van Rossume2d67f92000-03-10 23:09:23 +000050static
Georg Brandl96a8c392006-05-29 21:04:52 +000051PyObject *codec_register(PyObject *self, PyObject *search_function)
Guido van Rossume2d67f92000-03-10 23:09:23 +000052{
Guido van Rossume2d67f92000-03-10 23:09:23 +000053 if (PyCodec_Register(search_function))
Georg Brandl96a8c392006-05-29 21:04:52 +000054 return NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +000055
Georg Brandl96a8c392006-05-29 21:04:52 +000056 Py_RETURN_NONE;
Guido van Rossume2d67f92000-03-10 23:09:23 +000057}
58
Walter Dörwald0ae29812002-10-31 13:36:29 +000059PyDoc_STRVAR(lookup__doc__,
60"lookup(encoding) -> (encoder, decoder, stream_reader, stream_writer)\n\
61\n\
62Looks up a codec tuple in the Python codec registry and returns\n\
63a tuple of functions.");
64
Guido van Rossume2d67f92000-03-10 23:09:23 +000065static
Marc-André Lemburg3f419742004-07-10 12:06:10 +000066PyObject *codec_lookup(PyObject *self, PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +000067{
68 char *encoding;
69
70 if (!PyArg_ParseTuple(args, "s:lookup", &encoding))
Georg Brandl96a8c392006-05-29 21:04:52 +000071 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +000072
73 return _PyCodec_Lookup(encoding);
Guido van Rossume2d67f92000-03-10 23:09:23 +000074}
75
Marc-André Lemburg3f419742004-07-10 12:06:10 +000076PyDoc_STRVAR(encode__doc__,
77"encode(obj, [encoding[,errors]]) -> object\n\
78\n\
79Encodes obj using the codec registered for encoding. encoding defaults\n\
80to the default encoding. errors may be given to set a different error\n\
81handling scheme. Default is 'strict' meaning that encoding errors raise\n\
82a ValueError. Other possible values are 'ignore', 'replace' and\n\
83'xmlcharrefreplace' as well as any other name registered with\n\
84codecs.register_error that can handle ValueErrors.");
85
86static PyObject *
87codec_encode(PyObject *self, PyObject *args)
88{
Brett Cannon3e377de2004-07-10 21:41:14 +000089 const char *encoding = NULL;
90 const char *errors = NULL;
Marc-André Lemburg3f419742004-07-10 12:06:10 +000091 PyObject *v;
Walter Dörwald9fd115c2005-11-02 08:30:08 +000092
Marc-André Lemburg3f419742004-07-10 12:06:10 +000093 if (!PyArg_ParseTuple(args, "O|ss:encode", &v, &encoding, &errors))
94 return NULL;
95
Martin v. Löwise2713be2005-03-08 15:03:08 +000096#ifdef Py_USING_UNICODE
Marc-André Lemburg3f419742004-07-10 12:06:10 +000097 if (encoding == NULL)
98 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwise2713be2005-03-08 15:03:08 +000099#else
100 if (encoding == NULL) {
101 PyErr_SetString(PyExc_ValueError, "no encoding specified");
102 return NULL;
103 }
104#endif
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000105
106 /* Encode via the codec registry */
Georg Brandl96a8c392006-05-29 21:04:52 +0000107 return PyCodec_Encode(v, encoding, errors);
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000108}
109
110PyDoc_STRVAR(decode__doc__,
111"decode(obj, [encoding[,errors]]) -> object\n\
112\n\
113Decodes obj using the codec registered for encoding. encoding defaults\n\
114to the default encoding. errors may be given to set a different error\n\
115handling scheme. Default is 'strict' meaning that encoding errors raise\n\
116a ValueError. Other possible values are 'ignore' and 'replace'\n\
117as well as any other name registerd with codecs.register_error that is\n\
118able to handle ValueErrors.");
119
120static PyObject *
121codec_decode(PyObject *self, PyObject *args)
122{
Brett Cannon3e377de2004-07-10 21:41:14 +0000123 const char *encoding = NULL;
124 const char *errors = NULL;
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000125 PyObject *v;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000126
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000127 if (!PyArg_ParseTuple(args, "O|ss:decode", &v, &encoding, &errors))
128 return NULL;
129
Martin v. Löwise2713be2005-03-08 15:03:08 +0000130#ifdef Py_USING_UNICODE
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000131 if (encoding == NULL)
132 encoding = PyUnicode_GetDefaultEncoding();
Martin v. Löwise2713be2005-03-08 15:03:08 +0000133#else
134 if (encoding == NULL) {
135 PyErr_SetString(PyExc_ValueError, "no encoding specified");
136 return NULL;
137 }
138#endif
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000139
140 /* Decode via the codec registry */
Georg Brandl96a8c392006-05-29 21:04:52 +0000141 return PyCodec_Decode(v, encoding, errors);
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000142}
143
Guido van Rossume2d67f92000-03-10 23:09:23 +0000144/* --- Helpers ------------------------------------------------------------ */
145
146static
147PyObject *codec_tuple(PyObject *unicode,
Martin v. Löwis66851282006-04-22 11:40:03 +0000148 Py_ssize_t len)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000149{
Georg Brandl96a8c392006-05-29 21:04:52 +0000150 PyObject *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000151 if (unicode == NULL)
Georg Brandl96a8c392006-05-29 21:04:52 +0000152 return NULL;
153 v = Py_BuildValue("On", unicode, len);
154 Py_DECREF(unicode);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000155 return v;
156}
157
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000158/* --- String codecs ------------------------------------------------------ */
159static PyObject *
160escape_decode(PyObject *self,
161 PyObject *args)
162{
163 const char *errors = NULL;
164 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000165 Py_ssize_t size;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000166
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000167 if (!PyArg_ParseTuple(args, "s#|z:escape_decode",
168 &data, &size, &errors))
169 return NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000170 return codec_tuple(PyString_DecodeEscape(data, size, errors, 0, NULL),
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000171 size);
172}
173
174static PyObject *
175escape_encode(PyObject *self,
176 PyObject *args)
177{
178 PyObject *str;
179 const char *errors = NULL;
180 char *buf;
Martin v. Löwis66851282006-04-22 11:40:03 +0000181 Py_ssize_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000182
183 if (!PyArg_ParseTuple(args, "O!|z:escape_encode",
184 &PyString_Type, &str, &errors))
185 return NULL;
186
187 str = PyString_Repr(str, 0);
188 if (!str)
189 return NULL;
190
191 /* The string will be quoted. Unquote, similar to unicode-escape. */
192 buf = PyString_AS_STRING (str);
193 len = PyString_GET_SIZE (str);
194 memmove(buf, buf+1, len-2);
195 _PyString_Resize(&str, len-2);
196
197 return codec_tuple(str, PyString_Size(str));
198}
199
200#ifdef Py_USING_UNICODE
Guido van Rossume2d67f92000-03-10 23:09:23 +0000201/* --- Decoder ------------------------------------------------------------ */
202
203static PyObject *
204unicode_internal_decode(PyObject *self,
205 PyObject *args)
206{
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000207 PyObject *obj;
208 const char *errors = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000209 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000210 Py_ssize_t size;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000211
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000212 if (!PyArg_ParseTuple(args, "O|z:unicode_internal_decode",
213 &obj, &errors))
Guido van Rossume2d67f92000-03-10 23:09:23 +0000214 return NULL;
215
Marc-André Lemburg29273c82003-02-04 19:35:03 +0000216 if (PyUnicode_Check(obj)) {
217 Py_INCREF(obj);
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000218 return codec_tuple(obj, PyUnicode_GET_SIZE(obj));
Marc-André Lemburg29273c82003-02-04 19:35:03 +0000219 }
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000220 else {
221 if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
222 return NULL;
Walter Dörwalda47d1c02005-08-30 10:23:14 +0000223
224 return codec_tuple(_PyUnicode_DecodeUnicodeInternal(data, size, errors),
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000225 size);
226 }
Guido van Rossume2d67f92000-03-10 23:09:23 +0000227}
228
229static PyObject *
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000230utf_7_decode(PyObject *self,
231 PyObject *args)
232{
233 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000234 Py_ssize_t size;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000235 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000236
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000237 if (!PyArg_ParseTuple(args, "t#|z:utf_7_decode",
238 &data, &size, &errors))
239 return NULL;
240
241 return codec_tuple(PyUnicode_DecodeUTF7(data, size, errors),
242 size);
243}
244
245static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000246utf_8_decode(PyObject *self,
247 PyObject *args)
248{
249 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000250 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000251 const char *errors = NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000252 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000253 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000254 PyObject *decoded = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000255
Walter Dörwald69652032004-09-07 20:24:22 +0000256 if (!PyArg_ParseTuple(args, "t#|zi:utf_8_decode",
257 &data, &size, &errors, &final))
258 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000259 if (size < 0) {
260 PyErr_SetString(PyExc_ValueError, "negative argument");
261 return 0;
262 }
Walter Dörwald69652032004-09-07 20:24:22 +0000263 consumed = size;
264
265 decoded = PyUnicode_DecodeUTF8Stateful(data, size, errors,
266 final ? NULL : &consumed);
267 if (decoded == NULL)
268 return NULL;
269 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000270}
271
272static PyObject *
273utf_16_decode(PyObject *self,
274 PyObject *args)
275{
276 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000277 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000278 const char *errors = NULL;
279 int byteorder = 0;
Walter Dörwald69652032004-09-07 20:24:22 +0000280 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000281 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000282 PyObject *decoded;
283
284 if (!PyArg_ParseTuple(args, "t#|zi:utf_16_decode",
285 &data, &size, &errors, &final))
Guido van Rossume2d67f92000-03-10 23:09:23 +0000286 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000287 if (size < 0) {
288 PyErr_SetString(PyExc_ValueError, "negative argument");
289 return 0;
290 }
Martin v. Löwisd532ba02006-05-27 08:54:29 +0000291 consumed = size; /* This is overwritten unless final is true. */
Walter Dörwald69652032004-09-07 20:24:22 +0000292 decoded = PyUnicode_DecodeUTF16Stateful(data, size, errors, &byteorder,
293 final ? NULL : &consumed);
294 if (decoded == NULL)
295 return NULL;
296 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000297}
298
299static PyObject *
300utf_16_le_decode(PyObject *self,
301 PyObject *args)
302{
303 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000304 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000305 const char *errors = NULL;
306 int byteorder = -1;
Walter Dörwald69652032004-09-07 20:24:22 +0000307 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000308 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000309 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000310
Walter Dörwald69652032004-09-07 20:24:22 +0000311 if (!PyArg_ParseTuple(args, "t#|zi:utf_16_le_decode",
312 &data, &size, &errors, &final))
Guido van Rossume2d67f92000-03-10 23:09:23 +0000313 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000314
Martin v. Löwis18e16552006-02-15 17:27:45 +0000315 if (size < 0) {
316 PyErr_SetString(PyExc_ValueError, "negative argument");
317 return 0;
318 }
Martin v. Löwisd532ba02006-05-27 08:54:29 +0000319 consumed = size; /* This is overwritten unless final is true. */
Walter Dörwald69652032004-09-07 20:24:22 +0000320 decoded = PyUnicode_DecodeUTF16Stateful(data, size, errors,
321 &byteorder, final ? NULL : &consumed);
322 if (decoded == NULL)
323 return NULL;
324 return codec_tuple(decoded, consumed);
325
Guido van Rossume2d67f92000-03-10 23:09:23 +0000326}
327
328static PyObject *
329utf_16_be_decode(PyObject *self,
330 PyObject *args)
331{
332 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000333 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000334 const char *errors = NULL;
335 int byteorder = 1;
Walter Dörwald69652032004-09-07 20:24:22 +0000336 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000337 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000338 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000339
Walter Dörwald69652032004-09-07 20:24:22 +0000340 if (!PyArg_ParseTuple(args, "t#|zi:utf_16_be_decode",
341 &data, &size, &errors, &final))
Guido van Rossume2d67f92000-03-10 23:09:23 +0000342 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000343 if (size < 0) {
344 PyErr_SetString(PyExc_ValueError, "negative argument");
345 return 0;
346 }
Martin v. Löwisd532ba02006-05-27 08:54:29 +0000347 consumed = size; /* This is overwritten unless final is true. */
Walter Dörwald69652032004-09-07 20:24:22 +0000348 decoded = PyUnicode_DecodeUTF16Stateful(data, size, errors,
349 &byteorder, final ? NULL : &consumed);
350 if (decoded == NULL)
351 return NULL;
352 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000353}
354
355/* This non-standard version also provides access to the byteorder
356 parameter of the builtin UTF-16 codec.
357
358 It returns a tuple (unicode, bytesread, byteorder) with byteorder
359 being the value in effect at the end of data.
360
361*/
362
363static PyObject *
364utf_16_ex_decode(PyObject *self,
365 PyObject *args)
366{
367 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000368 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000369 const char *errors = NULL;
370 int byteorder = 0;
371 PyObject *unicode, *tuple;
Walter Dörwald69652032004-09-07 20:24:22 +0000372 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000373 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000374
375 if (!PyArg_ParseTuple(args, "t#|zii:utf_16_ex_decode",
376 &data, &size, &errors, &byteorder, &final))
Guido van Rossume2d67f92000-03-10 23:09:23 +0000377 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000378 if (size < 0) {
379 PyErr_SetString(PyExc_ValueError, "negative argument");
380 return 0;
381 }
Martin v. Löwisd532ba02006-05-27 08:54:29 +0000382 consumed = size; /* This is overwritten unless final is true. */
Walter Dörwald69652032004-09-07 20:24:22 +0000383 unicode = PyUnicode_DecodeUTF16Stateful(data, size, errors, &byteorder,
384 final ? NULL : &consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000385 if (unicode == NULL)
386 return NULL;
Georg Brandl96a8c392006-05-29 21:04:52 +0000387 tuple = Py_BuildValue("Oni", unicode, consumed, byteorder);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000388 Py_DECREF(unicode);
389 return tuple;
390}
391
392static PyObject *
393unicode_escape_decode(PyObject *self,
394 PyObject *args)
395{
396 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000397 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000398 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000399
Guido van Rossume2d67f92000-03-10 23:09:23 +0000400 if (!PyArg_ParseTuple(args, "t#|z:unicode_escape_decode",
401 &data, &size, &errors))
402 return NULL;
403
404 return codec_tuple(PyUnicode_DecodeUnicodeEscape(data, size, errors),
405 size);
406}
407
408static PyObject *
409raw_unicode_escape_decode(PyObject *self,
410 PyObject *args)
411{
412 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000413 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000414 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000415
Guido van Rossume2d67f92000-03-10 23:09:23 +0000416 if (!PyArg_ParseTuple(args, "t#|z:raw_unicode_escape_decode",
417 &data, &size, &errors))
418 return NULL;
419
420 return codec_tuple(PyUnicode_DecodeRawUnicodeEscape(data, size, errors),
421 size);
422}
423
424static PyObject *
425latin_1_decode(PyObject *self,
426 PyObject *args)
427{
428 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000429 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000430 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000431
Guido van Rossume2d67f92000-03-10 23:09:23 +0000432 if (!PyArg_ParseTuple(args, "t#|z:latin_1_decode",
433 &data, &size, &errors))
434 return NULL;
435
436 return codec_tuple(PyUnicode_DecodeLatin1(data, size, errors),
437 size);
438}
439
440static PyObject *
441ascii_decode(PyObject *self,
442 PyObject *args)
443{
444 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000445 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000446 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000447
Guido van Rossume2d67f92000-03-10 23:09:23 +0000448 if (!PyArg_ParseTuple(args, "t#|z:ascii_decode",
449 &data, &size, &errors))
450 return NULL;
451
452 return codec_tuple(PyUnicode_DecodeASCII(data, size, errors),
453 size);
454}
455
456static PyObject *
457charmap_decode(PyObject *self,
458 PyObject *args)
459{
460 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000461 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000462 const char *errors = NULL;
463 PyObject *mapping = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000464
Guido van Rossume2d67f92000-03-10 23:09:23 +0000465 if (!PyArg_ParseTuple(args, "t#|zO:charmap_decode",
466 &data, &size, &errors, &mapping))
467 return NULL;
468 if (mapping == Py_None)
469 mapping = NULL;
470
471 return codec_tuple(PyUnicode_DecodeCharmap(data, size, mapping, errors),
472 size);
473}
474
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000475#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
Guido van Rossum24bdb042000-03-28 20:29:59 +0000476
477static PyObject *
478mbcs_decode(PyObject *self,
479 PyObject *args)
480{
481 const char *data;
Martin v. Löwisd8251432006-06-14 05:21:04 +0000482 Py_ssize_t size, consumed;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000483 const char *errors = NULL;
Martin v. Löwis961b91b2006-08-02 13:53:55 +0000484 int final = 0;
Martin v. Löwisd8251432006-06-14 05:21:04 +0000485 PyObject *decoded;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000486
Martin v. Löwisd8251432006-06-14 05:21:04 +0000487 if (!PyArg_ParseTuple(args, "t#|zi:mbcs_decode",
488 &data, &size, &errors, &final))
Guido van Rossum24bdb042000-03-28 20:29:59 +0000489 return NULL;
490
Martin v. Löwisd8251432006-06-14 05:21:04 +0000491 decoded = PyUnicode_DecodeMBCSStateful(
492 data, size, errors, final ? NULL : &consumed);
493 if (!decoded)
494 return NULL;
495 return codec_tuple(decoded, final ? size : consumed);
Guido van Rossum24bdb042000-03-28 20:29:59 +0000496}
497
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000498#endif /* MS_WINDOWS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000499
Guido van Rossume2d67f92000-03-10 23:09:23 +0000500/* --- Encoder ------------------------------------------------------------ */
501
502static PyObject *
503readbuffer_encode(PyObject *self,
504 PyObject *args)
505{
506 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000507 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000508 const char *errors = NULL;
509
510 if (!PyArg_ParseTuple(args, "s#|z:readbuffer_encode",
511 &data, &size, &errors))
512 return NULL;
513
514 return codec_tuple(PyString_FromStringAndSize(data, size),
515 size);
516}
517
518static PyObject *
519charbuffer_encode(PyObject *self,
520 PyObject *args)
521{
522 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000523 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000524 const char *errors = NULL;
525
526 if (!PyArg_ParseTuple(args, "t#|z:charbuffer_encode",
527 &data, &size, &errors))
528 return NULL;
529
530 return codec_tuple(PyString_FromStringAndSize(data, size),
531 size);
532}
533
534static PyObject *
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000535unicode_internal_encode(PyObject *self,
536 PyObject *args)
537{
538 PyObject *obj;
539 const char *errors = NULL;
540 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000541 Py_ssize_t size;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000542
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000543 if (!PyArg_ParseTuple(args, "O|z:unicode_internal_encode",
544 &obj, &errors))
545 return NULL;
546
547 if (PyUnicode_Check(obj)) {
548 data = PyUnicode_AS_DATA(obj);
549 size = PyUnicode_GET_DATA_SIZE(obj);
550 return codec_tuple(PyString_FromStringAndSize(data, size),
551 size);
552 }
553 else {
554 if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
555 return NULL;
556 return codec_tuple(PyString_FromStringAndSize(data, size),
557 size);
558 }
559}
560
561static PyObject *
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000562utf_7_encode(PyObject *self,
563 PyObject *args)
564{
565 PyObject *str, *v;
566 const char *errors = NULL;
567
568 if (!PyArg_ParseTuple(args, "O|z:utf_7_encode",
569 &str, &errors))
570 return NULL;
571
572 str = PyUnicode_FromObject(str);
573 if (str == NULL)
574 return NULL;
575 v = codec_tuple(PyUnicode_EncodeUTF7(PyUnicode_AS_UNICODE(str),
576 PyUnicode_GET_SIZE(str),
Georg Brandl96a8c392006-05-29 21:04:52 +0000577 0,
578 0,
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000579 errors),
580 PyUnicode_GET_SIZE(str));
581 Py_DECREF(str);
582 return v;
583}
584
585static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000586utf_8_encode(PyObject *self,
587 PyObject *args)
588{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000589 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000590 const char *errors = NULL;
591
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000592 if (!PyArg_ParseTuple(args, "O|z:utf_8_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000593 &str, &errors))
594 return NULL;
595
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000596 str = PyUnicode_FromObject(str);
597 if (str == NULL)
598 return NULL;
599 v = codec_tuple(PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(str),
600 PyUnicode_GET_SIZE(str),
601 errors),
602 PyUnicode_GET_SIZE(str));
603 Py_DECREF(str);
604 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000605}
606
607/* This version provides access to the byteorder parameter of the
608 builtin UTF-16 codecs as optional third argument. It defaults to 0
609 which means: use the native byte order and prepend the data with a
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000610 BOM mark.
Guido van Rossume2d67f92000-03-10 23:09:23 +0000611
612*/
613
614static PyObject *
615utf_16_encode(PyObject *self,
616 PyObject *args)
617{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000618 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000619 const char *errors = NULL;
620 int byteorder = 0;
621
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000622 if (!PyArg_ParseTuple(args, "O|zi:utf_16_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000623 &str, &errors, &byteorder))
624 return NULL;
625
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000626 str = PyUnicode_FromObject(str);
627 if (str == NULL)
628 return NULL;
629 v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
630 PyUnicode_GET_SIZE(str),
631 errors,
632 byteorder),
633 PyUnicode_GET_SIZE(str));
634 Py_DECREF(str);
635 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000636}
637
638static PyObject *
639utf_16_le_encode(PyObject *self,
640 PyObject *args)
641{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000642 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000643 const char *errors = NULL;
644
Marc-André Lemburg4157dd52001-06-17 18:32:36 +0000645 if (!PyArg_ParseTuple(args, "O|z:utf_16_le_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000646 &str, &errors))
647 return NULL;
648
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000649 str = PyUnicode_FromObject(str);
650 if (str == NULL)
651 return NULL;
652 v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
Guido van Rossume2d67f92000-03-10 23:09:23 +0000653 PyUnicode_GET_SIZE(str),
654 errors,
655 -1),
656 PyUnicode_GET_SIZE(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000657 Py_DECREF(str);
658 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000659}
660
661static PyObject *
662utf_16_be_encode(PyObject *self,
663 PyObject *args)
664{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000665 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000666 const char *errors = NULL;
667
Marc-André Lemburg4157dd52001-06-17 18:32:36 +0000668 if (!PyArg_ParseTuple(args, "O|z:utf_16_be_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000669 &str, &errors))
670 return NULL;
671
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000672 str = PyUnicode_FromObject(str);
673 if (str == NULL)
674 return NULL;
675 v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),
676 PyUnicode_GET_SIZE(str),
677 errors,
678 +1),
679 PyUnicode_GET_SIZE(str));
680 Py_DECREF(str);
681 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000682}
683
684static PyObject *
685unicode_escape_encode(PyObject *self,
686 PyObject *args)
687{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000688 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000689 const char *errors = NULL;
690
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000691 if (!PyArg_ParseTuple(args, "O|z:unicode_escape_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000692 &str, &errors))
693 return NULL;
694
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000695 str = PyUnicode_FromObject(str);
696 if (str == NULL)
697 return NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000698 v = codec_tuple(PyUnicode_EncodeUnicodeEscape(PyUnicode_AS_UNICODE(str),
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000699 PyUnicode_GET_SIZE(str)),
700 PyUnicode_GET_SIZE(str));
701 Py_DECREF(str);
702 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000703}
704
705static PyObject *
706raw_unicode_escape_encode(PyObject *self,
707 PyObject *args)
708{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000709 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000710 const char *errors = NULL;
711
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000712 if (!PyArg_ParseTuple(args, "O|z:raw_unicode_escape_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000713 &str, &errors))
714 return NULL;
715
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000716 str = PyUnicode_FromObject(str);
717 if (str == NULL)
718 return NULL;
719 v = codec_tuple(PyUnicode_EncodeRawUnicodeEscape(
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000720 PyUnicode_AS_UNICODE(str),
Guido van Rossume2d67f92000-03-10 23:09:23 +0000721 PyUnicode_GET_SIZE(str)),
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000722 PyUnicode_GET_SIZE(str));
723 Py_DECREF(str);
724 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000725}
726
727static PyObject *
728latin_1_encode(PyObject *self,
729 PyObject *args)
730{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000731 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000732 const char *errors = NULL;
733
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000734 if (!PyArg_ParseTuple(args, "O|z:latin_1_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000735 &str, &errors))
736 return NULL;
737
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000738 str = PyUnicode_FromObject(str);
739 if (str == NULL)
740 return NULL;
741 v = codec_tuple(PyUnicode_EncodeLatin1(
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000742 PyUnicode_AS_UNICODE(str),
Guido van Rossume2d67f92000-03-10 23:09:23 +0000743 PyUnicode_GET_SIZE(str),
744 errors),
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000745 PyUnicode_GET_SIZE(str));
746 Py_DECREF(str);
747 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000748}
749
750static PyObject *
751ascii_encode(PyObject *self,
752 PyObject *args)
753{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000754 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000755 const char *errors = NULL;
756
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000757 if (!PyArg_ParseTuple(args, "O|z:ascii_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000758 &str, &errors))
759 return NULL;
760
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000761 str = PyUnicode_FromObject(str);
762 if (str == NULL)
763 return NULL;
764 v = codec_tuple(PyUnicode_EncodeASCII(
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000765 PyUnicode_AS_UNICODE(str),
Guido van Rossume2d67f92000-03-10 23:09:23 +0000766 PyUnicode_GET_SIZE(str),
767 errors),
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000768 PyUnicode_GET_SIZE(str));
769 Py_DECREF(str);
770 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000771}
772
773static PyObject *
774charmap_encode(PyObject *self,
775 PyObject *args)
776{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000777 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000778 const char *errors = NULL;
779 PyObject *mapping = NULL;
780
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000781 if (!PyArg_ParseTuple(args, "O|zO:charmap_encode",
Guido van Rossume2d67f92000-03-10 23:09:23 +0000782 &str, &errors, &mapping))
783 return NULL;
784 if (mapping == Py_None)
785 mapping = NULL;
786
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000787 str = PyUnicode_FromObject(str);
788 if (str == NULL)
789 return NULL;
790 v = codec_tuple(PyUnicode_EncodeCharmap(
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000791 PyUnicode_AS_UNICODE(str),
Guido van Rossume2d67f92000-03-10 23:09:23 +0000792 PyUnicode_GET_SIZE(str),
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000793 mapping,
Guido van Rossume2d67f92000-03-10 23:09:23 +0000794 errors),
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000795 PyUnicode_GET_SIZE(str));
796 Py_DECREF(str);
797 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000798}
799
Martin v. Löwis3f767792006-06-04 19:36:28 +0000800static PyObject*
801charmap_build(PyObject *self, PyObject *args)
802{
803 PyObject *map;
804 if (!PyArg_ParseTuple(args, "U:charmap_build", &map))
805 return NULL;
806 return PyUnicode_BuildEncodingMap(map);
807}
808
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000809#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
Guido van Rossum24bdb042000-03-28 20:29:59 +0000810
811static PyObject *
812mbcs_encode(PyObject *self,
813 PyObject *args)
814{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000815 PyObject *str, *v;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000816 const char *errors = NULL;
817
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000818 if (!PyArg_ParseTuple(args, "O|z:mbcs_encode",
Guido van Rossum24bdb042000-03-28 20:29:59 +0000819 &str, &errors))
820 return NULL;
821
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000822 str = PyUnicode_FromObject(str);
823 if (str == NULL)
824 return NULL;
825 v = codec_tuple(PyUnicode_EncodeMBCS(
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000826 PyUnicode_AS_UNICODE(str),
Guido van Rossum24bdb042000-03-28 20:29:59 +0000827 PyUnicode_GET_SIZE(str),
828 errors),
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000829 PyUnicode_GET_SIZE(str));
830 Py_DECREF(str);
831 return v;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000832}
833
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000834#endif /* MS_WINDOWS */
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000835#endif /* Py_USING_UNICODE */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000836
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000837/* --- Error handler registry --------------------------------------------- */
838
Walter Dörwald0ae29812002-10-31 13:36:29 +0000839PyDoc_STRVAR(register_error__doc__,
840"register_error(errors, handler)\n\
841\n\
842Register the specified error handler under the name\n\
843errors. handler must be a callable object, that\n\
844will be called with an exception instance containing\n\
845information about the location of the encoding/decoding\n\
846error and must return a (replacement, new position) tuple.");
847
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000848static PyObject *register_error(PyObject *self, PyObject *args)
849{
850 const char *name;
851 PyObject *handler;
852
853 if (!PyArg_ParseTuple(args, "sO:register_error",
854 &name, &handler))
855 return NULL;
856 if (PyCodec_RegisterError(name, handler))
857 return NULL;
Georg Brandl96a8c392006-05-29 21:04:52 +0000858 Py_RETURN_NONE;
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000859}
860
Walter Dörwald0ae29812002-10-31 13:36:29 +0000861PyDoc_STRVAR(lookup_error__doc__,
862"lookup_error(errors) -> handler\n\
863\n\
864Return the error handler for the specified error handling name\n\
865or raise a LookupError, if no handler exists under this name.");
866
Walter Dörwald3aeb6322002-09-02 13:14:32 +0000867static PyObject *lookup_error(PyObject *self, PyObject *args)
868{
869 const char *name;
870
871 if (!PyArg_ParseTuple(args, "s:lookup_error",
872 &name))
873 return NULL;
874 return PyCodec_LookupError(name);
875}
876
Guido van Rossume2d67f92000-03-10 23:09:23 +0000877/* --- Module API --------------------------------------------------------- */
878
879static PyMethodDef _codecs_functions[] = {
Georg Brandl96a8c392006-05-29 21:04:52 +0000880 {"register", codec_register, METH_O,
Walter Dörwald0ae29812002-10-31 13:36:29 +0000881 register__doc__},
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000882 {"lookup", codec_lookup, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +0000883 lookup__doc__},
Brett Cannon3e377de2004-07-10 21:41:14 +0000884 {"encode", codec_encode, METH_VARARGS,
885 encode__doc__},
886 {"decode", codec_decode, METH_VARARGS,
887 decode__doc__},
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000888 {"escape_encode", escape_encode, METH_VARARGS},
889 {"escape_decode", escape_decode, METH_VARARGS},
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000890#ifdef Py_USING_UNICODE
Martin v. Löwis43b936d2002-01-17 23:15:58 +0000891 {"utf_8_encode", utf_8_encode, METH_VARARGS},
892 {"utf_8_decode", utf_8_decode, METH_VARARGS},
893 {"utf_7_encode", utf_7_encode, METH_VARARGS},
894 {"utf_7_decode", utf_7_decode, METH_VARARGS},
895 {"utf_16_encode", utf_16_encode, METH_VARARGS},
896 {"utf_16_le_encode", utf_16_le_encode, METH_VARARGS},
897 {"utf_16_be_encode", utf_16_be_encode, METH_VARARGS},
898 {"utf_16_decode", utf_16_decode, METH_VARARGS},
899 {"utf_16_le_decode", utf_16_le_decode, METH_VARARGS},
900 {"utf_16_be_decode", utf_16_be_decode, METH_VARARGS},
901 {"utf_16_ex_decode", utf_16_ex_decode, METH_VARARGS},
902 {"unicode_escape_encode", unicode_escape_encode, METH_VARARGS},
903 {"unicode_escape_decode", unicode_escape_decode, METH_VARARGS},
904 {"unicode_internal_encode", unicode_internal_encode, METH_VARARGS},
905 {"unicode_internal_decode", unicode_internal_decode, METH_VARARGS},
906 {"raw_unicode_escape_encode", raw_unicode_escape_encode, METH_VARARGS},
907 {"raw_unicode_escape_decode", raw_unicode_escape_decode, METH_VARARGS},
908 {"latin_1_encode", latin_1_encode, METH_VARARGS},
909 {"latin_1_decode", latin_1_decode, METH_VARARGS},
910 {"ascii_encode", ascii_encode, METH_VARARGS},
911 {"ascii_decode", ascii_decode, METH_VARARGS},
912 {"charmap_encode", charmap_encode, METH_VARARGS},
913 {"charmap_decode", charmap_decode, METH_VARARGS},
Martin v. Löwis3f767792006-06-04 19:36:28 +0000914 {"charmap_build", charmap_build, METH_VARARGS},
Martin v. Löwis43b936d2002-01-17 23:15:58 +0000915 {"readbuffer_encode", readbuffer_encode, METH_VARARGS},
916 {"charbuffer_encode", charbuffer_encode, METH_VARARGS},
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000917#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
Martin v. Löwis43b936d2002-01-17 23:15:58 +0000918 {"mbcs_encode", mbcs_encode, METH_VARARGS},
919 {"mbcs_decode", mbcs_decode, METH_VARARGS},
Guido van Rossum24bdb042000-03-28 20:29:59 +0000920#endif
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000921#endif /* Py_USING_UNICODE */
Walter Dörwald0ae29812002-10-31 13:36:29 +0000922 {"register_error", register_error, METH_VARARGS,
923 register_error__doc__},
924 {"lookup_error", lookup_error, METH_VARARGS,
925 lookup_error__doc__},
Guido van Rossume2d67f92000-03-10 23:09:23 +0000926 {NULL, NULL} /* sentinel */
927};
928
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000929PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000930init_codecs(void)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000931{
932 Py_InitModule("_codecs", _codecs_functions);
933}