blob: 727cf5e77a3b607c7840706a5bdf30550c0c20df [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
Victor Stinner87a7c822011-11-10 20:05:55 +010041#ifdef MS_WINDOWS
42#include <windows.h>
43#endif
44
Guido van Rossume2d67f92000-03-10 23:09:23 +000045/* --- Registry ----------------------------------------------------------- */
46
Walter Dörwald0ae29812002-10-31 13:36:29 +000047PyDoc_STRVAR(register__doc__,
48"register(search_function)\n\
49\n\
50Register a codec search function. Search functions are expected to take\n\
51one argument, the encoding name in all lower case letters, and return\n\
Guido van Rossum36e0a922007-07-20 04:05:57 +000052a tuple of functions (encoder, decoder, stream_reader, stream_writer)\n\
53(or a CodecInfo object).");
Walter Dörwald0ae29812002-10-31 13:36:29 +000054
Guido van Rossume2d67f92000-03-10 23:09:23 +000055static
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000056PyObject *codec_register(PyObject *self, PyObject *search_function)
Guido van Rossume2d67f92000-03-10 23:09:23 +000057{
Guido van Rossume2d67f92000-03-10 23:09:23 +000058 if (PyCodec_Register(search_function))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000059 return NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +000060
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000061 Py_RETURN_NONE;
Guido van Rossume2d67f92000-03-10 23:09:23 +000062}
63
Walter Dörwald0ae29812002-10-31 13:36:29 +000064PyDoc_STRVAR(lookup__doc__,
Guido van Rossum36e0a922007-07-20 04:05:57 +000065"lookup(encoding) -> CodecInfo\n\
Walter Dörwald0ae29812002-10-31 13:36:29 +000066\n\
67Looks up a codec tuple in the Python codec registry and returns\n\
Benjamin Petersonf07d0022009-03-21 17:31:58 +000068a CodecInfo object.");
Walter Dörwald0ae29812002-10-31 13:36:29 +000069
Guido van Rossume2d67f92000-03-10 23:09:23 +000070static
Marc-André Lemburg3f419742004-07-10 12:06:10 +000071PyObject *codec_lookup(PyObject *self, PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +000072{
73 char *encoding;
74
75 if (!PyArg_ParseTuple(args, "s:lookup", &encoding))
Thomas Wouters4d70c3d2006-06-08 14:42:34 +000076 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +000077
78 return _PyCodec_Lookup(encoding);
Guido van Rossume2d67f92000-03-10 23:09:23 +000079}
80
Marc-André Lemburg3f419742004-07-10 12:06:10 +000081PyDoc_STRVAR(encode__doc__,
82"encode(obj, [encoding[,errors]]) -> object\n\
83\n\
84Encodes obj using the codec registered for encoding. encoding defaults\n\
85to the default encoding. errors may be given to set a different error\n\
86handling scheme. Default is 'strict' meaning that encoding errors raise\n\
87a ValueError. Other possible values are 'ignore', 'replace' and\n\
88'xmlcharrefreplace' as well as any other name registered with\n\
89codecs.register_error that can handle ValueErrors.");
90
91static PyObject *
92codec_encode(PyObject *self, PyObject *args)
93{
Brett Cannon3e377de2004-07-10 21:41:14 +000094 const char *encoding = NULL;
95 const char *errors = NULL;
Marc-André Lemburg3f419742004-07-10 12:06:10 +000096 PyObject *v;
Walter Dörwald9fd115c2005-11-02 08:30:08 +000097
Marc-André Lemburg3f419742004-07-10 12:06:10 +000098 if (!PyArg_ParseTuple(args, "O|ss:encode", &v, &encoding, &errors))
99 return NULL;
100
101 if (encoding == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 encoding = PyUnicode_GetDefaultEncoding();
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000103
104 /* Encode via the codec registry */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000105 return PyCodec_Encode(v, encoding, errors);
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000106}
107
108PyDoc_STRVAR(decode__doc__,
109"decode(obj, [encoding[,errors]]) -> object\n\
110\n\
111Decodes obj using the codec registered for encoding. encoding defaults\n\
112to the default encoding. errors may be given to set a different error\n\
113handling scheme. Default is 'strict' meaning that encoding errors raise\n\
114a ValueError. Other possible values are 'ignore' and 'replace'\n\
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000115as well as any other name registered with codecs.register_error that is\n\
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000116able to handle ValueErrors.");
117
118static PyObject *
119codec_decode(PyObject *self, PyObject *args)
120{
Brett Cannon3e377de2004-07-10 21:41:14 +0000121 const char *encoding = NULL;
122 const char *errors = NULL;
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000123 PyObject *v;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000124
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000125 if (!PyArg_ParseTuple(args, "O|ss:decode", &v, &encoding, &errors))
126 return NULL;
127
128 if (encoding == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 encoding = PyUnicode_GetDefaultEncoding();
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000130
131 /* Decode via the codec registry */
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000132 return PyCodec_Decode(v, encoding, errors);
Marc-André Lemburg3f419742004-07-10 12:06:10 +0000133}
134
Guido van Rossume2d67f92000-03-10 23:09:23 +0000135/* --- Helpers ------------------------------------------------------------ */
136
137static
138PyObject *codec_tuple(PyObject *unicode,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 Py_ssize_t len)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000140{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000141 PyObject *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000142 if (unicode == NULL)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000143 return NULL;
144 v = Py_BuildValue("On", unicode, len);
145 Py_DECREF(unicode);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000146 return v;
147}
148
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000149/* --- String codecs ------------------------------------------------------ */
150static PyObject *
151escape_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 PyObject *args)
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000153{
154 const char *errors = NULL;
155 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000156 Py_ssize_t size;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000157
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000158 if (!PyArg_ParseTuple(args, "s#|z:escape_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000159 &data, &size, &errors))
160 return NULL;
Christian Heimes72b710a2008-05-26 13:28:38 +0000161 return codec_tuple(PyBytes_DecodeEscape(data, size, errors, 0, NULL),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 size);
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000163}
164
165static PyObject *
166escape_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 PyObject *args)
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000168{
Antoine Pitroud1188562010-06-09 16:38:55 +0000169 PyObject *str;
170 Py_ssize_t size;
171 Py_ssize_t newsize;
172 const char *errors = NULL;
173 PyObject *v;
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000174
Antoine Pitroud1188562010-06-09 16:38:55 +0000175 if (!PyArg_ParseTuple(args, "O!|z:escape_encode",
176 &PyBytes_Type, &str, &errors))
177 return NULL;
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000178
Antoine Pitroud1188562010-06-09 16:38:55 +0000179 size = PyBytes_GET_SIZE(str);
180 newsize = 4*size;
181 if (newsize > PY_SSIZE_T_MAX || newsize / 4 != size) {
182 PyErr_SetString(PyExc_OverflowError,
183 "string is too large to encode");
184 return NULL;
185 }
186 v = PyBytes_FromStringAndSize(NULL, newsize);
187
188 if (v == NULL) {
189 return NULL;
190 }
191 else {
192 register Py_ssize_t i;
193 register char c;
194 register char *p = PyBytes_AS_STRING(v);
195
196 for (i = 0; i < size; i++) {
197 /* There's at least enough room for a hex escape */
198 assert(newsize - (p - PyBytes_AS_STRING(v)) >= 4);
199 c = PyBytes_AS_STRING(str)[i];
200 if (c == '\'' || c == '\\')
201 *p++ = '\\', *p++ = c;
202 else if (c == '\t')
203 *p++ = '\\', *p++ = 't';
204 else if (c == '\n')
205 *p++ = '\\', *p++ = 'n';
206 else if (c == '\r')
207 *p++ = '\\', *p++ = 'r';
208 else if (c < ' ' || c >= 0x7f) {
209 *p++ = '\\';
210 *p++ = 'x';
Victor Stinnerf5cff562011-10-14 02:13:11 +0200211 *p++ = Py_hexdigits[(c & 0xf0) >> 4];
212 *p++ = Py_hexdigits[c & 0xf];
Antoine Pitroud1188562010-06-09 16:38:55 +0000213 }
214 else
215 *p++ = c;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000216 }
Antoine Pitroud1188562010-06-09 16:38:55 +0000217 *p = '\0';
218 if (_PyBytes_Resize(&v, (p - PyBytes_AS_STRING(v)))) {
219 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 }
Antoine Pitroud1188562010-06-09 16:38:55 +0000221 }
Walter Dörwald1ab83302007-05-18 17:15:44 +0000222
Antoine Pitroud1188562010-06-09 16:38:55 +0000223 return codec_tuple(v, size);
Martin v. Löwis8a8da792002-08-14 07:46:28 +0000224}
225
Guido van Rossume2d67f92000-03-10 23:09:23 +0000226/* --- Decoder ------------------------------------------------------------ */
227
228static PyObject *
229unicode_internal_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000230 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000231{
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000232 PyObject *obj;
233 const char *errors = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000234 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000235 Py_ssize_t size;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000236
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000237 if (!PyArg_ParseTuple(args, "O|z:unicode_internal_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 &obj, &errors))
239 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000240
Marc-André Lemburg29273c82003-02-04 19:35:03 +0000241 if (PyUnicode_Check(obj)) {
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100242 if (PyUnicode_READY(obj) < 0)
243 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 Py_INCREF(obj);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100245 return codec_tuple(obj, PyUnicode_GET_LENGTH(obj));
Marc-André Lemburg29273c82003-02-04 19:35:03 +0000246 }
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000247 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
249 return NULL;
Walter Dörwalda47d1c02005-08-30 10:23:14 +0000250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000251 return codec_tuple(_PyUnicode_DecodeUnicodeInternal(data, size, errors),
252 size);
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000253 }
Guido van Rossume2d67f92000-03-10 23:09:23 +0000254}
255
256static PyObject *
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000257utf_7_decode(PyObject *self,
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000258 PyObject *args)
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000259{
Antoine Pitroud1188562010-06-09 16:38:55 +0000260 Py_buffer pbuf;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000261 const char *errors = NULL;
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000262 int final = 0;
263 Py_ssize_t consumed;
264 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000265
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000266 if (!PyArg_ParseTuple(args, "y*|zi:utf_7_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 &pbuf, &errors, &final))
268 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000269 consumed = pbuf.len;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000270
Martin v. Löwis423be952008-08-13 15:53:07 +0000271 decoded = PyUnicode_DecodeUTF7Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000273 PyBuffer_Release(&pbuf);
Christian Heimes5d14c2b2007-11-20 23:38:09 +0000274 if (decoded == NULL)
275 return NULL;
276 return codec_tuple(decoded, consumed);
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000277}
278
279static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000280utf_8_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000282{
Antoine Pitroud1188562010-06-09 16:38:55 +0000283 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000284 const char *errors = NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000285 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000286 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000287 PyObject *decoded = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000288
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000289 if (!PyArg_ParseTuple(args, "y*|zi:utf_8_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 &pbuf, &errors, &final))
291 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000292 consumed = pbuf.len;
293
294 decoded = PyUnicode_DecodeUTF8Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000296 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000297 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000298 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000299 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000300}
301
302static PyObject *
303utf_16_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000305{
Antoine Pitroud1188562010-06-09 16:38:55 +0000306 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000307 const char *errors = NULL;
308 int byteorder = 0;
Walter Dörwald69652032004-09-07 20:24:22 +0000309 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000310 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000311 PyObject *decoded;
312
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000313 if (!PyArg_ParseTuple(args, "y*|zi:utf_16_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 &pbuf, &errors, &final))
315 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000316 consumed = pbuf.len; /* This is overwritten unless final is true. */
317 decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000319 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000320 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000322 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000323}
324
325static PyObject *
326utf_16_le_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000328{
Antoine Pitroud1188562010-06-09 16:38:55 +0000329 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000330 const char *errors = NULL;
331 int byteorder = -1;
Walter Dörwald69652032004-09-07 20:24:22 +0000332 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000333 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000334 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000335
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000336 if (!PyArg_ParseTuple(args, "y*|zi:utf_16_le_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 &pbuf, &errors, &final))
338 return NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000339
Martin v. Löwis423be952008-08-13 15:53:07 +0000340 consumed = pbuf.len; /* This is overwritten unless final is true. */
341 decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000343 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000344 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000346 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000347}
348
349static PyObject *
350utf_16_be_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000352{
Antoine Pitroud1188562010-06-09 16:38:55 +0000353 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000354 const char *errors = NULL;
355 int byteorder = 1;
Walter Dörwald69652032004-09-07 20:24:22 +0000356 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000357 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000358 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000359
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000360 if (!PyArg_ParseTuple(args, "y*|zi:utf_16_be_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 &pbuf, &errors, &final))
362 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000363
364 consumed = pbuf.len; /* This is overwritten unless final is true. */
365 decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000367 PyBuffer_Release(&pbuf);
Walter Dörwald69652032004-09-07 20:24:22 +0000368 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 return NULL;
Walter Dörwald69652032004-09-07 20:24:22 +0000370 return codec_tuple(decoded, consumed);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000371}
372
373/* This non-standard version also provides access to the byteorder
374 parameter of the builtin UTF-16 codec.
375
376 It returns a tuple (unicode, bytesread, byteorder) with byteorder
377 being the value in effect at the end of data.
378
379*/
380
381static PyObject *
382utf_16_ex_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000384{
Antoine Pitroud1188562010-06-09 16:38:55 +0000385 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000386 const char *errors = NULL;
387 int byteorder = 0;
388 PyObject *unicode, *tuple;
Walter Dörwald69652032004-09-07 20:24:22 +0000389 int final = 0;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000390 Py_ssize_t consumed;
Walter Dörwald69652032004-09-07 20:24:22 +0000391
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000392 if (!PyArg_ParseTuple(args, "y*|zii:utf_16_ex_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000393 &pbuf, &errors, &byteorder, &final))
394 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000395 consumed = pbuf.len; /* This is overwritten unless final is true. */
396 unicode = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000398 PyBuffer_Release(&pbuf);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000399 if (unicode == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000401 tuple = Py_BuildValue("Oni", unicode, consumed, byteorder);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000402 Py_DECREF(unicode);
403 return tuple;
404}
405
406static PyObject *
Walter Dörwald41980ca2007-08-16 21:55:45 +0000407utf_32_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000408 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000409{
Antoine Pitroud1188562010-06-09 16:38:55 +0000410 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000411 const char *errors = NULL;
412 int byteorder = 0;
413 int final = 0;
414 Py_ssize_t consumed;
415 PyObject *decoded;
416
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000417 if (!PyArg_ParseTuple(args, "y*|zi:utf_32_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 &pbuf, &errors, &final))
419 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000420 consumed = pbuf.len; /* This is overwritten unless final is true. */
421 decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000423 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000424 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000426 return codec_tuple(decoded, consumed);
427}
428
429static PyObject *
430utf_32_le_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000432{
Antoine Pitroud1188562010-06-09 16:38:55 +0000433 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000434 const char *errors = NULL;
435 int byteorder = -1;
436 int final = 0;
437 Py_ssize_t consumed;
Martin v. Löwis423be952008-08-13 15:53:07 +0000438 PyObject *decoded;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000439
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000440 if (!PyArg_ParseTuple(args, "y*|zi:utf_32_le_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 &pbuf, &errors, &final))
442 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000443 consumed = pbuf.len; /* This is overwritten unless final is true. */
444 decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000446 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000447 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000449 return codec_tuple(decoded, consumed);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000450}
451
452static PyObject *
453utf_32_be_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000455{
Antoine Pitroud1188562010-06-09 16:38:55 +0000456 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000457 const char *errors = NULL;
458 int byteorder = 1;
459 int final = 0;
460 Py_ssize_t consumed;
Martin v. Löwis423be952008-08-13 15:53:07 +0000461 PyObject *decoded;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000462
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000463 if (!PyArg_ParseTuple(args, "y*|zi:utf_32_be_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 &pbuf, &errors, &final))
465 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000466 consumed = pbuf.len; /* This is overwritten unless final is true. */
467 decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000469 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000470 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000472 return codec_tuple(decoded, consumed);
473}
474
475/* This non-standard version also provides access to the byteorder
476 parameter of the builtin UTF-32 codec.
477
478 It returns a tuple (unicode, bytesread, byteorder) with byteorder
479 being the value in effect at the end of data.
480
481*/
482
483static PyObject *
484utf_32_ex_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000486{
Antoine Pitroud1188562010-06-09 16:38:55 +0000487 Py_buffer pbuf;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000488 const char *errors = NULL;
489 int byteorder = 0;
490 PyObject *unicode, *tuple;
491 int final = 0;
492 Py_ssize_t consumed;
493
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000494 if (!PyArg_ParseTuple(args, "y*|zii:utf_32_ex_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 &pbuf, &errors, &byteorder, &final))
496 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000497 consumed = pbuf.len; /* This is overwritten unless final is true. */
498 unicode = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000499 &byteorder, final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000500 PyBuffer_Release(&pbuf);
Walter Dörwald41980ca2007-08-16 21:55:45 +0000501 if (unicode == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000503 tuple = Py_BuildValue("Oni", unicode, consumed, byteorder);
504 Py_DECREF(unicode);
505 return tuple;
506}
507
508static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000509unicode_escape_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000511{
Antoine Pitroud1188562010-06-09 16:38:55 +0000512 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000513 const char *errors = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 PyObject *unicode;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000515
Martin v. Löwis423be952008-08-13 15:53:07 +0000516 if (!PyArg_ParseTuple(args, "s*|z:unicode_escape_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 &pbuf, &errors))
518 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000519
Antoine Pitroud1188562010-06-09 16:38:55 +0000520 unicode = PyUnicode_DecodeUnicodeEscape(pbuf.buf, pbuf.len, errors);
521 PyBuffer_Release(&pbuf);
522 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000523}
524
525static PyObject *
526raw_unicode_escape_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000528{
Antoine Pitroud1188562010-06-09 16:38:55 +0000529 Py_buffer pbuf;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000530 const char *errors = NULL;
Antoine Pitroud1188562010-06-09 16:38:55 +0000531 PyObject *unicode;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000532
Martin v. Löwis423be952008-08-13 15:53:07 +0000533 if (!PyArg_ParseTuple(args, "s*|z:raw_unicode_escape_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 &pbuf, &errors))
535 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000536
Antoine Pitroud1188562010-06-09 16:38:55 +0000537 unicode = PyUnicode_DecodeRawUnicodeEscape(pbuf.buf, pbuf.len, errors);
538 PyBuffer_Release(&pbuf);
539 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000540}
541
542static PyObject *
543latin_1_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000545{
Antoine Pitroud1188562010-06-09 16:38:55 +0000546 Py_buffer pbuf;
547 PyObject *unicode;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000548 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000549
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000550 if (!PyArg_ParseTuple(args, "y*|z:latin_1_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 &pbuf, &errors))
552 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000553
Antoine Pitroud1188562010-06-09 16:38:55 +0000554 unicode = PyUnicode_DecodeLatin1(pbuf.buf, pbuf.len, errors);
555 PyBuffer_Release(&pbuf);
556 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000557}
558
559static PyObject *
560ascii_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000562{
Antoine Pitroud1188562010-06-09 16:38:55 +0000563 Py_buffer pbuf;
564 PyObject *unicode;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000565 const char *errors = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000566
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000567 if (!PyArg_ParseTuple(args, "y*|z:ascii_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 &pbuf, &errors))
569 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000570
Antoine Pitroud1188562010-06-09 16:38:55 +0000571 unicode = PyUnicode_DecodeASCII(pbuf.buf, pbuf.len, errors);
572 PyBuffer_Release(&pbuf);
573 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000574}
575
576static PyObject *
577charmap_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000579{
Antoine Pitroud1188562010-06-09 16:38:55 +0000580 Py_buffer pbuf;
581 PyObject *unicode;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000582 const char *errors = NULL;
583 PyObject *mapping = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000584
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000585 if (!PyArg_ParseTuple(args, "y*|zO:charmap_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 &pbuf, &errors, &mapping))
587 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000588 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000590
Antoine Pitroud1188562010-06-09 16:38:55 +0000591 unicode = PyUnicode_DecodeCharmap(pbuf.buf, pbuf.len, mapping, errors);
592 PyBuffer_Release(&pbuf);
593 return codec_tuple(unicode, pbuf.len);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000594}
595
Victor Stinner99b95382011-07-04 14:23:54 +0200596#ifdef HAVE_MBCS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000597
598static PyObject *
599mbcs_decode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 PyObject *args)
Guido van Rossum24bdb042000-03-28 20:29:59 +0000601{
Antoine Pitroud1188562010-06-09 16:38:55 +0000602 Py_buffer pbuf;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000603 const char *errors = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000604 int final = 0;
Martin v. Löwis423be952008-08-13 15:53:07 +0000605 Py_ssize_t consumed;
606 PyObject *decoded = NULL;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000607
Antoine Pitrou81fabdb2009-01-22 10:11:36 +0000608 if (!PyArg_ParseTuple(args, "y*|zi:mbcs_decode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 &pbuf, &errors, &final))
610 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000611 consumed = pbuf.len;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000612
Martin v. Löwis423be952008-08-13 15:53:07 +0000613 decoded = PyUnicode_DecodeMBCSStateful(pbuf.buf, pbuf.len, errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 final ? NULL : &consumed);
Antoine Pitroud1188562010-06-09 16:38:55 +0000615 PyBuffer_Release(&pbuf);
Martin v. Löwis423be952008-08-13 15:53:07 +0000616 if (decoded == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000618 return codec_tuple(decoded, consumed);
Guido van Rossum24bdb042000-03-28 20:29:59 +0000619}
620
Victor Stinner3a50e702011-10-18 21:21:00 +0200621static PyObject *
622code_page_decode(PyObject *self,
623 PyObject *args)
624{
625 Py_buffer pbuf;
626 const char *errors = NULL;
627 int final = 0;
628 Py_ssize_t consumed;
629 PyObject *decoded = NULL;
630 int code_page;
631
632 if (!PyArg_ParseTuple(args, "iy*|zi:code_page_decode",
633 &code_page, &pbuf, &errors, &final))
634 return NULL;
635 consumed = pbuf.len;
636
637 decoded = PyUnicode_DecodeCodePageStateful(code_page,
638 pbuf.buf, pbuf.len, errors,
639 final ? NULL : &consumed);
640 PyBuffer_Release(&pbuf);
641 if (decoded == NULL)
642 return NULL;
643 return codec_tuple(decoded, consumed);
644}
645
Victor Stinner99b95382011-07-04 14:23:54 +0200646#endif /* HAVE_MBCS */
Guido van Rossum24bdb042000-03-28 20:29:59 +0000647
Guido van Rossume2d67f92000-03-10 23:09:23 +0000648/* --- Encoder ------------------------------------------------------------ */
649
650static PyObject *
651readbuffer_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000653{
Martin v. Löwis423be952008-08-13 15:53:07 +0000654 Py_buffer pdata;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000655 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000656 Py_ssize_t size;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000657 const char *errors = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000658 PyObject *result;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000659
Martin v. Löwis423be952008-08-13 15:53:07 +0000660 if (!PyArg_ParseTuple(args, "s*|z:readbuffer_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 &pdata, &errors))
662 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000663 data = pdata.buf;
664 size = pdata.len;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000665
Martin v. Löwis423be952008-08-13 15:53:07 +0000666 result = PyBytes_FromStringAndSize(data, size);
667 PyBuffer_Release(&pdata);
668 return codec_tuple(result, size);
Guido van Rossume2d67f92000-03-10 23:09:23 +0000669}
670
671static PyObject *
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000672unicode_internal_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 PyObject *args)
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000674{
675 PyObject *obj;
676 const char *errors = NULL;
677 const char *data;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000678 Py_ssize_t size;
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000679
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000680 if (!PyArg_ParseTuple(args, "O|z:unicode_internal_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 &obj, &errors))
682 return NULL;
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000683
684 if (PyUnicode_Check(obj)) {
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100685 if (PyUnicode_READY(obj) < 0)
686 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 data = PyUnicode_AS_DATA(obj);
688 size = PyUnicode_GET_DATA_SIZE(obj);
689 return codec_tuple(PyBytes_FromStringAndSize(data, size),
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100690 PyUnicode_GET_LENGTH(obj));
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000691 }
692 else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000693 if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))
694 return NULL;
695 return codec_tuple(PyBytes_FromStringAndSize(data, size), size);
Marc-André Lemburgb425f5e2000-09-21 21:09:45 +0000696 }
697}
698
699static PyObject *
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000700utf_7_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 PyObject *args)
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000702{
703 PyObject *str, *v;
704 const char *errors = NULL;
705
706 if (!PyArg_ParseTuple(args, "O|z:utf_7_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 &str, &errors))
708 return NULL;
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000709
710 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100711 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100713 v = codec_tuple(_PyUnicode_EncodeUTF7(str, 0, 0, errors),
714 PyUnicode_GET_LENGTH(str));
Marc-André Lemburgc60e6f72001-09-20 10:35:46 +0000715 Py_DECREF(str);
716 return v;
717}
718
719static PyObject *
Guido van Rossume2d67f92000-03-10 23:09:23 +0000720utf_8_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000722{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000723 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000724 const char *errors = NULL;
725
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000726 if (!PyArg_ParseTuple(args, "O|z:utf_8_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 &str, &errors))
728 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000729
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000730 str = PyUnicode_FromObject(str);
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200731 if (str == NULL || PyUnicode_READY(str) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 return NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200733 v = codec_tuple(PyUnicode_AsEncodedString(str, "utf-8", errors),
734 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000735 Py_DECREF(str);
736 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000737}
738
739/* This version provides access to the byteorder parameter of the
740 builtin UTF-16 codecs as optional third argument. It defaults to 0
741 which means: use the native byte order and prepend the data with a
Walter Dörwald9fd115c2005-11-02 08:30:08 +0000742 BOM mark.
Guido van Rossume2d67f92000-03-10 23:09:23 +0000743
744*/
745
746static PyObject *
747utf_16_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000749{
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 int byteorder = 0;
753
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000754 if (!PyArg_ParseTuple(args, "O|zi:utf_16_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 &str, &errors, &byteorder))
756 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000757
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000758 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100759 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100761 v = codec_tuple(_PyUnicode_EncodeUTF16(str, errors, byteorder),
762 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000763 Py_DECREF(str);
764 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000765}
766
767static PyObject *
768utf_16_le_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000770{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000771 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000772 const char *errors = NULL;
773
Marc-André Lemburg4157dd52001-06-17 18:32:36 +0000774 if (!PyArg_ParseTuple(args, "O|z:utf_16_le_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 &str, &errors))
776 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000777
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000778 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100779 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000780 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100781 v = codec_tuple(_PyUnicode_EncodeUTF16(str, errors, -1),
782 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000783 Py_DECREF(str);
784 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000785}
786
787static PyObject *
788utf_16_be_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000790{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000791 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000792 const char *errors = NULL;
793
Marc-André Lemburg4157dd52001-06-17 18:32:36 +0000794 if (!PyArg_ParseTuple(args, "O|z:utf_16_be_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 &str, &errors))
796 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000797
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000798 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100799 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100801 v = codec_tuple(_PyUnicode_EncodeUTF16(str, errors, +1),
802 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000803 Py_DECREF(str);
804 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000805}
806
Walter Dörwald41980ca2007-08-16 21:55:45 +0000807/* This version provides access to the byteorder parameter of the
808 builtin UTF-32 codecs as optional third argument. It defaults to 0
809 which means: use the native byte order and prepend the data with a
810 BOM mark.
811
812*/
813
814static PyObject *
815utf_32_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000816 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000817{
818 PyObject *str, *v;
819 const char *errors = NULL;
820 int byteorder = 0;
821
822 if (!PyArg_ParseTuple(args, "O|zi:utf_32_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 &str, &errors, &byteorder))
824 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000825
826 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100827 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100829 v = codec_tuple(_PyUnicode_EncodeUTF32(str, errors, byteorder),
830 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000831 Py_DECREF(str);
832 return v;
833}
834
835static PyObject *
836utf_32_le_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000838{
839 PyObject *str, *v;
840 const char *errors = NULL;
841
842 if (!PyArg_ParseTuple(args, "O|z:utf_32_le_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 &str, &errors))
844 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000845
846 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100847 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100849 v = codec_tuple(_PyUnicode_EncodeUTF32(str, errors, -1),
850 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000851 Py_DECREF(str);
852 return v;
853}
854
855static PyObject *
856utf_32_be_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 PyObject *args)
Walter Dörwald41980ca2007-08-16 21:55:45 +0000858{
859 PyObject *str, *v;
860 const char *errors = NULL;
861
862 if (!PyArg_ParseTuple(args, "O|z:utf_32_be_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 &str, &errors))
864 return NULL;
Walter Dörwald41980ca2007-08-16 21:55:45 +0000865
866 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100867 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100869 v = codec_tuple(_PyUnicode_EncodeUTF32(str, errors, +1),
870 PyUnicode_GET_LENGTH(str));
Walter Dörwald41980ca2007-08-16 21:55:45 +0000871 Py_DECREF(str);
872 return v;
873}
874
Guido van Rossume2d67f92000-03-10 23:09:23 +0000875static PyObject *
876unicode_escape_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000878{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000879 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000880 const char *errors = NULL;
881
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000882 if (!PyArg_ParseTuple(args, "O|z:unicode_escape_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 &str, &errors))
884 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000885
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000886 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100887 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000888 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100889 v = codec_tuple(PyUnicode_AsUnicodeEscapeString(str),
890 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000891 Py_DECREF(str);
892 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000893}
894
895static PyObject *
896raw_unicode_escape_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000898{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000899 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000900 const char *errors = NULL;
901
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000902 if (!PyArg_ParseTuple(args, "O|z:raw_unicode_escape_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 &str, &errors))
904 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000905
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000906 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100907 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100909 v = codec_tuple(PyUnicode_AsRawUnicodeEscapeString(str),
910 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000911 Py_DECREF(str);
912 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000913}
914
915static PyObject *
916latin_1_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000918{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000919 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000920 const char *errors = NULL;
921
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000922 if (!PyArg_ParseTuple(args, "O|z:latin_1_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 &str, &errors))
924 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000925
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000926 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100927 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100929 v = codec_tuple(_PyUnicode_AsLatin1String(str, errors),
930 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000931 Py_DECREF(str);
932 return v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000933}
934
935static PyObject *
936ascii_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 PyObject *args)
Guido van Rossume2d67f92000-03-10 23:09:23 +0000938{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000939 PyObject *str, *v;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000940 const char *errors = NULL;
941
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000942 if (!PyArg_ParseTuple(args, "O|z:ascii_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 &str, &errors))
944 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000945
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000946 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100947 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100949 v = codec_tuple(_PyUnicode_AsASCIIString(str, errors),
950 PyUnicode_GET_LENGTH(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 *
956charmap_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 PyObject *mapping = NULL;
962
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000963 if (!PyArg_ParseTuple(args, "O|zO:charmap_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 &str, &errors, &mapping))
965 return NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000966 if (mapping == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 mapping = NULL;
Guido van Rossume2d67f92000-03-10 23:09:23 +0000968
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000969 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100970 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 return NULL;
Martin v. Löwis23e275b2011-11-02 18:02:51 +0100972 v = codec_tuple(_PyUnicode_EncodeCharmap(str, mapping, errors),
Martin v. Löwis1db7c132011-11-10 18:24:32 +0100973 PyUnicode_GET_LENGTH(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
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000978static PyObject*
979charmap_build(PyObject *self, PyObject *args)
980{
981 PyObject *map;
982 if (!PyArg_ParseTuple(args, "U:charmap_build", &map))
983 return NULL;
984 return PyUnicode_BuildEncodingMap(map);
985}
986
Victor Stinner99b95382011-07-04 14:23:54 +0200987#ifdef HAVE_MBCS
Guido van Rossum24bdb042000-03-28 20:29:59 +0000988
989static PyObject *
990mbcs_encode(PyObject *self,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 PyObject *args)
Guido van Rossum24bdb042000-03-28 20:29:59 +0000992{
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000993 PyObject *str, *v;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000994 const char *errors = NULL;
995
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +0000996 if (!PyArg_ParseTuple(args, "O|z:mbcs_encode",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 &str, &errors))
998 return NULL;
Guido van Rossum24bdb042000-03-28 20:29:59 +0000999
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +00001000 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +01001001 if (str == NULL || PyUnicode_READY(str) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 return NULL;
Martin v. Löwis1db7c132011-11-10 18:24:32 +01001003 v = codec_tuple(PyUnicode_EncodeCodePage(CP_ACP, str, errors),
1004 PyUnicode_GET_LENGTH(str));
Marc-André Lemburg5f0e29e2000-07-05 11:24:13 +00001005 Py_DECREF(str);
1006 return v;
Guido van Rossum24bdb042000-03-28 20:29:59 +00001007}
1008
Victor Stinner3a50e702011-10-18 21:21:00 +02001009static PyObject *
1010code_page_encode(PyObject *self,
1011 PyObject *args)
1012{
1013 PyObject *str, *v;
1014 const char *errors = NULL;
1015 int code_page;
1016
1017 if (!PyArg_ParseTuple(args, "iO|z:code_page_encode",
1018 &code_page, &str, &errors))
1019 return NULL;
1020
1021 str = PyUnicode_FromObject(str);
Martin v. Löwis1db7c132011-11-10 18:24:32 +01001022 if (str == NULL || PyUnicode_READY(str) < 0)
Victor Stinner3a50e702011-10-18 21:21:00 +02001023 return NULL;
1024 v = codec_tuple(PyUnicode_EncodeCodePage(code_page,
1025 str,
1026 errors),
1027 PyUnicode_GET_LENGTH(str));
1028 Py_DECREF(str);
1029 return v;
1030}
1031
Victor Stinner99b95382011-07-04 14:23:54 +02001032#endif /* HAVE_MBCS */
Guido van Rossum24bdb042000-03-28 20:29:59 +00001033
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001034/* --- Error handler registry --------------------------------------------- */
1035
Walter Dörwald0ae29812002-10-31 13:36:29 +00001036PyDoc_STRVAR(register_error__doc__,
1037"register_error(errors, handler)\n\
1038\n\
1039Register the specified error handler under the name\n\
1040errors. handler must be a callable object, that\n\
1041will be called with an exception instance containing\n\
1042information about the location of the encoding/decoding\n\
1043error and must return a (replacement, new position) tuple.");
1044
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001045static PyObject *register_error(PyObject *self, PyObject *args)
1046{
1047 const char *name;
1048 PyObject *handler;
1049
1050 if (!PyArg_ParseTuple(args, "sO:register_error",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 &name, &handler))
1052 return NULL;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001053 if (PyCodec_RegisterError(name, handler))
1054 return NULL;
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00001055 Py_RETURN_NONE;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001056}
1057
Walter Dörwald0ae29812002-10-31 13:36:29 +00001058PyDoc_STRVAR(lookup_error__doc__,
1059"lookup_error(errors) -> handler\n\
1060\n\
1061Return the error handler for the specified error handling name\n\
1062or raise a LookupError, if no handler exists under this name.");
1063
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001064static PyObject *lookup_error(PyObject *self, PyObject *args)
1065{
1066 const char *name;
1067
1068 if (!PyArg_ParseTuple(args, "s:lookup_error",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 &name))
1070 return NULL;
Walter Dörwald3aeb6322002-09-02 13:14:32 +00001071 return PyCodec_LookupError(name);
1072}
1073
Guido van Rossume2d67f92000-03-10 23:09:23 +00001074/* --- Module API --------------------------------------------------------- */
1075
1076static PyMethodDef _codecs_functions[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 {"register", codec_register, METH_O,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001078 register__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 {"lookup", codec_lookup, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001080 lookup__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 {"encode", codec_encode, METH_VARARGS,
1082 encode__doc__},
1083 {"decode", codec_decode, METH_VARARGS,
1084 decode__doc__},
1085 {"escape_encode", escape_encode, METH_VARARGS},
1086 {"escape_decode", escape_decode, METH_VARARGS},
1087 {"utf_8_encode", utf_8_encode, METH_VARARGS},
1088 {"utf_8_decode", utf_8_decode, METH_VARARGS},
1089 {"utf_7_encode", utf_7_encode, METH_VARARGS},
1090 {"utf_7_decode", utf_7_decode, METH_VARARGS},
1091 {"utf_16_encode", utf_16_encode, METH_VARARGS},
1092 {"utf_16_le_encode", utf_16_le_encode, METH_VARARGS},
1093 {"utf_16_be_encode", utf_16_be_encode, METH_VARARGS},
1094 {"utf_16_decode", utf_16_decode, METH_VARARGS},
1095 {"utf_16_le_decode", utf_16_le_decode, METH_VARARGS},
1096 {"utf_16_be_decode", utf_16_be_decode, METH_VARARGS},
1097 {"utf_16_ex_decode", utf_16_ex_decode, METH_VARARGS},
1098 {"utf_32_encode", utf_32_encode, METH_VARARGS},
1099 {"utf_32_le_encode", utf_32_le_encode, METH_VARARGS},
1100 {"utf_32_be_encode", utf_32_be_encode, METH_VARARGS},
1101 {"utf_32_decode", utf_32_decode, METH_VARARGS},
1102 {"utf_32_le_decode", utf_32_le_decode, METH_VARARGS},
1103 {"utf_32_be_decode", utf_32_be_decode, METH_VARARGS},
1104 {"utf_32_ex_decode", utf_32_ex_decode, METH_VARARGS},
1105 {"unicode_escape_encode", unicode_escape_encode, METH_VARARGS},
1106 {"unicode_escape_decode", unicode_escape_decode, METH_VARARGS},
1107 {"unicode_internal_encode", unicode_internal_encode, METH_VARARGS},
1108 {"unicode_internal_decode", unicode_internal_decode, METH_VARARGS},
1109 {"raw_unicode_escape_encode", raw_unicode_escape_encode, METH_VARARGS},
1110 {"raw_unicode_escape_decode", raw_unicode_escape_decode, METH_VARARGS},
1111 {"latin_1_encode", latin_1_encode, METH_VARARGS},
1112 {"latin_1_decode", latin_1_decode, METH_VARARGS},
1113 {"ascii_encode", ascii_encode, METH_VARARGS},
1114 {"ascii_decode", ascii_decode, METH_VARARGS},
1115 {"charmap_encode", charmap_encode, METH_VARARGS},
1116 {"charmap_decode", charmap_decode, METH_VARARGS},
1117 {"charmap_build", charmap_build, METH_VARARGS},
1118 {"readbuffer_encode", readbuffer_encode, METH_VARARGS},
Victor Stinner99b95382011-07-04 14:23:54 +02001119#ifdef HAVE_MBCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 {"mbcs_encode", mbcs_encode, METH_VARARGS},
1121 {"mbcs_decode", mbcs_decode, METH_VARARGS},
Victor Stinner3a50e702011-10-18 21:21:00 +02001122 {"code_page_encode", code_page_encode, METH_VARARGS},
1123 {"code_page_decode", code_page_decode, METH_VARARGS},
Guido van Rossum24bdb042000-03-28 20:29:59 +00001124#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 {"register_error", register_error, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001126 register_error__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 {"lookup_error", lookup_error, METH_VARARGS,
Walter Dörwald0ae29812002-10-31 13:36:29 +00001128 lookup_error__doc__},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 {NULL, NULL} /* sentinel */
Guido van Rossume2d67f92000-03-10 23:09:23 +00001130};
1131
Martin v. Löwis1a214512008-06-11 05:26:20 +00001132static struct PyModuleDef codecsmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 PyModuleDef_HEAD_INIT,
1134 "_codecs",
1135 NULL,
1136 -1,
1137 _codecs_functions,
1138 NULL,
1139 NULL,
1140 NULL,
1141 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001142};
1143
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001144PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001145PyInit__codecs(void)
Guido van Rossume2d67f92000-03-10 23:09:23 +00001146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 return PyModule_Create(&codecsmodule);
Guido van Rossume2d67f92000-03-10 23:09:23 +00001148}