Avoid forward-declaring the methods array.

Rename unicodedata.db* to unicodedata.ucd*
This commit is contained in:
Martin v. Löwis 2006-03-10 11:20:04 +00:00
parent f669436189
commit 5bd7c02298
5 changed files with 57 additions and 56 deletions

View File

@ -131,7 +131,7 @@ The version of the Unicode database used in this module.
\versionadded{2.3} \versionadded{2.3}
\end{datadesc} \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 This is an object that has the same methods as the entire
module, but uses the Unicode database version 3.2 instead, module, but uses the Unicode database version 3.2 instead,
for applications that require this specific version of for applications that require this specific version of

View File

@ -16,7 +16,7 @@ typedef struct {
/* Get name for a given character code. Returns non-zero if /* Get name for a given character code. Returns non-zero if
success, zero if not. Does not set Python exceptions. success, zero if not. Does not set Python exceptions.
If self is NULL, data come from the default version of the database. 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); int (*getname)(PyObject *self, Py_UCS4 code, char* buffer, int buflen);
/* Get character code for a given name. Same error handling /* Get character code for a given name. Same error handling

View File

@ -1,7 +1,7 @@
# This module implements the RFCs 3490 (IDNA) and 3491 (Nameprep) # This module implements the RFCs 3490 (IDNA) and 3491 (Nameprep)
import stringprep, re, codecs 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 # IDNA section 3.1
dots = re.compile(u"[\u002E\u3002\uFF0E\uFF61]") dots = re.compile(u"[\u002E\u3002\uFF0E\uFF61]")

View File

@ -5,7 +5,7 @@
and mappings, for which a mapping function is provided. 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' assert unicodedata.unidata_version == '3.2.0'

View File

@ -70,67 +70,20 @@ typedef struct previous_version {
#define get_old_record(self, v) ((((PreviousDBVersion*)self)->getrecord)(v)) #define get_old_record(self, v) ((((PreviousDBVersion*)self)->getrecord)(v))
/* Forward declaration */
static PyMethodDef unicodedata_functions[];
static PyMemberDef DB_members[] = { static PyMemberDef DB_members[] = {
{"unidata_version", T_STRING, offsetof(PreviousDBVersion, name), READONLY}, {"unidata_version", T_STRING, offsetof(PreviousDBVersion, name), READONLY},
{NULL} {NULL}
}; };
static PyTypeObject Xxo_Type = { // forward declaration
/* The ob_type field must be initialized in the module init function static PyTypeObject UCD_Type;
* 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*/
};
static PyObject* static PyObject*
new_previous_version(const char*name, const change_record* (*getrecord)(Py_UCS4), new_previous_version(const char*name, const change_record* (*getrecord)(Py_UCS4),
Py_UCS4 (*normalization)(Py_UCS4)) Py_UCS4 (*normalization)(Py_UCS4))
{ {
PreviousDBVersion *self; PreviousDBVersion *self;
self = PyObject_New(PreviousDBVersion, &Xxo_Type); self = PyObject_New(PreviousDBVersion, &UCD_Type);
if (self == NULL) if (self == NULL)
return NULL; return NULL;
self->name = name; self->name = name;
@ -1163,7 +1116,52 @@ static PyMethodDef unicodedata_functions[] = {
{NULL, NULL} /* sentinel */ {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, PyDoc_STRVAR(unicodedata_docstring,
"This module provides access to the Unicode Character Database which\n\ "This module provides access to the Unicode Character Database which\n\
@ -1180,17 +1178,20 @@ initunicodedata(void)
{ {
PyObject *m, *v; PyObject *m, *v;
UCD_Type.ob_type = &PyType_Type;
m = Py_InitModule3( m = Py_InitModule3(
"unicodedata", unicodedata_functions, unicodedata_docstring); "unicodedata", unicodedata_functions, unicodedata_docstring);
if (!m) if (!m)
return; return;
PyModule_AddStringConstant(m, "unidata_version", UNIDATA_VERSION); PyModule_AddStringConstant(m, "unidata_version", UNIDATA_VERSION);
PyModule_AddObject(m, "UCD", (PyObject*)&UCD_Type);
/* Previous versions */ /* Previous versions */
v = new_previous_version("3.2.0", get_change_3_2_0, normalization_3_2_0); v = new_previous_version("3.2.0", get_change_3_2_0, normalization_3_2_0);
if (v != NULL) if (v != NULL)
PyModule_AddObject(m, "db_3_2_0", v); PyModule_AddObject(m, "ucd_3_2_0", v);
/* Export C API */ /* Export C API */
v = PyCObject_FromVoidPtr((void *) &hashAPI, NULL); v = PyCObject_FromVoidPtr((void *) &hashAPI, NULL);