From 672e118d9ba2444884418711a6fc455b0702eb9c Mon Sep 17 00:00:00 2001 From: calvin Date: Sun, 4 Apr 2004 08:30:38 +0000 Subject: [PATCH] use sorted dict git-svn-id: https://linkchecker.svn.sourceforge.net/svnroot/linkchecker/trunk/linkchecker@1295 e7d03fd6-7b0d-0410-9947-9c21f3af8025 --- linkcheck/parser/htmlparse.y | 56 ++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/linkcheck/parser/htmlparse.y b/linkcheck/parser/htmlparse.y index ec9a43b3..46948b53 100644 --- a/linkcheck/parser/htmlparse.y +++ b/linkcheck/parser/htmlparse.y @@ -44,6 +44,7 @@ static int yyerror (char* msg) { /* parser.resolve_entities */ static PyObject* resolve_entities; +static PyObject* sorted_dict; /* macros for easier scanner state manipulation */ @@ -431,7 +432,8 @@ static PyObject* parser_new (PyTypeObject* type, PyObject* args, PyObject* kwds) { return NULL; } - self->handler = NULL; + Py_INCREF(Py_None); + self->handler = Py_None; /* reset userData */ self->userData = PyMem_New(UserData, sizeof(UserData)); if (self->userData == NULL) @@ -439,7 +441,7 @@ static PyObject* parser_new (PyTypeObject* type, PyObject* args, PyObject* kwds) Py_DECREF(self); return NULL; } - self->userData->handler = NULL; + self->userData->handler = self->handler; self->userData->buf = NULL; CLEAR_BUF_DECREF(self, self->userData->buf); self->userData->nextpos = 0; @@ -455,6 +457,7 @@ static PyObject* parser_new (PyTypeObject* type, PyObject* args, PyObject* kwds) self->userData->tmp_attrval = self->userData->tmp_attrs = self->userData->lexbuf = NULL; self->userData->resolve_entities = resolve_entities; + self->userData->sorted_dict = sorted_dict; self->userData->exc_type = NULL; self->userData->exc_val = NULL; self->userData->exc_tb = NULL; @@ -471,10 +474,15 @@ static PyObject* parser_new (PyTypeObject* type, PyObject* args, PyObject* kwds) /* initialize parser object */ static int parser_init (parser_object* self, PyObject* args, PyObject* kwds) { - PyObject* handler; - if (!PyArg_ParseTuple(args, "O", &handler)) { - return -1; + PyObject* handler = NULL; + static char *kwlist[] = {"handler", NULL}; + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O", kwlist, &handler)) { + return -1; } + if (handler==NULL) { + return 0; + } + Py_DECREF(self->handler); Py_INCREF(handler); self->handler = handler; self->userData->handler = self->handler; @@ -484,7 +492,7 @@ static int parser_init (parser_object* self, PyObject* args, PyObject* kwds) { /* traverse all used subobjects participating in reference cycles */ static int parser_traverse (parser_object* self, visitproc visit, void* arg) { - if (self->handler && visit(self->handler, arg) < 0) { + if (visit(self->handler, arg) < 0) { return -1; } return 0; @@ -560,7 +568,7 @@ static PyObject* parser_flush (parser_object* self, PyObject* args) { self->userData->tmp_attrval = self->userData->tmp_attrname = NULL; self->userData->bufpos = 0; if (strlen(self->userData->buf)) { - // XXX set line, col + /* XXX set line, col */ int error = 0; PyObject* s = PyString_FromString(self->userData->buf); PyObject* callback = NULL; @@ -688,11 +696,32 @@ static PyObject* parser_debug (parser_object* self, PyObject* args) { } +static PyObject* parser_gethandler (parser_object* self, void* closure) { + Py_INCREF(self->handler); + return self->handler; +} + +static int parser_sethandler (parser_object* self, PyObject* value, void* closure) { + if (value == NULL) { + PyErr_SetString(PyExc_TypeError, "Cannot delete parser handler"); + return -1; + } + Py_DECREF(self->handler); + Py_INCREF(value); + self->handler = value; + self->userData->handler = self->handler; + return 0; +} + /* type interface */ static PyMemberDef parser_members[] = { - {"handler", T_OBJECT_EX, offsetof(parser_object, handler), 0, - "handler class"}, + {NULL} /* Sentinel */ +}; + +static PyGetSetDef parser_getset[] = { + {"handler", (getter)parser_gethandler, (setter)parser_sethandler, + "handler object", NULL}, {NULL} /* Sentinel */ }; @@ -743,7 +772,7 @@ static PyTypeObject parser_type = { 0, /* tp_iternext */ parser_methods, /* tp_methods */ parser_members, /* tp_members */ - 0, /* tp_getset */ + parser_getset, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ @@ -756,7 +785,7 @@ static PyTypeObject parser_type = { /* python module interface - "Create a new HTML parser object with given handler.\n" + "Create a new HTML parser object with handler (which may be None).\n" "\n" "Used callbacks (they don't have to be defined) of a handler are:\n" "comment(data): \n" @@ -796,10 +825,13 @@ PyMODINIT_FUNC inithtmlsax (void) { /* init error */ PyErr_Print(); } - if ((m = PyImport_ImportModule("linkcheck.parser"))==NULL) { + if ((m = PyImport_ImportModule("wc.parser"))==NULL) { return; } if ((resolve_entities = PyObject_GetAttrString(m, "resolve_entities"))==NULL) { return; } + if ((sorted_dict = PyObject_GetAttrString(m, "SortedDict"))==NULL) { + return; + } }