Localize the function lookup in timeit.
[python.git] / Python / codecs.c
blob4b0f4cb0d04f91771d4ee617f2f0a4e380321fe2
1 /* ------------------------------------------------------------------------
3 Python Codec Registry and support functions
5 Written by Marc-Andre Lemburg (mal@lemburg.com).
7 Copyright (c) Corporation for National Research Initiatives.
9 ------------------------------------------------------------------------ */
11 #include "Python.h"
12 #include <ctype.h>
14 /* --- Codec Registry ----------------------------------------------------- */
16 /* Import the standard encodings package which will register the first
17 codec search function.
19 This is done in a lazy way so that the Unicode implementation does
20 not downgrade startup time of scripts not needing it.
22 ImportErrors are silently ignored by this function. Only one try is
23 made.
27 static int _PyCodecRegistry_Init(void); /* Forward */
29 int PyCodec_Register(PyObject *search_function)
31 PyInterpreterState *interp = PyThreadState_GET()->interp;
32 if (interp->codec_search_path == NULL && _PyCodecRegistry_Init())
33 goto onError;
34 if (search_function == NULL) {
35 PyErr_BadArgument();
36 goto onError;
38 if (!PyCallable_Check(search_function)) {
39 PyErr_SetString(PyExc_TypeError, "argument must be callable");
40 goto onError;
42 return PyList_Append(interp->codec_search_path, search_function);
44 onError:
45 return -1;
48 /* Convert a string to a normalized Python string: all characters are
49 converted to lower case, spaces are replaced with underscores. */
51 static
52 PyObject *normalizestring(const char *string)
54 register size_t i;
55 size_t len = strlen(string);
56 char *p;
57 PyObject *v;
59 if (len > PY_SSIZE_T_MAX) {
60 PyErr_SetString(PyExc_OverflowError, "string is too large");
61 return NULL;
64 v = PyString_FromStringAndSize(NULL, len);
65 if (v == NULL)
66 return NULL;
67 p = PyString_AS_STRING(v);
68 for (i = 0; i < len; i++) {
69 register char ch = string[i];
70 if (ch == ' ')
71 ch = '-';
72 else
73 ch = tolower(Py_CHARMASK(ch));
74 p[i] = ch;
76 return v;
79 /* Lookup the given encoding and return a tuple providing the codec
80 facilities.
82 The encoding string is looked up converted to all lower-case
83 characters. This makes encodings looked up through this mechanism
84 effectively case-insensitive.
86 If no codec is found, a LookupError is set and NULL returned.
88 As side effect, this tries to load the encodings package, if not
89 yet done. This is part of the lazy load strategy for the encodings
90 package.
94 PyObject *_PyCodec_Lookup(const char *encoding)
96 PyInterpreterState *interp;
97 PyObject *result, *args = NULL, *v;
98 Py_ssize_t i, len;
100 if (encoding == NULL) {
101 PyErr_BadArgument();
102 goto onError;
105 interp = PyThreadState_GET()->interp;
106 if (interp->codec_search_path == NULL && _PyCodecRegistry_Init())
107 goto onError;
109 /* Convert the encoding to a normalized Python string: all
110 characters are converted to lower case, spaces and hyphens are
111 replaced with underscores. */
112 v = normalizestring(encoding);
113 if (v == NULL)
114 goto onError;
115 PyString_InternInPlace(&v);
117 /* First, try to lookup the name in the registry dictionary */
118 result = PyDict_GetItem(interp->codec_search_cache, v);
119 if (result != NULL) {
120 Py_INCREF(result);
121 Py_DECREF(v);
122 return result;
125 /* Next, scan the search functions in order of registration */
126 args = PyTuple_New(1);
127 if (args == NULL)
128 goto onError;
129 PyTuple_SET_ITEM(args,0,v);
131 len = PyList_Size(interp->codec_search_path);
132 if (len < 0)
133 goto onError;
134 if (len == 0) {
135 PyErr_SetString(PyExc_LookupError,
136 "no codec search functions registered: "
137 "can't find encoding");
138 goto onError;
141 for (i = 0; i < len; i++) {
142 PyObject *func;
144 func = PyList_GetItem(interp->codec_search_path, i);
145 if (func == NULL)
146 goto onError;
147 result = PyEval_CallObject(func, args);
148 if (result == NULL)
149 goto onError;
150 if (result == Py_None) {
151 Py_DECREF(result);
152 continue;
154 if (!PyTuple_Check(result) || PyTuple_GET_SIZE(result) != 4) {
155 PyErr_SetString(PyExc_TypeError,
156 "codec search functions must return 4-tuples");
157 Py_DECREF(result);
158 goto onError;
160 break;
162 if (i == len) {
163 /* XXX Perhaps we should cache misses too ? */
164 PyErr_Format(PyExc_LookupError,
165 "unknown encoding: %s", encoding);
166 goto onError;
169 /* Cache and return the result */
170 PyDict_SetItem(interp->codec_search_cache, v, result);
171 Py_DECREF(args);
172 return result;
174 onError:
175 Py_XDECREF(args);
176 return NULL;
179 static
180 PyObject *args_tuple(PyObject *object,
181 const char *errors)
183 PyObject *args;
185 args = PyTuple_New(1 + (errors != NULL));
186 if (args == NULL)
187 return NULL;
188 Py_INCREF(object);
189 PyTuple_SET_ITEM(args,0,object);
190 if (errors) {
191 PyObject *v;
193 v = PyString_FromString(errors);
194 if (v == NULL) {
195 Py_DECREF(args);
196 return NULL;
198 PyTuple_SET_ITEM(args, 1, v);
200 return args;
203 /* Helper function to get a codec item */
205 static
206 PyObject *codec_getitem(const char *encoding, int index)
208 PyObject *codecs;
209 PyObject *v;
211 codecs = _PyCodec_Lookup(encoding);
212 if (codecs == NULL)
213 return NULL;
214 v = PyTuple_GET_ITEM(codecs, index);
215 Py_DECREF(codecs);
216 Py_INCREF(v);
217 return v;
220 /* Helper function to create an incremental codec. */
222 static
223 PyObject *codec_getincrementalcodec(const char *encoding,
224 const char *errors,
225 const char *attrname)
227 PyObject *codecs, *ret, *inccodec;
229 codecs = _PyCodec_Lookup(encoding);
230 if (codecs == NULL)
231 return NULL;
232 inccodec = PyObject_GetAttrString(codecs, attrname);
233 Py_DECREF(codecs);
234 if (inccodec == NULL)
235 return NULL;
236 if (errors)
237 ret = PyObject_CallFunction(inccodec, "s", errors);
238 else
239 ret = PyObject_CallFunction(inccodec, NULL);
240 Py_DECREF(inccodec);
241 return ret;
244 /* Helper function to create a stream codec. */
246 static
247 PyObject *codec_getstreamcodec(const char *encoding,
248 PyObject *stream,
249 const char *errors,
250 const int index)
252 PyObject *codecs, *streamcodec, *codeccls;
254 codecs = _PyCodec_Lookup(encoding);
255 if (codecs == NULL)
256 return NULL;
258 codeccls = PyTuple_GET_ITEM(codecs, index);
259 if (errors != NULL)
260 streamcodec = PyObject_CallFunction(codeccls, "Os", stream, errors);
261 else
262 streamcodec = PyObject_CallFunction(codeccls, "O", stream);
263 Py_DECREF(codecs);
264 return streamcodec;
267 /* Convenience APIs to query the Codec registry.
269 All APIs return a codec object with incremented refcount.
273 PyObject *PyCodec_Encoder(const char *encoding)
275 return codec_getitem(encoding, 0);
278 PyObject *PyCodec_Decoder(const char *encoding)
280 return codec_getitem(encoding, 1);
283 PyObject *PyCodec_IncrementalEncoder(const char *encoding,
284 const char *errors)
286 return codec_getincrementalcodec(encoding, errors, "incrementalencoder");
289 PyObject *PyCodec_IncrementalDecoder(const char *encoding,
290 const char *errors)
292 return codec_getincrementalcodec(encoding, errors, "incrementaldecoder");
295 PyObject *PyCodec_StreamReader(const char *encoding,
296 PyObject *stream,
297 const char *errors)
299 return codec_getstreamcodec(encoding, stream, errors, 2);
302 PyObject *PyCodec_StreamWriter(const char *encoding,
303 PyObject *stream,
304 const char *errors)
306 return codec_getstreamcodec(encoding, stream, errors, 3);
309 /* Encode an object (e.g. an Unicode object) using the given encoding
310 and return the resulting encoded object (usually a Python string).
312 errors is passed to the encoder factory as argument if non-NULL. */
314 PyObject *PyCodec_Encode(PyObject *object,
315 const char *encoding,
316 const char *errors)
318 PyObject *encoder = NULL;
319 PyObject *args = NULL, *result = NULL;
320 PyObject *v;
322 encoder = PyCodec_Encoder(encoding);
323 if (encoder == NULL)
324 goto onError;
326 args = args_tuple(object, errors);
327 if (args == NULL)
328 goto onError;
330 result = PyEval_CallObject(encoder,args);
331 if (result == NULL)
332 goto onError;
334 if (!PyTuple_Check(result) ||
335 PyTuple_GET_SIZE(result) != 2) {
336 PyErr_SetString(PyExc_TypeError,
337 "encoder must return a tuple (object,integer)");
338 goto onError;
340 v = PyTuple_GET_ITEM(result,0);
341 Py_INCREF(v);
342 /* We don't check or use the second (integer) entry. */
344 Py_DECREF(args);
345 Py_DECREF(encoder);
346 Py_DECREF(result);
347 return v;
349 onError:
350 Py_XDECREF(result);
351 Py_XDECREF(args);
352 Py_XDECREF(encoder);
353 return NULL;
356 /* Decode an object (usually a Python string) using the given encoding
357 and return an equivalent object (e.g. an Unicode object).
359 errors is passed to the decoder factory as argument if non-NULL. */
361 PyObject *PyCodec_Decode(PyObject *object,
362 const char *encoding,
363 const char *errors)
365 PyObject *decoder = NULL;
366 PyObject *args = NULL, *result = NULL;
367 PyObject *v;
369 decoder = PyCodec_Decoder(encoding);
370 if (decoder == NULL)
371 goto onError;
373 args = args_tuple(object, errors);
374 if (args == NULL)
375 goto onError;
377 result = PyEval_CallObject(decoder,args);
378 if (result == NULL)
379 goto onError;
380 if (!PyTuple_Check(result) ||
381 PyTuple_GET_SIZE(result) != 2) {
382 PyErr_SetString(PyExc_TypeError,
383 "decoder must return a tuple (object,integer)");
384 goto onError;
386 v = PyTuple_GET_ITEM(result,0);
387 Py_INCREF(v);
388 /* We don't check or use the second (integer) entry. */
390 Py_DECREF(args);
391 Py_DECREF(decoder);
392 Py_DECREF(result);
393 return v;
395 onError:
396 Py_XDECREF(args);
397 Py_XDECREF(decoder);
398 Py_XDECREF(result);
399 return NULL;
402 /* Register the error handling callback function error under the name
403 name. This function will be called by the codec when it encounters
404 an unencodable characters/undecodable bytes and doesn't know the
405 callback name, when name is specified as the error parameter
406 in the call to the encode/decode function.
407 Return 0 on success, -1 on error */
408 int PyCodec_RegisterError(const char *name, PyObject *error)
410 PyInterpreterState *interp = PyThreadState_GET()->interp;
411 if (interp->codec_search_path == NULL && _PyCodecRegistry_Init())
412 return -1;
413 if (!PyCallable_Check(error)) {
414 PyErr_SetString(PyExc_TypeError, "handler must be callable");
415 return -1;
417 return PyDict_SetItemString(interp->codec_error_registry,
418 (char *)name, error);
421 /* Lookup the error handling callback function registered under the
422 name error. As a special case NULL can be passed, in which case
423 the error handling callback for strict encoding will be returned. */
424 PyObject *PyCodec_LookupError(const char *name)
426 PyObject *handler = NULL;
428 PyInterpreterState *interp = PyThreadState_GET()->interp;
429 if (interp->codec_search_path == NULL && _PyCodecRegistry_Init())
430 return NULL;
432 if (name==NULL)
433 name = "strict";
434 handler = PyDict_GetItemString(interp->codec_error_registry, (char *)name);
435 if (!handler)
436 PyErr_Format(PyExc_LookupError, "unknown error handler name '%.400s'", name);
437 else
438 Py_INCREF(handler);
439 return handler;
442 static void wrong_exception_type(PyObject *exc)
444 PyObject *type = PyObject_GetAttrString(exc, "__class__");
445 if (type != NULL) {
446 PyObject *name = PyObject_GetAttrString(type, "__name__");
447 Py_DECREF(type);
448 if (name != NULL) {
449 PyObject *string = PyObject_Str(name);
450 Py_DECREF(name);
451 if (string != NULL) {
452 PyErr_Format(PyExc_TypeError,
453 "don't know how to handle %.400s in error callback",
454 PyString_AS_STRING(string));
455 Py_DECREF(string);
461 PyObject *PyCodec_StrictErrors(PyObject *exc)
463 if (PyExceptionInstance_Check(exc))
464 PyErr_SetObject(PyExceptionInstance_Class(exc), exc);
465 else
466 PyErr_SetString(PyExc_TypeError, "codec must pass exception instance");
467 return NULL;
471 #ifdef Py_USING_UNICODE
472 PyObject *PyCodec_IgnoreErrors(PyObject *exc)
474 Py_ssize_t end;
475 if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {
476 if (PyUnicodeEncodeError_GetEnd(exc, &end))
477 return NULL;
479 else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) {
480 if (PyUnicodeDecodeError_GetEnd(exc, &end))
481 return NULL;
483 else if (PyObject_IsInstance(exc, PyExc_UnicodeTranslateError)) {
484 if (PyUnicodeTranslateError_GetEnd(exc, &end))
485 return NULL;
487 else {
488 wrong_exception_type(exc);
489 return NULL;
491 /* ouch: passing NULL, 0, pos gives None instead of u'' */
492 return Py_BuildValue("(u#n)", &end, 0, end);
496 PyObject *PyCodec_ReplaceErrors(PyObject *exc)
498 PyObject *restuple;
499 Py_ssize_t start;
500 Py_ssize_t end;
501 Py_ssize_t i;
503 if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {
504 PyObject *res;
505 Py_UNICODE *p;
506 if (PyUnicodeEncodeError_GetStart(exc, &start))
507 return NULL;
508 if (PyUnicodeEncodeError_GetEnd(exc, &end))
509 return NULL;
510 res = PyUnicode_FromUnicode(NULL, end-start);
511 if (res == NULL)
512 return NULL;
513 for (p = PyUnicode_AS_UNICODE(res), i = start;
514 i<end; ++p, ++i)
515 *p = '?';
516 restuple = Py_BuildValue("(On)", res, end);
517 Py_DECREF(res);
518 return restuple;
520 else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) {
521 Py_UNICODE res = Py_UNICODE_REPLACEMENT_CHARACTER;
522 if (PyUnicodeDecodeError_GetEnd(exc, &end))
523 return NULL;
524 return Py_BuildValue("(u#n)", &res, 1, end);
526 else if (PyObject_IsInstance(exc, PyExc_UnicodeTranslateError)) {
527 PyObject *res;
528 Py_UNICODE *p;
529 if (PyUnicodeTranslateError_GetStart(exc, &start))
530 return NULL;
531 if (PyUnicodeTranslateError_GetEnd(exc, &end))
532 return NULL;
533 res = PyUnicode_FromUnicode(NULL, end-start);
534 if (res == NULL)
535 return NULL;
536 for (p = PyUnicode_AS_UNICODE(res), i = start;
537 i<end; ++p, ++i)
538 *p = Py_UNICODE_REPLACEMENT_CHARACTER;
539 restuple = Py_BuildValue("(On)", res, end);
540 Py_DECREF(res);
541 return restuple;
543 else {
544 wrong_exception_type(exc);
545 return NULL;
549 PyObject *PyCodec_XMLCharRefReplaceErrors(PyObject *exc)
551 if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {
552 PyObject *restuple;
553 PyObject *object;
554 Py_ssize_t start;
555 Py_ssize_t end;
556 PyObject *res;
557 Py_UNICODE *p;
558 Py_UNICODE *startp;
559 Py_UNICODE *outp;
560 int ressize;
561 if (PyUnicodeEncodeError_GetStart(exc, &start))
562 return NULL;
563 if (PyUnicodeEncodeError_GetEnd(exc, &end))
564 return NULL;
565 if (!(object = PyUnicodeEncodeError_GetObject(exc)))
566 return NULL;
567 startp = PyUnicode_AS_UNICODE(object);
568 for (p = startp+start, ressize = 0; p < startp+end; ++p) {
569 if (*p<10)
570 ressize += 2+1+1;
571 else if (*p<100)
572 ressize += 2+2+1;
573 else if (*p<1000)
574 ressize += 2+3+1;
575 else if (*p<10000)
576 ressize += 2+4+1;
577 #ifndef Py_UNICODE_WIDE
578 else
579 ressize += 2+5+1;
580 #else
581 else if (*p<100000)
582 ressize += 2+5+1;
583 else if (*p<1000000)
584 ressize += 2+6+1;
585 else
586 ressize += 2+7+1;
587 #endif
589 /* allocate replacement */
590 res = PyUnicode_FromUnicode(NULL, ressize);
591 if (res == NULL) {
592 Py_DECREF(object);
593 return NULL;
595 /* generate replacement */
596 for (p = startp+start, outp = PyUnicode_AS_UNICODE(res);
597 p < startp+end; ++p) {
598 Py_UNICODE c = *p;
599 int digits;
600 int base;
601 *outp++ = '&';
602 *outp++ = '#';
603 if (*p<10) {
604 digits = 1;
605 base = 1;
607 else if (*p<100) {
608 digits = 2;
609 base = 10;
611 else if (*p<1000) {
612 digits = 3;
613 base = 100;
615 else if (*p<10000) {
616 digits = 4;
617 base = 1000;
619 #ifndef Py_UNICODE_WIDE
620 else {
621 digits = 5;
622 base = 10000;
624 #else
625 else if (*p<100000) {
626 digits = 5;
627 base = 10000;
629 else if (*p<1000000) {
630 digits = 6;
631 base = 100000;
633 else {
634 digits = 7;
635 base = 1000000;
637 #endif
638 while (digits-->0) {
639 *outp++ = '0' + c/base;
640 c %= base;
641 base /= 10;
643 *outp++ = ';';
645 restuple = Py_BuildValue("(On)", res, end);
646 Py_DECREF(res);
647 Py_DECREF(object);
648 return restuple;
650 else {
651 wrong_exception_type(exc);
652 return NULL;
656 static Py_UNICODE hexdigits[] = {
657 '0', '1', '2', '3', '4', '5', '6', '7',
658 '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
661 PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc)
663 if (PyObject_IsInstance(exc, PyExc_UnicodeEncodeError)) {
664 PyObject *restuple;
665 PyObject *object;
666 Py_ssize_t start;
667 Py_ssize_t end;
668 PyObject *res;
669 Py_UNICODE *p;
670 Py_UNICODE *startp;
671 Py_UNICODE *outp;
672 int ressize;
673 if (PyUnicodeEncodeError_GetStart(exc, &start))
674 return NULL;
675 if (PyUnicodeEncodeError_GetEnd(exc, &end))
676 return NULL;
677 if (!(object = PyUnicodeEncodeError_GetObject(exc)))
678 return NULL;
679 startp = PyUnicode_AS_UNICODE(object);
680 for (p = startp+start, ressize = 0; p < startp+end; ++p) {
681 #ifdef Py_UNICODE_WIDE
682 if (*p >= 0x00010000)
683 ressize += 1+1+8;
684 else
685 #endif
686 if (*p >= 0x100) {
687 ressize += 1+1+4;
689 else
690 ressize += 1+1+2;
692 res = PyUnicode_FromUnicode(NULL, ressize);
693 if (res==NULL)
694 return NULL;
695 for (p = startp+start, outp = PyUnicode_AS_UNICODE(res);
696 p < startp+end; ++p) {
697 Py_UNICODE c = *p;
698 *outp++ = '\\';
699 #ifdef Py_UNICODE_WIDE
700 if (c >= 0x00010000) {
701 *outp++ = 'U';
702 *outp++ = hexdigits[(c>>28)&0xf];
703 *outp++ = hexdigits[(c>>24)&0xf];
704 *outp++ = hexdigits[(c>>20)&0xf];
705 *outp++ = hexdigits[(c>>16)&0xf];
706 *outp++ = hexdigits[(c>>12)&0xf];
707 *outp++ = hexdigits[(c>>8)&0xf];
709 else
710 #endif
711 if (c >= 0x100) {
712 *outp++ = 'u';
713 *outp++ = hexdigits[(c>>12)&0xf];
714 *outp++ = hexdigits[(c>>8)&0xf];
716 else
717 *outp++ = 'x';
718 *outp++ = hexdigits[(c>>4)&0xf];
719 *outp++ = hexdigits[c&0xf];
722 restuple = Py_BuildValue("(On)", res, end);
723 Py_DECREF(res);
724 Py_DECREF(object);
725 return restuple;
727 else {
728 wrong_exception_type(exc);
729 return NULL;
732 #endif
734 static PyObject *strict_errors(PyObject *self, PyObject *exc)
736 return PyCodec_StrictErrors(exc);
740 #ifdef Py_USING_UNICODE
741 static PyObject *ignore_errors(PyObject *self, PyObject *exc)
743 return PyCodec_IgnoreErrors(exc);
747 static PyObject *replace_errors(PyObject *self, PyObject *exc)
749 return PyCodec_ReplaceErrors(exc);
753 static PyObject *xmlcharrefreplace_errors(PyObject *self, PyObject *exc)
755 return PyCodec_XMLCharRefReplaceErrors(exc);
759 static PyObject *backslashreplace_errors(PyObject *self, PyObject *exc)
761 return PyCodec_BackslashReplaceErrors(exc);
763 #endif
765 static int _PyCodecRegistry_Init(void)
767 static struct {
768 char *name;
769 PyMethodDef def;
770 } methods[] =
773 "strict",
775 "strict_errors",
776 strict_errors,
777 METH_O
780 #ifdef Py_USING_UNICODE
782 "ignore",
784 "ignore_errors",
785 ignore_errors,
786 METH_O
790 "replace",
792 "replace_errors",
793 replace_errors,
794 METH_O
798 "xmlcharrefreplace",
800 "xmlcharrefreplace_errors",
801 xmlcharrefreplace_errors,
802 METH_O
806 "backslashreplace",
808 "backslashreplace_errors",
809 backslashreplace_errors,
810 METH_O
813 #endif
816 PyInterpreterState *interp = PyThreadState_GET()->interp;
817 PyObject *mod;
818 unsigned i;
820 if (interp->codec_search_path != NULL)
821 return 0;
823 interp->codec_search_path = PyList_New(0);
824 interp->codec_search_cache = PyDict_New();
825 interp->codec_error_registry = PyDict_New();
827 if (interp->codec_error_registry) {
828 for (i = 0; i < sizeof(methods)/sizeof(methods[0]); ++i) {
829 PyObject *func = PyCFunction_New(&methods[i].def, NULL);
830 int res;
831 if (!func)
832 Py_FatalError("can't initialize codec error registry");
833 res = PyCodec_RegisterError(methods[i].name, func);
834 Py_DECREF(func);
835 if (res)
836 Py_FatalError("can't initialize codec error registry");
840 if (interp->codec_search_path == NULL ||
841 interp->codec_search_cache == NULL ||
842 interp->codec_error_registry == NULL)
843 Py_FatalError("can't initialize codec registry");
845 mod = PyImport_ImportModuleLevel("encodings", NULL, NULL, NULL, 0);
846 if (mod == NULL) {
847 if (PyErr_ExceptionMatches(PyExc_ImportError)) {
848 /* Ignore ImportErrors... this is done so that
849 distributions can disable the encodings package. Note
850 that other errors are not masked, e.g. SystemErrors
851 raised to inform the user of an error in the Python
852 configuration are still reported back to the user. */
853 PyErr_Clear();
854 return 0;
856 return -1;
858 Py_DECREF(mod);
859 return 0;