summaryrefslogtreecommitdiffstats
path: root/Python/codecs.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/codecs.c')
-rw-r--r--Python/codecs.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/Python/codecs.c b/Python/codecs.c
index 9c0a3fa..68dc232 100644
--- a/Python/codecs.c
+++ b/Python/codecs.c
@@ -16,6 +16,12 @@ Copyright (c) Corporation for National Research Initiatives.
#include "pycore_pystate.h" // _PyInterpreterState_GET()
#include "pycore_ucnhash.h" // _PyUnicode_Name_CAPI
+static const char *codecs_builtin_error_handlers[] = {
+ "strict", "ignore", "replace",
+ "xmlcharrefreplace", "backslashreplace", "namereplace",
+ "surrogatepass", "surrogateescape",
+};
+
const char *Py_hexdigits = "0123456789abcdef";
/* --- Codec Registry ----------------------------------------------------- */
@@ -618,6 +624,20 @@ int PyCodec_RegisterError(const char *name, PyObject *error)
name, error);
}
+int _PyCodec_UnregisterError(const char *name)
+{
+ for (size_t i = 0; i < Py_ARRAY_LENGTH(codecs_builtin_error_handlers); ++i) {
+ if (strcmp(name, codecs_builtin_error_handlers[i]) == 0) {
+ PyErr_Format(PyExc_ValueError,
+ "cannot un-register built-in error handler '%s'", name);
+ return -1;
+ }
+ }
+ PyInterpreterState *interp = _PyInterpreterState_GET();
+ assert(interp->codecs.initialized);
+ return PyDict_PopString(interp->codecs.error_registry, name, NULL);
+}
+
/* Lookup the error handling callback function registered under the
name error. As a special case NULL can be passed, in which case
the error handling callback for strict encoding will be returned. */
@@ -1470,6 +1490,8 @@ _PyCodec_InitRegistry(PyInterpreterState *interp)
}
}
};
+ // ensure that the built-in error handlers' names are kept in sync
+ assert(Py_ARRAY_LENGTH(methods) == Py_ARRAY_LENGTH(codecs_builtin_error_handlers));
assert(interp->codecs.initialized == 0);
interp->codecs.search_path = PyList_New(0);