diff --git a/Doc/lib/libunicodedata.tex b/Doc/lib/libunicodedata.tex index b52b7084b7ce17..dcbda773bab3c1 100644 --- a/Doc/lib/libunicodedata.tex +++ b/Doc/lib/libunicodedata.tex @@ -131,7 +131,7 @@ \section{\module{unicodedata} --- \versionadded{2.3} \end{datadesc} -\begin{datadesc}{db_3_2_0} +\begin{datadesc}{ucd_3_2_0} This is an object that has the same methods as the entire module, but uses the Unicode database version 3.2 instead, for applications that require this specific version of diff --git a/Include/ucnhash.h b/Include/ucnhash.h index b7d3f08b655214..6231c98b30001b 100644 --- a/Include/ucnhash.h +++ b/Include/ucnhash.h @@ -16,7 +16,7 @@ typedef struct { /* Get name for a given character code. Returns non-zero if success, zero if not. Does not set Python exceptions. If self is NULL, data come from the default version of the database. - If it is not NULL, it should be a unicodedata.db_X_Y_Z object */ + If it is not NULL, it should be a unicodedata.ucd_X_Y_Z object */ int (*getname)(PyObject *self, Py_UCS4 code, char* buffer, int buflen); /* Get character code for a given name. Same error handling diff --git a/Lib/encodings/idna.py b/Lib/encodings/idna.py index fde710b395f4d9..3d3ed23ce6199b 100644 --- a/Lib/encodings/idna.py +++ b/Lib/encodings/idna.py @@ -1,7 +1,7 @@ # This module implements the RFCs 3490 (IDNA) and 3491 (Nameprep) import stringprep, re, codecs -from unicodedata import db_3_2_0 as unicodedata +from unicodedata import ucd_3_2_0 as unicodedata # IDNA section 3.1 dots = re.compile(u"[\u002E\u3002\uFF0E\uFF61]") diff --git a/Lib/stringprep.py b/Lib/stringprep.py index 225aedb85ce955..1d49dd1dddd2ac 100644 --- a/Lib/stringprep.py +++ b/Lib/stringprep.py @@ -5,7 +5,7 @@ and mappings, for which a mapping function is provided. """ -from unicodedata import db_3_2_0 as unicodedata +from unicodedata import ucd_3_2_0 as unicodedata assert unicodedata.unidata_version == '3.2.0' diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c index a8548376b9d2a3..a3152c3de4832f 100644 --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -70,67 +70,20 @@ typedef struct previous_version { #define get_old_record(self, v) ((((PreviousDBVersion*)self)->getrecord)(v)) -/* Forward declaration */ -static PyMethodDef unicodedata_functions[]; - static PyMemberDef DB_members[] = { {"unidata_version", T_STRING, offsetof(PreviousDBVersion, name), READONLY}, {NULL} }; -static PyTypeObject Xxo_Type = { - /* The ob_type field must be initialized in the module init function - * to be portable to Windows without using C++. */ - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "unicodedata.DB", /*tp_name*/ - sizeof(PreviousDBVersion), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)PyObject_Del, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - PyObject_GenericGetAttr,/*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - unicodedata_functions, /*tp_methods*/ - DB_members, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - 0, /*tp_dictoffset*/ - 0, /*tp_init*/ - 0, /*tp_alloc*/ - 0, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ -}; +// forward declaration +static PyTypeObject UCD_Type; static PyObject* new_previous_version(const char*name, const change_record* (*getrecord)(Py_UCS4), Py_UCS4 (*normalization)(Py_UCS4)) { PreviousDBVersion *self; - self = PyObject_New(PreviousDBVersion, &Xxo_Type); + self = PyObject_New(PreviousDBVersion, &UCD_Type); if (self == NULL) return NULL; self->name = name; @@ -1163,7 +1116,52 @@ static PyMethodDef unicodedata_functions[] = { {NULL, NULL} /* sentinel */ }; - +static PyTypeObject UCD_Type = { + /* The ob_type field must be initialized in the module init function + * to be portable to Windows without using C++. */ + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "unicodedata.UCD", /*tp_name*/ + sizeof(PreviousDBVersion), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)PyObject_Del, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + PyObject_GenericGetAttr,/*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + unicodedata_functions, /*tp_methods*/ + DB_members, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + 0, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ +}; PyDoc_STRVAR(unicodedata_docstring, "This module provides access to the Unicode Character Database which\n\ @@ -1180,17 +1178,20 @@ initunicodedata(void) { PyObject *m, *v; + UCD_Type.ob_type = &PyType_Type; + m = Py_InitModule3( "unicodedata", unicodedata_functions, unicodedata_docstring); if (!m) return; PyModule_AddStringConstant(m, "unidata_version", UNIDATA_VERSION); + PyModule_AddObject(m, "UCD", (PyObject*)&UCD_Type); /* Previous versions */ v = new_previous_version("3.2.0", get_change_3_2_0, normalization_3_2_0); if (v != NULL) - PyModule_AddObject(m, "db_3_2_0", v); + PyModule_AddObject(m, "ucd_3_2_0", v); /* Export C API */ v = PyCObject_FromVoidPtr((void *) &hashAPI, NULL);