blob: d359a7405c2fb813c5be80ad538394321f0247b2 [file] [log] [blame]
Martin v. Löwis7090ed12001-09-19 10:37:50 +00001#include "Python.h"
Fred Drake4113b132001-03-24 19:58:26 +00002#include <ctype.h>
3
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00004#include "compile.h"
5#include "frameobject.h"
Fred Drakea77254a2000-09-29 19:23:29 +00006#include "expat.h"
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00007
Martin v. Löwisc847f402003-01-21 11:09:21 +00008#define XML_COMBINED_VERSION (10000*XML_MAJOR_VERSION+100*XML_MINOR_VERSION+XML_MICRO_VERSION)
9
Martin v. Löwisb4fcf4d2002-06-30 06:40:55 +000010#ifndef PyDoc_STRVAR
Martin v. Löwis069dde22003-01-21 10:58:18 +000011
12/*
13 * fdrake says:
14 * Don't change the PyDoc_STR macro definition to (str), because
15 * '''the parentheses cause compile failures
16 * ("non-constant static initializer" or something like that)
17 * on some platforms (Irix?)'''
18 */
Fred Drakef57b22a2002-09-02 15:54:06 +000019#define PyDoc_STR(str) str
Fred Drake7c75bf22002-07-01 14:02:31 +000020#define PyDoc_VAR(name) static char name[]
Martin v. Löwisb4fcf4d2002-06-30 06:40:55 +000021#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str)
Martin v. Löwis0078f6c2001-01-21 10:18:10 +000022#endif
23
Martin v. Löwisb4fcf4d2002-06-30 06:40:55 +000024#if (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 2)
25/* In Python 2.0 and 2.1, disabling Unicode was not possible. */
Martin v. Löwis339d0f72001-08-17 18:39:25 +000026#define Py_USING_UNICODE
Jeremy Hylton9263f572003-06-27 16:13:17 +000027#else
28#define FIX_TRACE
Martin v. Löwis339d0f72001-08-17 18:39:25 +000029#endif
30
Fred Drake0582df92000-07-12 04:49:00 +000031enum HandlerTypes {
32 StartElement,
33 EndElement,
34 ProcessingInstruction,
35 CharacterData,
36 UnparsedEntityDecl,
37 NotationDecl,
38 StartNamespaceDecl,
39 EndNamespaceDecl,
40 Comment,
41 StartCdataSection,
42 EndCdataSection,
43 Default,
44 DefaultHandlerExpand,
45 NotStandalone,
Martin v. Löwis0078f6c2001-01-21 10:18:10 +000046 ExternalEntityRef,
47 StartDoctypeDecl,
48 EndDoctypeDecl,
Fred Drake85d835f2001-02-08 15:39:08 +000049 EntityDecl,
50 XmlDecl,
51 ElementDecl,
52 AttlistDecl,
Martin v. Löwisc847f402003-01-21 11:09:21 +000053#if XML_COMBINED_VERSION >= 19504
Martin v. Löwis069dde22003-01-21 10:58:18 +000054 SkippedEntity,
Martin v. Löwisc847f402003-01-21 11:09:21 +000055#endif
Fred Drake85d835f2001-02-08 15:39:08 +000056 _DummyDecl
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000057};
58
59static PyObject *ErrorObject;
60
61/* ----------------------------------------------------- */
62
63/* Declarations for objects of type xmlparser */
64
65typedef struct {
Fred Drake0582df92000-07-12 04:49:00 +000066 PyObject_HEAD
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000067
Fred Drake0582df92000-07-12 04:49:00 +000068 XML_Parser itself;
Fred Drake85d835f2001-02-08 15:39:08 +000069 int returns_unicode; /* True if Unicode strings are returned;
70 if false, UTF-8 strings are returned */
71 int ordered_attributes; /* Return attributes as a list. */
72 int specified_attributes; /* Report only specified attributes. */
Fred Drakebd6101c2001-02-14 18:29:45 +000073 int in_callback; /* Is a callback active? */
Martin v. Löwis069dde22003-01-21 10:58:18 +000074 int ns_prefixes; /* Namespace-triplets mode? */
Fred Drake2a3d7db2002-06-28 22:56:48 +000075 XML_Char *buffer; /* Buffer used when accumulating characters */
76 /* NULL if not enabled */
77 int buffer_size; /* Size of buffer, in XML_Char units */
78 int buffer_used; /* Buffer units in use */
Fred Drakeb91a36b2002-06-27 19:40:48 +000079 PyObject *intern; /* Dictionary to intern strings */
Fred Drake0582df92000-07-12 04:49:00 +000080 PyObject **handlers;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000081} xmlparseobject;
82
Fred Drake2a3d7db2002-06-28 22:56:48 +000083#define CHARACTER_DATA_BUFFER_SIZE 8192
84
Jeremy Hylton938ace62002-07-17 16:30:39 +000085static PyTypeObject Xmlparsetype;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000086
Fred Drake117ac852002-09-24 16:24:54 +000087typedef void (*xmlhandlersetter)(XML_Parser self, void *meth);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000088typedef void* xmlhandler;
89
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +000090struct HandlerInfo {
Fred Drake0582df92000-07-12 04:49:00 +000091 const char *name;
92 xmlhandlersetter setter;
93 xmlhandler handler;
Martin v. Löwis0078f6c2001-01-21 10:18:10 +000094 PyCodeObject *tb_code;
Fred Drake71b63ff2002-06-28 22:29:01 +000095 PyObject *nameobj;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000096};
97
Jeremy Hylton938ace62002-07-17 16:30:39 +000098static struct HandlerInfo handler_info[64];
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000099
Fred Drakebd6101c2001-02-14 18:29:45 +0000100/* Set an integer attribute on the error object; return true on success,
101 * false on an exception.
102 */
103static int
104set_error_attr(PyObject *err, char *name, int value)
105{
106 PyObject *v = PyInt_FromLong(value);
Fred Drake85d835f2001-02-08 15:39:08 +0000107
Fred Drakebd6101c2001-02-14 18:29:45 +0000108 if (v != NULL && PyObject_SetAttrString(err, name, v) == -1) {
109 Py_DECREF(v);
110 return 0;
111 }
Michael W. Hudson0bb84542004-08-03 11:31:31 +0000112 Py_DECREF(v);
Fred Drakebd6101c2001-02-14 18:29:45 +0000113 return 1;
114}
115
116/* Build and set an Expat exception, including positioning
117 * information. Always returns NULL.
118 */
Fred Drake85d835f2001-02-08 15:39:08 +0000119static PyObject *
Martin v. Löwis069dde22003-01-21 10:58:18 +0000120set_error(xmlparseobject *self, enum XML_Error code)
Fred Drake85d835f2001-02-08 15:39:08 +0000121{
122 PyObject *err;
123 char buffer[256];
124 XML_Parser parser = self->itself;
Fred Drakebd6101c2001-02-14 18:29:45 +0000125 int lineno = XML_GetErrorLineNumber(parser);
126 int column = XML_GetErrorColumnNumber(parser);
Fred Drake85d835f2001-02-08 15:39:08 +0000127
Martin v. Löwis6b2cf0e2002-06-30 06:03:35 +0000128 /* There is no risk of overflowing this buffer, since
129 even for 64-bit integers, there is sufficient space. */
130 sprintf(buffer, "%.200s: line %i, column %i",
Fred Drakebd6101c2001-02-14 18:29:45 +0000131 XML_ErrorString(code), lineno, column);
Fred Drake85d835f2001-02-08 15:39:08 +0000132 err = PyObject_CallFunction(ErrorObject, "s", buffer);
Fred Drakebd6101c2001-02-14 18:29:45 +0000133 if ( err != NULL
134 && set_error_attr(err, "code", code)
135 && set_error_attr(err, "offset", column)
136 && set_error_attr(err, "lineno", lineno)) {
137 PyErr_SetObject(ErrorObject, err);
Fred Drake85d835f2001-02-08 15:39:08 +0000138 }
Michael W. Hudson0bb84542004-08-03 11:31:31 +0000139 Py_DECREF(err);
Fred Drake85d835f2001-02-08 15:39:08 +0000140 return NULL;
141}
142
Fred Drake71b63ff2002-06-28 22:29:01 +0000143static int
144have_handler(xmlparseobject *self, int type)
145{
146 PyObject *handler = self->handlers[type];
147 return handler != NULL;
148}
149
150static PyObject *
151get_handler_name(struct HandlerInfo *hinfo)
152{
153 PyObject *name = hinfo->nameobj;
154 if (name == NULL) {
155 name = PyString_FromString(hinfo->name);
156 hinfo->nameobj = name;
157 }
158 Py_XINCREF(name);
159 return name;
160}
161
Fred Drake85d835f2001-02-08 15:39:08 +0000162
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000163#ifdef Py_USING_UNICODE
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000164/* Convert a string of XML_Chars into a Unicode string.
165 Returns None if str is a null pointer. */
166
Fred Drake0582df92000-07-12 04:49:00 +0000167static PyObject *
Fred Drakeb91a36b2002-06-27 19:40:48 +0000168conv_string_to_unicode(const XML_Char *str)
Fred Drake0582df92000-07-12 04:49:00 +0000169{
Fred Drake71b63ff2002-06-28 22:29:01 +0000170 /* XXX currently this code assumes that XML_Char is 8-bit,
Fred Drake0582df92000-07-12 04:49:00 +0000171 and hence in UTF-8. */
172 /* UTF-8 from Expat, Unicode desired */
173 if (str == NULL) {
174 Py_INCREF(Py_None);
175 return Py_None;
176 }
Fred Drake71b63ff2002-06-28 22:29:01 +0000177 return PyUnicode_DecodeUTF8(str, strlen(str), "strict");
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000178}
179
Fred Drake0582df92000-07-12 04:49:00 +0000180static PyObject *
181conv_string_len_to_unicode(const XML_Char *str, int len)
182{
Fred Drake71b63ff2002-06-28 22:29:01 +0000183 /* XXX currently this code assumes that XML_Char is 8-bit,
Fred Drake0582df92000-07-12 04:49:00 +0000184 and hence in UTF-8. */
185 /* UTF-8 from Expat, Unicode desired */
186 if (str == NULL) {
187 Py_INCREF(Py_None);
188 return Py_None;
189 }
Fred Drake6f987622000-08-25 18:03:30 +0000190 return PyUnicode_DecodeUTF8((const char *)str, len, "strict");
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000191}
192#endif
193
194/* Convert a string of XML_Chars into an 8-bit Python string.
195 Returns None if str is a null pointer. */
196
Fred Drake6f987622000-08-25 18:03:30 +0000197static PyObject *
Fred Drakeb91a36b2002-06-27 19:40:48 +0000198conv_string_to_utf8(const XML_Char *str)
Fred Drake6f987622000-08-25 18:03:30 +0000199{
Fred Drake71b63ff2002-06-28 22:29:01 +0000200 /* XXX currently this code assumes that XML_Char is 8-bit,
Fred Drake6f987622000-08-25 18:03:30 +0000201 and hence in UTF-8. */
202 /* UTF-8 from Expat, UTF-8 desired */
203 if (str == NULL) {
204 Py_INCREF(Py_None);
205 return Py_None;
206 }
Fred Drakeb91a36b2002-06-27 19:40:48 +0000207 return PyString_FromString(str);
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000208}
209
Fred Drake6f987622000-08-25 18:03:30 +0000210static PyObject *
Fred Drake71b63ff2002-06-28 22:29:01 +0000211conv_string_len_to_utf8(const XML_Char *str, int len)
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000212{
Fred Drake71b63ff2002-06-28 22:29:01 +0000213 /* XXX currently this code assumes that XML_Char is 8-bit,
Fred Drake6f987622000-08-25 18:03:30 +0000214 and hence in UTF-8. */
215 /* UTF-8 from Expat, UTF-8 desired */
216 if (str == NULL) {
217 Py_INCREF(Py_None);
218 return Py_None;
219 }
220 return PyString_FromStringAndSize((const char *)str, len);
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000221}
222
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000223/* Callback routines */
224
Martin v. Löwis5b68ce32001-10-21 08:53:52 +0000225static void clear_handlers(xmlparseobject *self, int initial);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000226
Martin v. Löwis069dde22003-01-21 10:58:18 +0000227/* This handler is used when an error has been detected, in the hope
228 that actual parsing can be terminated early. This will only help
229 if an external entity reference is encountered. */
230static int
231error_external_entity_ref_handler(XML_Parser parser,
232 const XML_Char *context,
233 const XML_Char *base,
234 const XML_Char *systemId,
235 const XML_Char *publicId)
236{
237 return 0;
238}
239
Fred Drake6f987622000-08-25 18:03:30 +0000240static void
241flag_error(xmlparseobject *self)
242{
Martin v. Löwis5b68ce32001-10-21 08:53:52 +0000243 clear_handlers(self, 0);
Martin v. Löwis069dde22003-01-21 10:58:18 +0000244 XML_SetExternalEntityRefHandler(self->itself,
245 error_external_entity_ref_handler);
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000246}
247
248static PyCodeObject*
249getcode(enum HandlerTypes slot, char* func_name, int lineno)
250{
Fred Drakebd6101c2001-02-14 18:29:45 +0000251 PyObject *code = NULL;
252 PyObject *name = NULL;
253 PyObject *nulltuple = NULL;
254 PyObject *filename = NULL;
255
256 if (handler_info[slot].tb_code == NULL) {
257 code = PyString_FromString("");
258 if (code == NULL)
259 goto failed;
260 name = PyString_FromString(func_name);
261 if (name == NULL)
262 goto failed;
263 nulltuple = PyTuple_New(0);
264 if (nulltuple == NULL)
265 goto failed;
266 filename = PyString_FromString(__FILE__);
267 handler_info[slot].tb_code =
268 PyCode_New(0, /* argcount */
269 0, /* nlocals */
270 0, /* stacksize */
271 0, /* flags */
272 code, /* code */
273 nulltuple, /* consts */
274 nulltuple, /* names */
275 nulltuple, /* varnames */
Martin v. Löwis76192ee2001-02-06 09:34:40 +0000276#if PYTHON_API_VERSION >= 1010
Fred Drakebd6101c2001-02-14 18:29:45 +0000277 nulltuple, /* freevars */
278 nulltuple, /* cellvars */
Martin v. Löwis76192ee2001-02-06 09:34:40 +0000279#endif
Fred Drakebd6101c2001-02-14 18:29:45 +0000280 filename, /* filename */
281 name, /* name */
282 lineno, /* firstlineno */
283 code /* lnotab */
284 );
285 if (handler_info[slot].tb_code == NULL)
286 goto failed;
287 Py_DECREF(code);
288 Py_DECREF(nulltuple);
289 Py_DECREF(filename);
290 Py_DECREF(name);
291 }
292 return handler_info[slot].tb_code;
293 failed:
294 Py_XDECREF(code);
295 Py_XDECREF(name);
296 return NULL;
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000297}
298
Jeremy Hylton9263f572003-06-27 16:13:17 +0000299#ifdef FIX_TRACE
Martin v. Löwis7d6e19d2002-08-04 08:24:49 +0000300static int
301trace_frame(PyThreadState *tstate, PyFrameObject *f, int code, PyObject *val)
302{
303 int result = 0;
304 if (!tstate->use_tracing || tstate->tracing)
305 return 0;
306 if (tstate->c_profilefunc != NULL) {
307 tstate->tracing++;
308 result = tstate->c_profilefunc(tstate->c_profileobj,
309 f, code , val);
310 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
311 || (tstate->c_profilefunc != NULL));
312 tstate->tracing--;
313 if (result)
314 return result;
315 }
316 if (tstate->c_tracefunc != NULL) {
317 tstate->tracing++;
318 result = tstate->c_tracefunc(tstate->c_traceobj,
319 f, code , val);
320 tstate->use_tracing = ((tstate->c_tracefunc != NULL)
321 || (tstate->c_profilefunc != NULL));
322 tstate->tracing--;
323 }
324 return result;
325}
Jeremy Hylton9263f572003-06-27 16:13:17 +0000326
327static int
328trace_frame_exc(PyThreadState *tstate, PyFrameObject *f)
329{
330 PyObject *type, *value, *traceback, *arg;
331 int err;
332
333 if (tstate->c_tracefunc == NULL)
334 return 0;
335
336 PyErr_Fetch(&type, &value, &traceback);
337 if (value == NULL) {
338 value = Py_None;
339 Py_INCREF(value);
340 }
Martin v. Löwis9171f022004-10-13 19:50:11 +0000341#if PY_VERSION_HEX < 0x02040000
342 arg = Py_BuildValue("(OOO)", type, value, traceback);
343#else
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000344 arg = PyTuple_Pack(3, type, value, traceback);
Martin v. Löwis9171f022004-10-13 19:50:11 +0000345#endif
Jeremy Hylton9263f572003-06-27 16:13:17 +0000346 if (arg == NULL) {
347 PyErr_Restore(type, value, traceback);
348 return 0;
349 }
350 err = trace_frame(tstate, f, PyTrace_EXCEPTION, arg);
351 Py_DECREF(arg);
352 if (err == 0)
353 PyErr_Restore(type, value, traceback);
354 else {
355 Py_XDECREF(type);
356 Py_XDECREF(value);
357 Py_XDECREF(traceback);
358 }
359 return err;
360}
Martin v. Löwis069dde22003-01-21 10:58:18 +0000361#endif
Martin v. Löwis7d6e19d2002-08-04 08:24:49 +0000362
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000363static PyObject*
Fred Drake39689c52004-08-13 03:12:57 +0000364call_with_frame(PyCodeObject *c, PyObject* func, PyObject* args,
365 xmlparseobject *self)
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000366{
Fred Drakebd6101c2001-02-14 18:29:45 +0000367 PyThreadState *tstate = PyThreadState_GET();
368 PyFrameObject *f;
369 PyObject *res;
370
371 if (c == NULL)
372 return NULL;
Martin v. Löwis7d6e19d2002-08-04 08:24:49 +0000373
Jeremy Hylton9263f572003-06-27 16:13:17 +0000374 f = PyFrame_New(tstate, c, PyEval_GetGlobals(), NULL);
Fred Drakebd6101c2001-02-14 18:29:45 +0000375 if (f == NULL)
376 return NULL;
377 tstate->frame = f;
Jeremy Hylton9263f572003-06-27 16:13:17 +0000378#ifdef FIX_TRACE
379 if (trace_frame(tstate, f, PyTrace_CALL, Py_None) < 0) {
Martin v. Löwis7d6e19d2002-08-04 08:24:49 +0000380 return NULL;
381 }
Martin v. Löwis069dde22003-01-21 10:58:18 +0000382#endif
Fred Drakebd6101c2001-02-14 18:29:45 +0000383 res = PyEval_CallObject(func, args);
Jeremy Hylton9263f572003-06-27 16:13:17 +0000384 if (res == NULL) {
385 if (tstate->curexc_traceback == NULL)
386 PyTraceBack_Here(f);
Fred Drake39689c52004-08-13 03:12:57 +0000387 XML_StopParser(self->itself, XML_FALSE);
Jeremy Hylton9263f572003-06-27 16:13:17 +0000388#ifdef FIX_TRACE
389 if (trace_frame_exc(tstate, f) < 0) {
390 return NULL;
391 }
392 }
Martin v. Löwis7d6e19d2002-08-04 08:24:49 +0000393 else {
Jeremy Hylton9263f572003-06-27 16:13:17 +0000394 if (trace_frame(tstate, f, PyTrace_RETURN, res) < 0) {
Martin v. Löwis7d6e19d2002-08-04 08:24:49 +0000395 Py_XDECREF(res);
396 res = NULL;
397 }
398 }
Jeremy Hylton9263f572003-06-27 16:13:17 +0000399#else
400 }
Martin v. Löwis069dde22003-01-21 10:58:18 +0000401#endif
Fred Drakebd6101c2001-02-14 18:29:45 +0000402 tstate->frame = f->f_back;
403 Py_DECREF(f);
404 return res;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000405}
406
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000407#ifndef Py_USING_UNICODE
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000408#define STRING_CONV_FUNC conv_string_to_utf8
409#else
Martin v. Löwis069dde22003-01-21 10:58:18 +0000410/* Python 2.0 and later versions, when built with Unicode support */
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000411#define STRING_CONV_FUNC (self->returns_unicode \
412 ? conv_string_to_unicode : conv_string_to_utf8)
413#endif
Guido van Rossum5961f5a2000-03-31 16:18:11 +0000414
Fred Drakeb91a36b2002-06-27 19:40:48 +0000415static PyObject*
416string_intern(xmlparseobject *self, const char* str)
417{
418 PyObject *result = STRING_CONV_FUNC(str);
419 PyObject *value;
420 if (!self->intern)
421 return result;
422 value = PyDict_GetItem(self->intern, result);
423 if (!value) {
424 if (PyDict_SetItem(self->intern, result, result) == 0)
425 return result;
426 else
427 return NULL;
428 }
429 Py_INCREF(value);
430 Py_DECREF(result);
431 return value;
432}
433
Fred Drake2a3d7db2002-06-28 22:56:48 +0000434/* Return 0 on success, -1 on exception.
435 * flag_error() will be called before return if needed.
436 */
437static int
438call_character_handler(xmlparseobject *self, const XML_Char *buffer, int len)
439{
440 PyObject *args;
441 PyObject *temp;
442
443 args = PyTuple_New(1);
444 if (args == NULL)
445 return -1;
446#ifdef Py_USING_UNICODE
447 temp = (self->returns_unicode
448 ? conv_string_len_to_unicode(buffer, len)
449 : conv_string_len_to_utf8(buffer, len));
450#else
451 temp = conv_string_len_to_utf8(buffer, len);
452#endif
453 if (temp == NULL) {
454 Py_DECREF(args);
455 flag_error(self);
456 return -1;
457 }
458 PyTuple_SET_ITEM(args, 0, temp);
459 /* temp is now a borrowed reference; consider it unused. */
460 self->in_callback = 1;
461 temp = call_with_frame(getcode(CharacterData, "CharacterData", __LINE__),
Fred Drake39689c52004-08-13 03:12:57 +0000462 self->handlers[CharacterData], args, self);
Fred Drake2a3d7db2002-06-28 22:56:48 +0000463 /* temp is an owned reference again, or NULL */
464 self->in_callback = 0;
465 Py_DECREF(args);
466 if (temp == NULL) {
467 flag_error(self);
468 return -1;
469 }
470 Py_DECREF(temp);
471 return 0;
472}
473
474static int
475flush_character_buffer(xmlparseobject *self)
476{
477 int rc;
478 if (self->buffer == NULL || self->buffer_used == 0)
479 return 0;
480 rc = call_character_handler(self, self->buffer, self->buffer_used);
481 self->buffer_used = 0;
482 return rc;
483}
484
485static void
486my_CharacterDataHandler(void *userData, const XML_Char *data, int len)
487{
488 xmlparseobject *self = (xmlparseobject *) userData;
489 if (self->buffer == NULL)
490 call_character_handler(self, data, len);
491 else {
492 if ((self->buffer_used + len) > self->buffer_size) {
493 if (flush_character_buffer(self) < 0)
494 return;
495 /* handler might have changed; drop the rest on the floor
496 * if there isn't a handler anymore
497 */
498 if (!have_handler(self, CharacterData))
499 return;
500 }
501 if (len > self->buffer_size) {
502 call_character_handler(self, data, len);
503 self->buffer_used = 0;
504 }
505 else {
506 memcpy(self->buffer + self->buffer_used,
507 data, len * sizeof(XML_Char));
508 self->buffer_used += len;
509 }
510 }
511}
512
Fred Drake85d835f2001-02-08 15:39:08 +0000513static void
514my_StartElementHandler(void *userData,
Fred Drake71b63ff2002-06-28 22:29:01 +0000515 const XML_Char *name, const XML_Char *atts[])
Fred Drake85d835f2001-02-08 15:39:08 +0000516{
517 xmlparseobject *self = (xmlparseobject *)userData;
518
Fred Drake71b63ff2002-06-28 22:29:01 +0000519 if (have_handler(self, StartElement)) {
Fred Drake85d835f2001-02-08 15:39:08 +0000520 PyObject *container, *rv, *args;
521 int i, max;
522
Fred Drake2a3d7db2002-06-28 22:56:48 +0000523 if (flush_character_buffer(self) < 0)
524 return;
Fred Drake85d835f2001-02-08 15:39:08 +0000525 /* Set max to the number of slots filled in atts[]; max/2 is
526 * the number of attributes we need to process.
527 */
528 if (self->specified_attributes) {
529 max = XML_GetSpecifiedAttributeCount(self->itself);
530 }
531 else {
532 max = 0;
533 while (atts[max] != NULL)
534 max += 2;
535 }
536 /* Build the container. */
537 if (self->ordered_attributes)
538 container = PyList_New(max);
539 else
540 container = PyDict_New();
541 if (container == NULL) {
542 flag_error(self);
543 return;
544 }
545 for (i = 0; i < max; i += 2) {
Fred Drakeb91a36b2002-06-27 19:40:48 +0000546 PyObject *n = string_intern(self, (XML_Char *) atts[i]);
Fred Drake85d835f2001-02-08 15:39:08 +0000547 PyObject *v;
548 if (n == NULL) {
549 flag_error(self);
550 Py_DECREF(container);
551 return;
552 }
553 v = STRING_CONV_FUNC((XML_Char *) atts[i+1]);
554 if (v == NULL) {
555 flag_error(self);
556 Py_DECREF(container);
557 Py_DECREF(n);
558 return;
559 }
560 if (self->ordered_attributes) {
561 PyList_SET_ITEM(container, i, n);
562 PyList_SET_ITEM(container, i+1, v);
563 }
564 else if (PyDict_SetItem(container, n, v)) {
565 flag_error(self);
566 Py_DECREF(n);
567 Py_DECREF(v);
568 return;
569 }
570 else {
571 Py_DECREF(n);
572 Py_DECREF(v);
573 }
574 }
Fred Drakeb91a36b2002-06-27 19:40:48 +0000575 args = Py_BuildValue("(NN)", string_intern(self, name), container);
Fred Drake85d835f2001-02-08 15:39:08 +0000576 if (args == NULL) {
577 Py_DECREF(container);
578 return;
579 }
580 /* Container is now a borrowed reference; ignore it. */
Fred Drakebd6101c2001-02-14 18:29:45 +0000581 self->in_callback = 1;
582 rv = call_with_frame(getcode(StartElement, "StartElement", __LINE__),
Fred Drake39689c52004-08-13 03:12:57 +0000583 self->handlers[StartElement], args, self);
Fred Drakebd6101c2001-02-14 18:29:45 +0000584 self->in_callback = 0;
585 Py_DECREF(args);
Fred Drake85d835f2001-02-08 15:39:08 +0000586 if (rv == NULL) {
587 flag_error(self);
588 return;
Fred Drakebd6101c2001-02-14 18:29:45 +0000589 }
Fred Drake85d835f2001-02-08 15:39:08 +0000590 Py_DECREF(rv);
591 }
592}
593
594#define RC_HANDLER(RC, NAME, PARAMS, INIT, PARAM_FORMAT, CONVERSION, \
595 RETURN, GETUSERDATA) \
596static RC \
597my_##NAME##Handler PARAMS {\
598 xmlparseobject *self = GETUSERDATA ; \
599 PyObject *args = NULL; \
600 PyObject *rv = NULL; \
601 INIT \
602\
Fred Drake71b63ff2002-06-28 22:29:01 +0000603 if (have_handler(self, NAME)) { \
Fred Drake2a3d7db2002-06-28 22:56:48 +0000604 if (flush_character_buffer(self) < 0) \
605 return RETURN; \
Fred Drake85d835f2001-02-08 15:39:08 +0000606 args = Py_BuildValue PARAM_FORMAT ;\
Martin v. Löwis1d7c55f2001-11-10 13:57:55 +0000607 if (!args) { flag_error(self); return RETURN;} \
Fred Drakebd6101c2001-02-14 18:29:45 +0000608 self->in_callback = 1; \
Fred Drake85d835f2001-02-08 15:39:08 +0000609 rv = call_with_frame(getcode(NAME,#NAME,__LINE__), \
Fred Drake39689c52004-08-13 03:12:57 +0000610 self->handlers[NAME], args, self); \
Fred Drakebd6101c2001-02-14 18:29:45 +0000611 self->in_callback = 0; \
Fred Drake85d835f2001-02-08 15:39:08 +0000612 Py_DECREF(args); \
613 if (rv == NULL) { \
614 flag_error(self); \
615 return RETURN; \
616 } \
617 CONVERSION \
618 Py_DECREF(rv); \
619 } \
620 return RETURN; \
621}
622
Fred Drake6f987622000-08-25 18:03:30 +0000623#define VOID_HANDLER(NAME, PARAMS, PARAM_FORMAT) \
624 RC_HANDLER(void, NAME, PARAMS, ;, PARAM_FORMAT, ;, ;,\
625 (xmlparseobject *)userData)
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000626
Fred Drake6f987622000-08-25 18:03:30 +0000627#define INT_HANDLER(NAME, PARAMS, PARAM_FORMAT)\
628 RC_HANDLER(int, NAME, PARAMS, int rc=0;, PARAM_FORMAT, \
629 rc = PyInt_AsLong(rv);, rc, \
630 (xmlparseobject *)userData)
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000631
Fred Drake71b63ff2002-06-28 22:29:01 +0000632VOID_HANDLER(EndElement,
633 (void *userData, const XML_Char *name),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000634 ("(N)", string_intern(self, name)))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000635
Fred Drake6f987622000-08-25 18:03:30 +0000636VOID_HANDLER(ProcessingInstruction,
Fred Drake71b63ff2002-06-28 22:29:01 +0000637 (void *userData,
638 const XML_Char *target,
Fred Drake85d835f2001-02-08 15:39:08 +0000639 const XML_Char *data),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000640 ("(NO&)", string_intern(self, target), STRING_CONV_FUNC,data))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000641
Fred Drake6f987622000-08-25 18:03:30 +0000642VOID_HANDLER(UnparsedEntityDecl,
Fred Drake71b63ff2002-06-28 22:29:01 +0000643 (void *userData,
Fred Drake85d835f2001-02-08 15:39:08 +0000644 const XML_Char *entityName,
645 const XML_Char *base,
646 const XML_Char *systemId,
647 const XML_Char *publicId,
648 const XML_Char *notationName),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000649 ("(NNNNN)",
Fred Drake71b63ff2002-06-28 22:29:01 +0000650 string_intern(self, entityName), string_intern(self, base),
651 string_intern(self, systemId), string_intern(self, publicId),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000652 string_intern(self, notationName)))
Fred Drake85d835f2001-02-08 15:39:08 +0000653
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000654#ifndef Py_USING_UNICODE
Fred Drake85d835f2001-02-08 15:39:08 +0000655VOID_HANDLER(EntityDecl,
656 (void *userData,
657 const XML_Char *entityName,
658 int is_parameter_entity,
659 const XML_Char *value,
660 int value_length,
661 const XML_Char *base,
662 const XML_Char *systemId,
663 const XML_Char *publicId,
664 const XML_Char *notationName),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000665 ("NiNNNNN",
666 string_intern(self, entityName), is_parameter_entity,
Fred Drake85d835f2001-02-08 15:39:08 +0000667 conv_string_len_to_utf8(value, value_length),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000668 string_intern(self, base), string_intern(self, systemId),
669 string_intern(self, publicId),
670 string_intern(self, notationName)))
Fred Drake85d835f2001-02-08 15:39:08 +0000671#else
672VOID_HANDLER(EntityDecl,
673 (void *userData,
674 const XML_Char *entityName,
675 int is_parameter_entity,
676 const XML_Char *value,
677 int value_length,
678 const XML_Char *base,
679 const XML_Char *systemId,
680 const XML_Char *publicId,
681 const XML_Char *notationName),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000682 ("NiNNNNN",
683 string_intern(self, entityName), is_parameter_entity,
Fred Drake71b63ff2002-06-28 22:29:01 +0000684 (self->returns_unicode
685 ? conv_string_len_to_unicode(value, value_length)
Fred Drake85d835f2001-02-08 15:39:08 +0000686 : conv_string_len_to_utf8(value, value_length)),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000687 string_intern(self, base), string_intern(self, systemId),
688 string_intern(self, publicId),
689 string_intern(self, notationName)))
Fred Drake85d835f2001-02-08 15:39:08 +0000690#endif
691
692VOID_HANDLER(XmlDecl,
693 (void *userData,
694 const XML_Char *version,
695 const XML_Char *encoding,
696 int standalone),
697 ("(O&O&i)",
Fred Drake71b63ff2002-06-28 22:29:01 +0000698 STRING_CONV_FUNC,version, STRING_CONV_FUNC,encoding,
Fred Drake85d835f2001-02-08 15:39:08 +0000699 standalone))
700
701static PyObject *
702conv_content_model(XML_Content * const model,
Fred Drakeb91a36b2002-06-27 19:40:48 +0000703 PyObject *(*conv_string)(const XML_Char *))
Fred Drake85d835f2001-02-08 15:39:08 +0000704{
705 PyObject *result = NULL;
706 PyObject *children = PyTuple_New(model->numchildren);
707 int i;
708
709 if (children != NULL) {
Tim Peters9544fc52001-07-28 09:36:36 +0000710 assert(model->numchildren < INT_MAX);
711 for (i = 0; i < (int)model->numchildren; ++i) {
Fred Drake85d835f2001-02-08 15:39:08 +0000712 PyObject *child = conv_content_model(&model->children[i],
713 conv_string);
714 if (child == NULL) {
715 Py_XDECREF(children);
716 return NULL;
717 }
718 PyTuple_SET_ITEM(children, i, child);
719 }
720 result = Py_BuildValue("(iiO&N)",
721 model->type, model->quant,
722 conv_string,model->name, children);
723 }
724 return result;
725}
726
Fred Drake06dd8cf2003-02-02 03:54:17 +0000727static void
728my_ElementDeclHandler(void *userData,
729 const XML_Char *name,
730 XML_Content *model)
Fred Drake85d835f2001-02-08 15:39:08 +0000731{
Fred Drake06dd8cf2003-02-02 03:54:17 +0000732 xmlparseobject *self = (xmlparseobject *)userData;
733 PyObject *args = NULL;
Fred Drake85d835f2001-02-08 15:39:08 +0000734
Fred Drake06dd8cf2003-02-02 03:54:17 +0000735 if (have_handler(self, ElementDecl)) {
736 PyObject *rv = NULL;
737 PyObject *modelobj, *nameobj;
738
739 if (flush_character_buffer(self) < 0)
740 goto finally;
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000741#ifdef Py_USING_UNICODE
Fred Drake06dd8cf2003-02-02 03:54:17 +0000742 modelobj = conv_content_model(model,
743 (self->returns_unicode
744 ? conv_string_to_unicode
745 : conv_string_to_utf8));
Fred Drake85d835f2001-02-08 15:39:08 +0000746#else
Fred Drake06dd8cf2003-02-02 03:54:17 +0000747 modelobj = conv_content_model(model, conv_string_to_utf8);
Fred Drake85d835f2001-02-08 15:39:08 +0000748#endif
Fred Drake06dd8cf2003-02-02 03:54:17 +0000749 if (modelobj == NULL) {
750 flag_error(self);
751 goto finally;
752 }
753 nameobj = string_intern(self, name);
754 if (nameobj == NULL) {
755 Py_DECREF(modelobj);
756 flag_error(self);
757 goto finally;
758 }
Michael W. Hudson0bb84542004-08-03 11:31:31 +0000759 args = Py_BuildValue("NN", nameobj, modelobj);
Fred Drake06dd8cf2003-02-02 03:54:17 +0000760 if (args == NULL) {
761 Py_DECREF(modelobj);
762 flag_error(self);
763 goto finally;
764 }
765 self->in_callback = 1;
766 rv = call_with_frame(getcode(ElementDecl, "ElementDecl", __LINE__),
Fred Drake39689c52004-08-13 03:12:57 +0000767 self->handlers[ElementDecl], args, self);
Fred Drake06dd8cf2003-02-02 03:54:17 +0000768 self->in_callback = 0;
769 if (rv == NULL) {
770 flag_error(self);
771 goto finally;
772 }
773 Py_DECREF(rv);
774 }
775 finally:
776 Py_XDECREF(args);
777 XML_FreeContentModel(self->itself, model);
778 return;
779}
Fred Drake85d835f2001-02-08 15:39:08 +0000780
781VOID_HANDLER(AttlistDecl,
782 (void *userData,
783 const XML_Char *elname,
784 const XML_Char *attname,
785 const XML_Char *att_type,
786 const XML_Char *dflt,
787 int isrequired),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000788 ("(NNO&O&i)",
789 string_intern(self, elname), string_intern(self, attname),
Fred Drake85d835f2001-02-08 15:39:08 +0000790 STRING_CONV_FUNC,att_type, STRING_CONV_FUNC,dflt,
791 isrequired))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000792
Martin v. Löwisc847f402003-01-21 11:09:21 +0000793#if XML_COMBINED_VERSION >= 19504
Martin v. Löwis069dde22003-01-21 10:58:18 +0000794VOID_HANDLER(SkippedEntity,
795 (void *userData,
796 const XML_Char *entityName,
797 int is_parameter_entity),
798 ("Ni",
799 string_intern(self, entityName), is_parameter_entity))
Martin v. Löwisc847f402003-01-21 11:09:21 +0000800#endif
Martin v. Löwis069dde22003-01-21 10:58:18 +0000801
Fred Drake71b63ff2002-06-28 22:29:01 +0000802VOID_HANDLER(NotationDecl,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000803 (void *userData,
804 const XML_Char *notationName,
805 const XML_Char *base,
806 const XML_Char *systemId,
807 const XML_Char *publicId),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000808 ("(NNNN)",
Fred Drake71b63ff2002-06-28 22:29:01 +0000809 string_intern(self, notationName), string_intern(self, base),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000810 string_intern(self, systemId), string_intern(self, publicId)))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000811
Fred Drake6f987622000-08-25 18:03:30 +0000812VOID_HANDLER(StartNamespaceDecl,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000813 (void *userData,
814 const XML_Char *prefix,
815 const XML_Char *uri),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000816 ("(NN)",
817 string_intern(self, prefix), string_intern(self, uri)))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000818
Fred Drake6f987622000-08-25 18:03:30 +0000819VOID_HANDLER(EndNamespaceDecl,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000820 (void *userData,
821 const XML_Char *prefix),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000822 ("(N)", string_intern(self, prefix)))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000823
Fred Drake6f987622000-08-25 18:03:30 +0000824VOID_HANDLER(Comment,
Fred Drakeb91a36b2002-06-27 19:40:48 +0000825 (void *userData, const XML_Char *data),
826 ("(O&)", STRING_CONV_FUNC,data))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000827
Fred Drake6f987622000-08-25 18:03:30 +0000828VOID_HANDLER(StartCdataSection,
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000829 (void *userData),
Fred Drake6f987622000-08-25 18:03:30 +0000830 ("()"))
Fred Drake71b63ff2002-06-28 22:29:01 +0000831
Fred Drake6f987622000-08-25 18:03:30 +0000832VOID_HANDLER(EndCdataSection,
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000833 (void *userData),
Fred Drake6f987622000-08-25 18:03:30 +0000834 ("()"))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000835
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000836#ifndef Py_USING_UNICODE
Fred Drake6f987622000-08-25 18:03:30 +0000837VOID_HANDLER(Default,
Fred Drake71b63ff2002-06-28 22:29:01 +0000838 (void *userData, const XML_Char *s, int len),
Fred Drakeca1f4262000-09-21 20:10:23 +0000839 ("(N)", conv_string_len_to_utf8(s,len)))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000840
Fred Drake6f987622000-08-25 18:03:30 +0000841VOID_HANDLER(DefaultHandlerExpand,
Fred Drake71b63ff2002-06-28 22:29:01 +0000842 (void *userData, const XML_Char *s, int len),
Fred Drakeca1f4262000-09-21 20:10:23 +0000843 ("(N)", conv_string_len_to_utf8(s,len)))
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000844#else
Fred Drake6f987622000-08-25 18:03:30 +0000845VOID_HANDLER(Default,
Fred Drake71b63ff2002-06-28 22:29:01 +0000846 (void *userData, const XML_Char *s, int len),
847 ("(N)", (self->returns_unicode
848 ? conv_string_len_to_unicode(s,len)
Fred Drake6f987622000-08-25 18:03:30 +0000849 : conv_string_len_to_utf8(s,len))))
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000850
Fred Drake6f987622000-08-25 18:03:30 +0000851VOID_HANDLER(DefaultHandlerExpand,
Fred Drake71b63ff2002-06-28 22:29:01 +0000852 (void *userData, const XML_Char *s, int len),
853 ("(N)", (self->returns_unicode
854 ? conv_string_len_to_unicode(s,len)
Fred Drake6f987622000-08-25 18:03:30 +0000855 : conv_string_len_to_utf8(s,len))))
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000856#endif
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000857
Fred Drake71b63ff2002-06-28 22:29:01 +0000858INT_HANDLER(NotStandalone,
859 (void *userData),
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000860 ("()"))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000861
Fred Drake6f987622000-08-25 18:03:30 +0000862RC_HANDLER(int, ExternalEntityRef,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000863 (XML_Parser parser,
864 const XML_Char *context,
865 const XML_Char *base,
866 const XML_Char *systemId,
867 const XML_Char *publicId),
868 int rc=0;,
Fred Drakeb91a36b2002-06-27 19:40:48 +0000869 ("(O&NNN)",
Fred Drake71b63ff2002-06-28 22:29:01 +0000870 STRING_CONV_FUNC,context, string_intern(self, base),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000871 string_intern(self, systemId), string_intern(self, publicId)),
Fred Drake6f987622000-08-25 18:03:30 +0000872 rc = PyInt_AsLong(rv);, rc,
873 XML_GetUserData(parser))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000874
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000875/* XXX UnknownEncodingHandler */
876
Fred Drake85d835f2001-02-08 15:39:08 +0000877VOID_HANDLER(StartDoctypeDecl,
878 (void *userData, const XML_Char *doctypeName,
879 const XML_Char *sysid, const XML_Char *pubid,
880 int has_internal_subset),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000881 ("(NNNi)", string_intern(self, doctypeName),
882 string_intern(self, sysid), string_intern(self, pubid),
Fred Drake85d835f2001-02-08 15:39:08 +0000883 has_internal_subset))
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000884
885VOID_HANDLER(EndDoctypeDecl, (void *userData), ("()"))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000886
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000887/* ---------------------------------------------------------------- */
888
Fred Drake71b63ff2002-06-28 22:29:01 +0000889static PyObject *
890get_parse_result(xmlparseobject *self, int rv)
891{
892 if (PyErr_Occurred()) {
893 return NULL;
894 }
895 if (rv == 0) {
Martin v. Löwis069dde22003-01-21 10:58:18 +0000896 return set_error(self, XML_GetErrorCode(self->itself));
Fred Drake71b63ff2002-06-28 22:29:01 +0000897 }
Fred Drake2a3d7db2002-06-28 22:56:48 +0000898 if (flush_character_buffer(self) < 0) {
899 return NULL;
900 }
Fred Drake71b63ff2002-06-28 22:29:01 +0000901 return PyInt_FromLong(rv);
902}
903
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000904PyDoc_STRVAR(xmlparse_Parse__doc__,
Thomas Wouters35317302000-07-22 16:34:15 +0000905"Parse(data[, isfinal])\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000906Parse XML data. `isfinal' should be true at end of input.");
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000907
908static PyObject *
Fred Drake0582df92000-07-12 04:49:00 +0000909xmlparse_Parse(xmlparseobject *self, PyObject *args)
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000910{
Fred Drake0582df92000-07-12 04:49:00 +0000911 char *s;
912 int slen;
913 int isFinal = 0;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000914
Fred Drake0582df92000-07-12 04:49:00 +0000915 if (!PyArg_ParseTuple(args, "s#|i:Parse", &s, &slen, &isFinal))
916 return NULL;
Fred Drake71b63ff2002-06-28 22:29:01 +0000917
918 return get_parse_result(self, XML_Parse(self->itself, s, slen, isFinal));
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000919}
920
Fred Drakeca1f4262000-09-21 20:10:23 +0000921/* File reading copied from cPickle */
922
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000923#define BUF_SIZE 2048
924
Fred Drake0582df92000-07-12 04:49:00 +0000925static int
926readinst(char *buf, int buf_size, PyObject *meth)
927{
928 PyObject *arg = NULL;
929 PyObject *bytes = NULL;
930 PyObject *str = NULL;
931 int len = -1;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000932
Fred Drake676940b2000-09-22 15:21:31 +0000933 if ((bytes = PyInt_FromLong(buf_size)) == NULL)
Fred Drake0582df92000-07-12 04:49:00 +0000934 goto finally;
Fred Drake676940b2000-09-22 15:21:31 +0000935
Fred Drake7b6caff2003-07-21 17:05:56 +0000936 if ((arg = PyTuple_New(1)) == NULL) {
937 Py_DECREF(bytes);
Fred Drake0582df92000-07-12 04:49:00 +0000938 goto finally;
Fred Drake7b6caff2003-07-21 17:05:56 +0000939 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000940
Tim Peters954eef72000-09-22 06:01:11 +0000941 PyTuple_SET_ITEM(arg, 0, bytes);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000942
Martin v. Löwis9171f022004-10-13 19:50:11 +0000943#if PY_VERSION_HEX < 0x02020000
944 str = PyObject_CallObject(meth, arg);
945#else
946 str = PyObject_Call(meth, arg, NULL);
947#endif
948 if (str == NULL)
Fred Drake0582df92000-07-12 04:49:00 +0000949 goto finally;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000950
Fred Drake0582df92000-07-12 04:49:00 +0000951 /* XXX what to do if it returns a Unicode string? */
Fred Drakeca1f4262000-09-21 20:10:23 +0000952 if (!PyString_Check(str)) {
Fred Drake71b63ff2002-06-28 22:29:01 +0000953 PyErr_Format(PyExc_TypeError,
Fred Drake0582df92000-07-12 04:49:00 +0000954 "read() did not return a string object (type=%.400s)",
955 str->ob_type->tp_name);
956 goto finally;
957 }
958 len = PyString_GET_SIZE(str);
959 if (len > buf_size) {
960 PyErr_Format(PyExc_ValueError,
961 "read() returned too much data: "
962 "%i bytes requested, %i returned",
963 buf_size, len);
Fred Drake0582df92000-07-12 04:49:00 +0000964 goto finally;
965 }
966 memcpy(buf, PyString_AsString(str), len);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000967finally:
Fred Drake0582df92000-07-12 04:49:00 +0000968 Py_XDECREF(arg);
Fred Drakeca1f4262000-09-21 20:10:23 +0000969 Py_XDECREF(str);
Fred Drake0582df92000-07-12 04:49:00 +0000970 return len;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000971}
972
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000973PyDoc_STRVAR(xmlparse_ParseFile__doc__,
Thomas Wouters35317302000-07-22 16:34:15 +0000974"ParseFile(file)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000975Parse XML data from file-like object.");
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000976
977static PyObject *
Fred Drake0582df92000-07-12 04:49:00 +0000978xmlparse_ParseFile(xmlparseobject *self, PyObject *args)
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000979{
Fred Drake0582df92000-07-12 04:49:00 +0000980 int rv = 1;
981 PyObject *f;
982 FILE *fp;
983 PyObject *readmethod = NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000984
Fred Drake0582df92000-07-12 04:49:00 +0000985 if (!PyArg_ParseTuple(args, "O:ParseFile", &f))
986 return NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000987
Fred Drake0582df92000-07-12 04:49:00 +0000988 if (PyFile_Check(f)) {
989 fp = PyFile_AsFile(f);
990 }
991 else{
992 fp = NULL;
Fred Drakeca1f4262000-09-21 20:10:23 +0000993 readmethod = PyObject_GetAttrString(f, "read");
994 if (readmethod == NULL) {
Fred Drake0582df92000-07-12 04:49:00 +0000995 PyErr_Clear();
Fred Drake71b63ff2002-06-28 22:29:01 +0000996 PyErr_SetString(PyExc_TypeError,
Fred Drake0582df92000-07-12 04:49:00 +0000997 "argument must have 'read' attribute");
Fred Drake814f9fe2002-07-19 22:03:03 +0000998 return NULL;
Fred Drake0582df92000-07-12 04:49:00 +0000999 }
1000 }
1001 for (;;) {
1002 int bytes_read;
1003 void *buf = XML_GetBuffer(self->itself, BUF_SIZE);
Fred Drake7b6caff2003-07-21 17:05:56 +00001004 if (buf == NULL) {
Fred Drakef239c6d2003-07-21 17:22:43 +00001005 Py_XDECREF(readmethod);
Fred Drake0582df92000-07-12 04:49:00 +00001006 return PyErr_NoMemory();
Fred Drake7b6caff2003-07-21 17:05:56 +00001007 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001008
Fred Drake0582df92000-07-12 04:49:00 +00001009 if (fp) {
1010 bytes_read = fread(buf, sizeof(char), BUF_SIZE, fp);
1011 if (bytes_read < 0) {
1012 PyErr_SetFromErrno(PyExc_IOError);
1013 return NULL;
1014 }
1015 }
1016 else {
1017 bytes_read = readinst(buf, BUF_SIZE, readmethod);
Fred Drake7b6caff2003-07-21 17:05:56 +00001018 if (bytes_read < 0) {
1019 Py_DECREF(readmethod);
Fred Drake0582df92000-07-12 04:49:00 +00001020 return NULL;
Fred Drake7b6caff2003-07-21 17:05:56 +00001021 }
Fred Drake0582df92000-07-12 04:49:00 +00001022 }
1023 rv = XML_ParseBuffer(self->itself, bytes_read, bytes_read == 0);
Fred Drake7b6caff2003-07-21 17:05:56 +00001024 if (PyErr_Occurred()) {
1025 Py_XDECREF(readmethod);
Fred Drake0582df92000-07-12 04:49:00 +00001026 return NULL;
Fred Drake7b6caff2003-07-21 17:05:56 +00001027 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001028
Fred Drake0582df92000-07-12 04:49:00 +00001029 if (!rv || bytes_read == 0)
1030 break;
1031 }
Fred Drake7b6caff2003-07-21 17:05:56 +00001032 Py_XDECREF(readmethod);
Fred Drake71b63ff2002-06-28 22:29:01 +00001033 return get_parse_result(self, rv);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001034}
1035
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001036PyDoc_STRVAR(xmlparse_SetBase__doc__,
Thomas Wouters35317302000-07-22 16:34:15 +00001037"SetBase(base_url)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001038Set the base URL for the parser.");
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001039
1040static PyObject *
Fred Drake0582df92000-07-12 04:49:00 +00001041xmlparse_SetBase(xmlparseobject *self, PyObject *args)
1042{
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001043 char *base;
1044
Fred Drake0582df92000-07-12 04:49:00 +00001045 if (!PyArg_ParseTuple(args, "s:SetBase", &base))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001046 return NULL;
Fred Drake0582df92000-07-12 04:49:00 +00001047 if (!XML_SetBase(self->itself, base)) {
1048 return PyErr_NoMemory();
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001049 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001050 Py_INCREF(Py_None);
1051 return Py_None;
1052}
1053
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001054PyDoc_STRVAR(xmlparse_GetBase__doc__,
Thomas Wouters35317302000-07-22 16:34:15 +00001055"GetBase() -> url\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001056Return base URL string for the parser.");
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001057
1058static PyObject *
Fred Drake0582df92000-07-12 04:49:00 +00001059xmlparse_GetBase(xmlparseobject *self, PyObject *args)
1060{
1061 if (!PyArg_ParseTuple(args, ":GetBase"))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001062 return NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001063
Fred Drake0582df92000-07-12 04:49:00 +00001064 return Py_BuildValue("z", XML_GetBase(self->itself));
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001065}
1066
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001067PyDoc_STRVAR(xmlparse_GetInputContext__doc__,
Fred Drakebd6101c2001-02-14 18:29:45 +00001068"GetInputContext() -> string\n\
1069Return the untranslated text of the input that caused the current event.\n\
1070If the event was generated by a large amount of text (such as a start tag\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001071for an element with many attributes), not all of the text may be available.");
Fred Drakebd6101c2001-02-14 18:29:45 +00001072
1073static PyObject *
1074xmlparse_GetInputContext(xmlparseobject *self, PyObject *args)
1075{
1076 PyObject *result = NULL;
1077
1078 if (PyArg_ParseTuple(args, ":GetInputContext")) {
1079 if (self->in_callback) {
1080 int offset, size;
1081 const char *buffer
1082 = XML_GetInputContext(self->itself, &offset, &size);
1083
1084 if (buffer != NULL)
1085 result = PyString_FromStringAndSize(buffer + offset, size);
1086 else {
1087 result = Py_None;
1088 Py_INCREF(result);
1089 }
1090 }
1091 else {
1092 result = Py_None;
1093 Py_INCREF(result);
1094 }
1095 }
1096 return result;
1097}
Fred Drakebd6101c2001-02-14 18:29:45 +00001098
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001099PyDoc_STRVAR(xmlparse_ExternalEntityParserCreate__doc__,
Fred Drake2d4ac202001-01-03 15:36:25 +00001100"ExternalEntityParserCreate(context[, encoding])\n\
Tim Peters51dc9682000-09-24 22:12:45 +00001101Create a parser for parsing an external entity based on the\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001102information passed to the ExternalEntityRefHandler.");
Lars Gustäbel4a30a072000-09-24 20:50:52 +00001103
1104static PyObject *
1105xmlparse_ExternalEntityParserCreate(xmlparseobject *self, PyObject *args)
1106{
1107 char *context;
1108 char *encoding = NULL;
1109 xmlparseobject *new_parser;
1110 int i;
1111
Martin v. Löwisc57428d2001-09-19 09:55:09 +00001112 if (!PyArg_ParseTuple(args, "z|s:ExternalEntityParserCreate",
Fred Drakecde79132001-04-25 16:01:30 +00001113 &context, &encoding)) {
1114 return NULL;
Lars Gustäbel4a30a072000-09-24 20:50:52 +00001115 }
1116
Martin v. Löwis894258c2001-09-23 10:20:10 +00001117#ifndef Py_TPFLAGS_HAVE_GC
Martin v. Löwisb4fcf4d2002-06-30 06:40:55 +00001118 /* Python versions 2.0 and 2.1 */
Lars Gustäbel4a30a072000-09-24 20:50:52 +00001119 new_parser = PyObject_New(xmlparseobject, &Xmlparsetype);
Martin v. Löwis894258c2001-09-23 10:20:10 +00001120#else
1121 /* Python versions 2.2 and later */
1122 new_parser = PyObject_GC_New(xmlparseobject, &Xmlparsetype);
1123#endif
Fred Drake85d835f2001-02-08 15:39:08 +00001124
1125 if (new_parser == NULL)
1126 return NULL;
Fred Drake2a3d7db2002-06-28 22:56:48 +00001127 new_parser->buffer_size = self->buffer_size;
1128 new_parser->buffer_used = 0;
1129 if (self->buffer != NULL) {
1130 new_parser->buffer = malloc(new_parser->buffer_size);
1131 if (new_parser->buffer == NULL) {
Fred Drakeb28467b2002-07-02 15:44:36 +00001132#ifndef Py_TPFLAGS_HAVE_GC
1133 /* Code for versions 2.0 and 2.1 */
1134 PyObject_Del(new_parser);
1135#else
1136 /* Code for versions 2.2 and later. */
Fred Drake2a3d7db2002-06-28 22:56:48 +00001137 PyObject_GC_Del(new_parser);
Fred Drakeb28467b2002-07-02 15:44:36 +00001138#endif
Fred Drake2a3d7db2002-06-28 22:56:48 +00001139 return PyErr_NoMemory();
1140 }
1141 }
1142 else
1143 new_parser->buffer = NULL;
Fred Drake85d835f2001-02-08 15:39:08 +00001144 new_parser->returns_unicode = self->returns_unicode;
1145 new_parser->ordered_attributes = self->ordered_attributes;
1146 new_parser->specified_attributes = self->specified_attributes;
Fred Drakebd6101c2001-02-14 18:29:45 +00001147 new_parser->in_callback = 0;
Martin v. Löwis069dde22003-01-21 10:58:18 +00001148 new_parser->ns_prefixes = self->ns_prefixes;
Lars Gustäbel4a30a072000-09-24 20:50:52 +00001149 new_parser->itself = XML_ExternalEntityParserCreate(self->itself, context,
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001150 encoding);
1151 new_parser->handlers = 0;
Fred Drakeb91a36b2002-06-27 19:40:48 +00001152 new_parser->intern = self->intern;
1153 Py_XINCREF(new_parser->intern);
Martin v. Löwis894258c2001-09-23 10:20:10 +00001154#ifdef Py_TPFLAGS_HAVE_GC
1155 PyObject_GC_Track(new_parser);
1156#else
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001157 PyObject_GC_Init(new_parser);
Martin v. Löwis894258c2001-09-23 10:20:10 +00001158#endif
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001159
1160 if (!new_parser->itself) {
Fred Drake85d835f2001-02-08 15:39:08 +00001161 Py_DECREF(new_parser);
1162 return PyErr_NoMemory();
Lars Gustäbel4a30a072000-09-24 20:50:52 +00001163 }
1164
1165 XML_SetUserData(new_parser->itself, (void *)new_parser);
1166
1167 /* allocate and clear handlers first */
Fred Drake2a3d7db2002-06-28 22:56:48 +00001168 for (i = 0; handler_info[i].name != NULL; i++)
Fred Drake85d835f2001-02-08 15:39:08 +00001169 /* do nothing */;
Lars Gustäbel4a30a072000-09-24 20:50:52 +00001170
Fred Drake2a3d7db2002-06-28 22:56:48 +00001171 new_parser->handlers = malloc(sizeof(PyObject *) * i);
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001172 if (!new_parser->handlers) {
Fred Drake85d835f2001-02-08 15:39:08 +00001173 Py_DECREF(new_parser);
1174 return PyErr_NoMemory();
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001175 }
Martin v. Löwis5b68ce32001-10-21 08:53:52 +00001176 clear_handlers(new_parser, 1);
Lars Gustäbel4a30a072000-09-24 20:50:52 +00001177
1178 /* then copy handlers from self */
1179 for (i = 0; handler_info[i].name != NULL; i++) {
Fred Drake71b63ff2002-06-28 22:29:01 +00001180 PyObject *handler = self->handlers[i];
1181 if (handler != NULL) {
1182 Py_INCREF(handler);
1183 new_parser->handlers[i] = handler;
1184 handler_info[i].setter(new_parser->itself,
Fred Drake85d835f2001-02-08 15:39:08 +00001185 handler_info[i].handler);
1186 }
Lars Gustäbel4a30a072000-09-24 20:50:52 +00001187 }
Fred Drake71b63ff2002-06-28 22:29:01 +00001188 return (PyObject *)new_parser;
Lars Gustäbel4a30a072000-09-24 20:50:52 +00001189}
1190
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001191PyDoc_STRVAR(xmlparse_SetParamEntityParsing__doc__,
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001192"SetParamEntityParsing(flag) -> success\n\
1193Controls parsing of parameter entities (including the external DTD\n\
1194subset). Possible flag values are XML_PARAM_ENTITY_PARSING_NEVER,\n\
1195XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE and\n\
1196XML_PARAM_ENTITY_PARSING_ALWAYS. Returns true if setting the flag\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001197was successful.");
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001198
1199static PyObject*
Fred Drakebd6101c2001-02-14 18:29:45 +00001200xmlparse_SetParamEntityParsing(xmlparseobject *p, PyObject* args)
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001201{
Fred Drake85d835f2001-02-08 15:39:08 +00001202 int flag;
1203 if (!PyArg_ParseTuple(args, "i", &flag))
1204 return NULL;
Fred Drakebd6101c2001-02-14 18:29:45 +00001205 flag = XML_SetParamEntityParsing(p->itself, flag);
Fred Drake85d835f2001-02-08 15:39:08 +00001206 return PyInt_FromLong(flag);
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001207}
1208
Martin v. Löwisc847f402003-01-21 11:09:21 +00001209
1210#if XML_COMBINED_VERSION >= 19505
Martin v. Löwis069dde22003-01-21 10:58:18 +00001211PyDoc_STRVAR(xmlparse_UseForeignDTD__doc__,
1212"UseForeignDTD([flag])\n\
1213Allows the application to provide an artificial external subset if one is\n\
1214not specified as part of the document instance. This readily allows the\n\
1215use of a 'default' document type controlled by the application, while still\n\
1216getting the advantage of providing document type information to the parser.\n\
1217'flag' defaults to True if not provided.");
1218
1219static PyObject *
1220xmlparse_UseForeignDTD(xmlparseobject *self, PyObject *args)
1221{
1222 PyObject *flagobj = NULL;
1223 XML_Bool flag = XML_TRUE;
1224 enum XML_Error rc;
1225 if (!PyArg_ParseTuple(args, "|O:UseForeignDTD", &flagobj))
1226 return NULL;
1227 if (flagobj != NULL)
1228 flag = PyObject_IsTrue(flagobj) ? XML_TRUE : XML_FALSE;
1229 rc = XML_UseForeignDTD(self->itself, flag);
1230 if (rc != XML_ERROR_NONE) {
1231 return set_error(self, rc);
1232 }
1233 Py_INCREF(Py_None);
1234 return Py_None;
1235}
Martin v. Löwisc847f402003-01-21 11:09:21 +00001236#endif
Martin v. Löwis069dde22003-01-21 10:58:18 +00001237
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001238static struct PyMethodDef xmlparse_methods[] = {
Fred Drake0582df92000-07-12 04:49:00 +00001239 {"Parse", (PyCFunction)xmlparse_Parse,
Fred Drakebd6101c2001-02-14 18:29:45 +00001240 METH_VARARGS, xmlparse_Parse__doc__},
Fred Drake0582df92000-07-12 04:49:00 +00001241 {"ParseFile", (PyCFunction)xmlparse_ParseFile,
Fred Drakebd6101c2001-02-14 18:29:45 +00001242 METH_VARARGS, xmlparse_ParseFile__doc__},
Fred Drake0582df92000-07-12 04:49:00 +00001243 {"SetBase", (PyCFunction)xmlparse_SetBase,
Martin v. Löwis069dde22003-01-21 10:58:18 +00001244 METH_VARARGS, xmlparse_SetBase__doc__},
Fred Drake0582df92000-07-12 04:49:00 +00001245 {"GetBase", (PyCFunction)xmlparse_GetBase,
Martin v. Löwis069dde22003-01-21 10:58:18 +00001246 METH_VARARGS, xmlparse_GetBase__doc__},
Lars Gustäbel4a30a072000-09-24 20:50:52 +00001247 {"ExternalEntityParserCreate", (PyCFunction)xmlparse_ExternalEntityParserCreate,
Martin v. Löwis069dde22003-01-21 10:58:18 +00001248 METH_VARARGS, xmlparse_ExternalEntityParserCreate__doc__},
Fred Drakebd6101c2001-02-14 18:29:45 +00001249 {"SetParamEntityParsing", (PyCFunction)xmlparse_SetParamEntityParsing,
1250 METH_VARARGS, xmlparse_SetParamEntityParsing__doc__},
Fred Drakebd6101c2001-02-14 18:29:45 +00001251 {"GetInputContext", (PyCFunction)xmlparse_GetInputContext,
1252 METH_VARARGS, xmlparse_GetInputContext__doc__},
Martin v. Löwisc847f402003-01-21 11:09:21 +00001253#if XML_COMBINED_VERSION >= 19505
Martin v. Löwis069dde22003-01-21 10:58:18 +00001254 {"UseForeignDTD", (PyCFunction)xmlparse_UseForeignDTD,
1255 METH_VARARGS, xmlparse_UseForeignDTD__doc__},
Martin v. Löwisc847f402003-01-21 11:09:21 +00001256#endif
Martin v. Löwis069dde22003-01-21 10:58:18 +00001257 {NULL, NULL} /* sentinel */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001258};
1259
1260/* ---------- */
1261
1262
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001263#ifdef Py_USING_UNICODE
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001264
Fred Drake71b63ff2002-06-28 22:29:01 +00001265/* pyexpat international encoding support.
1266 Make it as simple as possible.
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001267*/
1268
Martin v. Löwis3af7cc02001-01-22 08:19:10 +00001269static char template_buffer[257];
Fred Drakebb66a202001-03-01 20:48:17 +00001270PyObject *template_string = NULL;
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001271
Fred Drake71b63ff2002-06-28 22:29:01 +00001272static void
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001273init_template_buffer(void)
1274{
1275 int i;
Fred Drakebb66a202001-03-01 20:48:17 +00001276 for (i = 0; i < 256; i++) {
1277 template_buffer[i] = i;
Tim Peters63cb99e2001-02-17 18:12:50 +00001278 }
Fred Drakebb66a202001-03-01 20:48:17 +00001279 template_buffer[256] = 0;
Tim Peters63cb99e2001-02-17 18:12:50 +00001280}
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001281
Fred Drake71b63ff2002-06-28 22:29:01 +00001282static int
1283PyUnknownEncodingHandler(void *encodingHandlerData,
1284 const XML_Char *name,
1285 XML_Encoding *info)
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001286{
Fred Drakebb66a202001-03-01 20:48:17 +00001287 PyUnicodeObject *_u_string = NULL;
1288 int result = 0;
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001289 int i;
Fred Drake71b63ff2002-06-28 22:29:01 +00001290
Fred Drakebb66a202001-03-01 20:48:17 +00001291 /* Yes, supports only 8bit encodings */
1292 _u_string = (PyUnicodeObject *)
1293 PyUnicode_Decode(template_buffer, 256, name, "replace");
Fred Drake71b63ff2002-06-28 22:29:01 +00001294
Fred Drakebb66a202001-03-01 20:48:17 +00001295 if (_u_string == NULL)
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001296 return result;
Fred Drake71b63ff2002-06-28 22:29:01 +00001297
Fred Drakebb66a202001-03-01 20:48:17 +00001298 for (i = 0; i < 256; i++) {
1299 /* Stupid to access directly, but fast */
1300 Py_UNICODE c = _u_string->str[i];
1301 if (c == Py_UNICODE_REPLACEMENT_CHARACTER)
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001302 info->map[i] = -1;
Fred Drakebb66a202001-03-01 20:48:17 +00001303 else
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001304 info->map[i] = c;
Tim Peters63cb99e2001-02-17 18:12:50 +00001305 }
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001306 info->data = NULL;
1307 info->convert = NULL;
1308 info->release = NULL;
Fred Drake71b63ff2002-06-28 22:29:01 +00001309 result = 1;
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001310 Py_DECREF(_u_string);
1311 return result;
1312}
1313
1314#endif
1315
1316static PyObject *
Fred Drakeb91a36b2002-06-27 19:40:48 +00001317newxmlparseobject(char *encoding, char *namespace_separator, PyObject *intern)
Fred Drake0582df92000-07-12 04:49:00 +00001318{
1319 int i;
1320 xmlparseobject *self;
Fred Drake71b63ff2002-06-28 22:29:01 +00001321
Martin v. Löwis894258c2001-09-23 10:20:10 +00001322#ifdef Py_TPFLAGS_HAVE_GC
1323 /* Code for versions 2.2 and later */
1324 self = PyObject_GC_New(xmlparseobject, &Xmlparsetype);
1325#else
Fred Drake0582df92000-07-12 04:49:00 +00001326 self = PyObject_New(xmlparseobject, &Xmlparsetype);
Martin v. Löwis894258c2001-09-23 10:20:10 +00001327#endif
Fred Drake0582df92000-07-12 04:49:00 +00001328 if (self == NULL)
1329 return NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001330
Martin v. Löwisb4fcf4d2002-06-30 06:40:55 +00001331#ifdef Py_USING_UNICODE
Fred Drake0582df92000-07-12 04:49:00 +00001332 self->returns_unicode = 1;
Martin v. Löwisb4fcf4d2002-06-30 06:40:55 +00001333#else
1334 self->returns_unicode = 0;
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001335#endif
Martin v. Löwisb4fcf4d2002-06-30 06:40:55 +00001336
Fred Drake2a3d7db2002-06-28 22:56:48 +00001337 self->buffer = NULL;
1338 self->buffer_size = CHARACTER_DATA_BUFFER_SIZE;
1339 self->buffer_used = 0;
Fred Drake85d835f2001-02-08 15:39:08 +00001340 self->ordered_attributes = 0;
1341 self->specified_attributes = 0;
Fred Drakebd6101c2001-02-14 18:29:45 +00001342 self->in_callback = 0;
Martin v. Löwis069dde22003-01-21 10:58:18 +00001343 self->ns_prefixes = 0;
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001344 self->handlers = NULL;
Fred Drakecde79132001-04-25 16:01:30 +00001345 if (namespace_separator != NULL) {
Fred Drake0582df92000-07-12 04:49:00 +00001346 self->itself = XML_ParserCreateNS(encoding, *namespace_separator);
1347 }
Fred Drake85d835f2001-02-08 15:39:08 +00001348 else {
Fred Drake0582df92000-07-12 04:49:00 +00001349 self->itself = XML_ParserCreate(encoding);
1350 }
Fred Drakeb91a36b2002-06-27 19:40:48 +00001351 self->intern = intern;
1352 Py_XINCREF(self->intern);
Martin v. Löwis894258c2001-09-23 10:20:10 +00001353#ifdef Py_TPFLAGS_HAVE_GC
1354 PyObject_GC_Track(self);
1355#else
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001356 PyObject_GC_Init(self);
Martin v. Löwis894258c2001-09-23 10:20:10 +00001357#endif
Fred Drake0582df92000-07-12 04:49:00 +00001358 if (self->itself == NULL) {
Fred Drake71b63ff2002-06-28 22:29:01 +00001359 PyErr_SetString(PyExc_RuntimeError,
Fred Drake0582df92000-07-12 04:49:00 +00001360 "XML_ParserCreate failed");
1361 Py_DECREF(self);
1362 return NULL;
1363 }
1364 XML_SetUserData(self->itself, (void *)self);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001365#ifdef Py_USING_UNICODE
Fred Drake7c75bf22002-07-01 14:02:31 +00001366 XML_SetUnknownEncodingHandler(self->itself,
1367 (XML_UnknownEncodingHandler) PyUnknownEncodingHandler, NULL);
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001368#endif
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001369
Fred Drake2a3d7db2002-06-28 22:56:48 +00001370 for (i = 0; handler_info[i].name != NULL; i++)
Fred Drake0582df92000-07-12 04:49:00 +00001371 /* do nothing */;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001372
Fred Drake7c75bf22002-07-01 14:02:31 +00001373 self->handlers = malloc(sizeof(PyObject *) * i);
1374 if (!self->handlers) {
Fred Drake71b63ff2002-06-28 22:29:01 +00001375 Py_DECREF(self);
1376 return PyErr_NoMemory();
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001377 }
Martin v. Löwis5b68ce32001-10-21 08:53:52 +00001378 clear_handlers(self, 1);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001379
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001380 return (PyObject*)self;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001381}
1382
1383
1384static void
Fred Drake0582df92000-07-12 04:49:00 +00001385xmlparse_dealloc(xmlparseobject *self)
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001386{
Fred Drake0582df92000-07-12 04:49:00 +00001387 int i;
Martin v. Löwis894258c2001-09-23 10:20:10 +00001388#ifdef Py_TPFLAGS_HAVE_GC
1389 PyObject_GC_UnTrack(self);
1390#else
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001391 PyObject_GC_Fini(self);
Martin v. Löwis894258c2001-09-23 10:20:10 +00001392#endif
Fred Drake85d835f2001-02-08 15:39:08 +00001393 if (self->itself != NULL)
Fred Drake0582df92000-07-12 04:49:00 +00001394 XML_ParserFree(self->itself);
1395 self->itself = NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001396
Fred Drake85d835f2001-02-08 15:39:08 +00001397 if (self->handlers != NULL) {
Fred Drakecde79132001-04-25 16:01:30 +00001398 PyObject *temp;
Fred Drake85d835f2001-02-08 15:39:08 +00001399 for (i = 0; handler_info[i].name != NULL; i++) {
Fred Drakecde79132001-04-25 16:01:30 +00001400 temp = self->handlers[i];
1401 self->handlers[i] = NULL;
1402 Py_XDECREF(temp);
Fred Drake85d835f2001-02-08 15:39:08 +00001403 }
1404 free(self->handlers);
Fred Drake71b63ff2002-06-28 22:29:01 +00001405 self->handlers = NULL;
Fred Drake0582df92000-07-12 04:49:00 +00001406 }
Fred Drake2a3d7db2002-06-28 22:56:48 +00001407 if (self->buffer != NULL) {
1408 free(self->buffer);
1409 self->buffer = NULL;
1410 }
Fred Drakeb91a36b2002-06-27 19:40:48 +00001411 Py_XDECREF(self->intern);
Martin v. Löwis894258c2001-09-23 10:20:10 +00001412#ifndef Py_TPFLAGS_HAVE_GC
Martin v. Löwisb4fcf4d2002-06-30 06:40:55 +00001413 /* Code for versions 2.0 and 2.1 */
Fred Drake0582df92000-07-12 04:49:00 +00001414 PyObject_Del(self);
Martin v. Löwis894258c2001-09-23 10:20:10 +00001415#else
1416 /* Code for versions 2.2 and later. */
1417 PyObject_GC_Del(self);
1418#endif
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001419}
1420
Fred Drake0582df92000-07-12 04:49:00 +00001421static int
1422handlername2int(const char *name)
1423{
1424 int i;
Fred Drake71b63ff2002-06-28 22:29:01 +00001425 for (i = 0; handler_info[i].name != NULL; i++) {
Fred Drake0582df92000-07-12 04:49:00 +00001426 if (strcmp(name, handler_info[i].name) == 0) {
1427 return i;
1428 }
1429 }
1430 return -1;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001431}
1432
1433static PyObject *
Fred Drake71b63ff2002-06-28 22:29:01 +00001434get_pybool(int istrue)
1435{
1436 PyObject *result = istrue ? Py_True : Py_False;
1437 Py_INCREF(result);
1438 return result;
1439}
1440
1441static PyObject *
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001442xmlparse_getattr(xmlparseobject *self, char *name)
1443{
Fred Drake71b63ff2002-06-28 22:29:01 +00001444 int handlernum = handlername2int(name);
1445
1446 if (handlernum != -1) {
1447 PyObject *result = self->handlers[handlernum];
1448 if (result == NULL)
1449 result = Py_None;
1450 Py_INCREF(result);
1451 return result;
1452 }
1453 if (name[0] == 'E') {
1454 if (strcmp(name, "ErrorCode") == 0)
1455 return PyInt_FromLong((long)
1456 XML_GetErrorCode(self->itself));
1457 if (strcmp(name, "ErrorLineNumber") == 0)
1458 return PyInt_FromLong((long)
1459 XML_GetErrorLineNumber(self->itself));
1460 if (strcmp(name, "ErrorColumnNumber") == 0)
1461 return PyInt_FromLong((long)
1462 XML_GetErrorColumnNumber(self->itself));
1463 if (strcmp(name, "ErrorByteIndex") == 0)
1464 return PyInt_FromLong((long)
1465 XML_GetErrorByteIndex(self->itself));
1466 }
Dave Cole3203efb2004-08-26 00:37:31 +00001467 if (name[0] == 'C') {
1468 if (strcmp(name, "CurrentLineNumber") == 0)
1469 return PyInt_FromLong((long)
1470 XML_GetCurrentLineNumber(self->itself));
1471 if (strcmp(name, "CurrentColumnNumber") == 0)
1472 return PyInt_FromLong((long)
1473 XML_GetCurrentColumnNumber(self->itself));
1474 if (strcmp(name, "CurrentByteIndex") == 0)
1475 return PyInt_FromLong((long)
1476 XML_GetCurrentByteIndex(self->itself));
1477 }
Fred Drake2a3d7db2002-06-28 22:56:48 +00001478 if (name[0] == 'b') {
1479 if (strcmp(name, "buffer_size") == 0)
1480 return PyInt_FromLong((long) self->buffer_size);
1481 if (strcmp(name, "buffer_text") == 0)
1482 return get_pybool(self->buffer != NULL);
1483 if (strcmp(name, "buffer_used") == 0)
1484 return PyInt_FromLong((long) self->buffer_used);
1485 }
Martin v. Löwis069dde22003-01-21 10:58:18 +00001486 if (strcmp(name, "namespace_prefixes") == 0)
1487 return get_pybool(self->ns_prefixes);
Fred Drake85d835f2001-02-08 15:39:08 +00001488 if (strcmp(name, "ordered_attributes") == 0)
Fred Drake71b63ff2002-06-28 22:29:01 +00001489 return get_pybool(self->ordered_attributes);
Fred Drake0582df92000-07-12 04:49:00 +00001490 if (strcmp(name, "returns_unicode") == 0)
Fred Drake71b63ff2002-06-28 22:29:01 +00001491 return get_pybool((long) self->returns_unicode);
Fred Drake85d835f2001-02-08 15:39:08 +00001492 if (strcmp(name, "specified_attributes") == 0)
Fred Drake71b63ff2002-06-28 22:29:01 +00001493 return get_pybool((long) self->specified_attributes);
Fred Drakeb91a36b2002-06-27 19:40:48 +00001494 if (strcmp(name, "intern") == 0) {
1495 if (self->intern == NULL) {
1496 Py_INCREF(Py_None);
1497 return Py_None;
1498 }
1499 else {
1500 Py_INCREF(self->intern);
1501 return self->intern;
1502 }
1503 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001504
Neal Norwitzfa56e2d2003-01-19 15:40:09 +00001505#define APPEND(list, str) \
Martin v. Löwis069dde22003-01-21 10:58:18 +00001506 do { \
1507 PyObject *o = PyString_FromString(str); \
1508 if (o != NULL) \
1509 PyList_Append(list, o); \
1510 Py_XDECREF(o); \
1511 } while (0)
Neal Norwitzfa56e2d2003-01-19 15:40:09 +00001512
Fred Drake0582df92000-07-12 04:49:00 +00001513 if (strcmp(name, "__members__") == 0) {
1514 int i;
1515 PyObject *rc = PyList_New(0);
Fred Drake71b63ff2002-06-28 22:29:01 +00001516 for (i = 0; handler_info[i].name != NULL; i++) {
Neal Norwitzfa56e2d2003-01-19 15:40:09 +00001517 PyObject *o = get_handler_name(&handler_info[i]);
1518 if (o != NULL)
1519 PyList_Append(rc, o);
1520 Py_XDECREF(o);
Fred Drake0582df92000-07-12 04:49:00 +00001521 }
Neal Norwitzfa56e2d2003-01-19 15:40:09 +00001522 APPEND(rc, "ErrorCode");
1523 APPEND(rc, "ErrorLineNumber");
1524 APPEND(rc, "ErrorColumnNumber");
1525 APPEND(rc, "ErrorByteIndex");
Dave Cole3203efb2004-08-26 00:37:31 +00001526 APPEND(rc, "CurrentLineNumber");
1527 APPEND(rc, "CurrentColumnNumber");
1528 APPEND(rc, "CurrentByteIndex");
Neal Norwitzfa56e2d2003-01-19 15:40:09 +00001529 APPEND(rc, "buffer_size");
1530 APPEND(rc, "buffer_text");
1531 APPEND(rc, "buffer_used");
Martin v. Löwis069dde22003-01-21 10:58:18 +00001532 APPEND(rc, "namespace_prefixes");
Neal Norwitzfa56e2d2003-01-19 15:40:09 +00001533 APPEND(rc, "ordered_attributes");
1534 APPEND(rc, "returns_unicode");
1535 APPEND(rc, "specified_attributes");
1536 APPEND(rc, "intern");
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001537
Neal Norwitzfa56e2d2003-01-19 15:40:09 +00001538#undef APPEND
Fred Drake0582df92000-07-12 04:49:00 +00001539 return rc;
1540 }
1541 return Py_FindMethod(xmlparse_methods, (PyObject *)self, name);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001542}
1543
Fred Drake6f987622000-08-25 18:03:30 +00001544static int
1545sethandler(xmlparseobject *self, const char *name, PyObject* v)
Fred Drake0582df92000-07-12 04:49:00 +00001546{
1547 int handlernum = handlername2int(name);
Fred Drake71b63ff2002-06-28 22:29:01 +00001548 if (handlernum >= 0) {
1549 xmlhandler c_handler = NULL;
1550 PyObject *temp = self->handlers[handlernum];
1551
1552 if (v == Py_None)
1553 v = NULL;
1554 else if (v != NULL) {
1555 Py_INCREF(v);
1556 c_handler = handler_info[handlernum].handler;
1557 }
Fred Drake0582df92000-07-12 04:49:00 +00001558 self->handlers[handlernum] = v;
Fred Drake71b63ff2002-06-28 22:29:01 +00001559 Py_XDECREF(temp);
1560 handler_info[handlernum].setter(self->itself, c_handler);
Fred Drake0582df92000-07-12 04:49:00 +00001561 return 1;
1562 }
1563 return 0;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001564}
1565
1566static int
Fred Drake6f987622000-08-25 18:03:30 +00001567xmlparse_setattr(xmlparseobject *self, char *name, PyObject *v)
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001568{
Fred Drake6f987622000-08-25 18:03:30 +00001569 /* Set attribute 'name' to value 'v'. v==NULL means delete */
Fred Drake85d835f2001-02-08 15:39:08 +00001570 if (v == NULL) {
Fred Drake6f987622000-08-25 18:03:30 +00001571 PyErr_SetString(PyExc_RuntimeError, "Cannot delete attribute");
1572 return -1;
1573 }
Fred Drake2a3d7db2002-06-28 22:56:48 +00001574 if (strcmp(name, "buffer_text") == 0) {
1575 if (PyObject_IsTrue(v)) {
1576 if (self->buffer == NULL) {
1577 self->buffer = malloc(self->buffer_size);
1578 if (self->buffer == NULL) {
1579 PyErr_NoMemory();
1580 return -1;
1581 }
1582 self->buffer_used = 0;
1583 }
1584 }
1585 else if (self->buffer != NULL) {
1586 if (flush_character_buffer(self) < 0)
1587 return -1;
1588 free(self->buffer);
1589 self->buffer = NULL;
1590 }
1591 return 0;
1592 }
Martin v. Löwis069dde22003-01-21 10:58:18 +00001593 if (strcmp(name, "namespace_prefixes") == 0) {
1594 if (PyObject_IsTrue(v))
1595 self->ns_prefixes = 1;
1596 else
1597 self->ns_prefixes = 0;
1598 XML_SetReturnNSTriplet(self->itself, self->ns_prefixes);
1599 return 0;
1600 }
Fred Drake85d835f2001-02-08 15:39:08 +00001601 if (strcmp(name, "ordered_attributes") == 0) {
1602 if (PyObject_IsTrue(v))
1603 self->ordered_attributes = 1;
1604 else
1605 self->ordered_attributes = 0;
1606 return 0;
1607 }
Fred Drake6f987622000-08-25 18:03:30 +00001608 if (strcmp(name, "returns_unicode") == 0) {
Fred Drake85d835f2001-02-08 15:39:08 +00001609 if (PyObject_IsTrue(v)) {
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001610#ifndef Py_USING_UNICODE
Fred Drake71b63ff2002-06-28 22:29:01 +00001611 PyErr_SetString(PyExc_ValueError,
1612 "Unicode support not available");
Fred Drake6f987622000-08-25 18:03:30 +00001613 return -1;
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001614#else
Fred Drake6f987622000-08-25 18:03:30 +00001615 self->returns_unicode = 1;
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001616#endif
Fred Drake6f987622000-08-25 18:03:30 +00001617 }
1618 else
1619 self->returns_unicode = 0;
Fred Drake85d835f2001-02-08 15:39:08 +00001620 return 0;
1621 }
1622 if (strcmp(name, "specified_attributes") == 0) {
1623 if (PyObject_IsTrue(v))
1624 self->specified_attributes = 1;
1625 else
1626 self->specified_attributes = 0;
Fred Drake6f987622000-08-25 18:03:30 +00001627 return 0;
1628 }
Fred Drake2a3d7db2002-06-28 22:56:48 +00001629 if (strcmp(name, "CharacterDataHandler") == 0) {
1630 /* If we're changing the character data handler, flush all
1631 * cached data with the old handler. Not sure there's a
1632 * "right" thing to do, though, but this probably won't
1633 * happen.
1634 */
1635 if (flush_character_buffer(self) < 0)
1636 return -1;
1637 }
Fred Drake6f987622000-08-25 18:03:30 +00001638 if (sethandler(self, name, v)) {
1639 return 0;
1640 }
1641 PyErr_SetString(PyExc_AttributeError, name);
1642 return -1;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001643}
1644
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001645#ifdef WITH_CYCLE_GC
1646static int
1647xmlparse_traverse(xmlparseobject *op, visitproc visit, void *arg)
1648{
Fred Drakecde79132001-04-25 16:01:30 +00001649 int i, err;
1650 for (i = 0; handler_info[i].name != NULL; i++) {
1651 if (!op->handlers[i])
1652 continue;
1653 err = visit(op->handlers[i], arg);
1654 if (err)
1655 return err;
1656 }
1657 return 0;
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001658}
1659
1660static int
1661xmlparse_clear(xmlparseobject *op)
1662{
Martin v. Löwis5b68ce32001-10-21 08:53:52 +00001663 clear_handlers(op, 0);
Fred Drakeb91a36b2002-06-27 19:40:48 +00001664 Py_XDECREF(op->intern);
1665 op->intern = 0;
Fred Drakecde79132001-04-25 16:01:30 +00001666 return 0;
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001667}
1668#endif
1669
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001670PyDoc_STRVAR(Xmlparsetype__doc__, "XML parser");
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001671
1672static PyTypeObject Xmlparsetype = {
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001673 PyObject_HEAD_INIT(NULL)
1674 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00001675 "pyexpat.xmlparser", /*tp_name*/
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001676 sizeof(xmlparseobject) + PyGC_HEAD_SIZE,/*tp_basicsize*/
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001677 0, /*tp_itemsize*/
1678 /* methods */
1679 (destructor)xmlparse_dealloc, /*tp_dealloc*/
1680 (printfunc)0, /*tp_print*/
1681 (getattrfunc)xmlparse_getattr, /*tp_getattr*/
1682 (setattrfunc)xmlparse_setattr, /*tp_setattr*/
1683 (cmpfunc)0, /*tp_compare*/
1684 (reprfunc)0, /*tp_repr*/
1685 0, /*tp_as_number*/
1686 0, /*tp_as_sequence*/
1687 0, /*tp_as_mapping*/
1688 (hashfunc)0, /*tp_hash*/
1689 (ternaryfunc)0, /*tp_call*/
1690 (reprfunc)0, /*tp_str*/
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001691 0, /* tp_getattro */
1692 0, /* tp_setattro */
1693 0, /* tp_as_buffer */
Martin v. Löwis894258c2001-09-23 10:20:10 +00001694#ifdef Py_TPFLAGS_HAVE_GC
Fred Drake71b63ff2002-06-28 22:29:01 +00001695 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
Martin v. Löwis894258c2001-09-23 10:20:10 +00001696#else
Fred Drake71b63ff2002-06-28 22:29:01 +00001697 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
Martin v. Löwis894258c2001-09-23 10:20:10 +00001698#endif
Martin v. Löwis069dde22003-01-21 10:58:18 +00001699 Xmlparsetype__doc__, /* tp_doc - Documentation string */
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001700#ifdef WITH_CYCLE_GC
1701 (traverseproc)xmlparse_traverse, /* tp_traverse */
1702 (inquiry)xmlparse_clear /* tp_clear */
1703#else
1704 0, 0
1705#endif
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001706};
1707
1708/* End of code for xmlparser objects */
1709/* -------------------------------------------------------- */
1710
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001711PyDoc_STRVAR(pyexpat_ParserCreate__doc__,
Fred Drake0582df92000-07-12 04:49:00 +00001712"ParserCreate([encoding[, namespace_separator]]) -> parser\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001713Return a new XML parser object.");
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001714
1715static PyObject *
Fred Drake0582df92000-07-12 04:49:00 +00001716pyexpat_ParserCreate(PyObject *notused, PyObject *args, PyObject *kw)
1717{
Fred Drakecde79132001-04-25 16:01:30 +00001718 char *encoding = NULL;
1719 char *namespace_separator = NULL;
Fred Drakeb91a36b2002-06-27 19:40:48 +00001720 PyObject *intern = NULL;
1721 PyObject *result;
1722 int intern_decref = 0;
Fred Drake71b63ff2002-06-28 22:29:01 +00001723 static char *kwlist[] = {"encoding", "namespace_separator",
Fred Drakeb91a36b2002-06-27 19:40:48 +00001724 "intern", NULL};
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001725
Fred Drakeb91a36b2002-06-27 19:40:48 +00001726 if (!PyArg_ParseTupleAndKeywords(args, kw, "|zzO:ParserCreate", kwlist,
1727 &encoding, &namespace_separator, &intern))
Fred Drakecde79132001-04-25 16:01:30 +00001728 return NULL;
1729 if (namespace_separator != NULL
1730 && strlen(namespace_separator) > 1) {
1731 PyErr_SetString(PyExc_ValueError,
1732 "namespace_separator must be at most one"
1733 " character, omitted, or None");
1734 return NULL;
1735 }
Fred Drakeb91a36b2002-06-27 19:40:48 +00001736 /* Explicitly passing None means no interning is desired.
1737 Not passing anything means that a new dictionary is used. */
1738 if (intern == Py_None)
1739 intern = NULL;
1740 else if (intern == NULL) {
1741 intern = PyDict_New();
1742 if (!intern)
1743 return NULL;
1744 intern_decref = 1;
Fred Drake71b63ff2002-06-28 22:29:01 +00001745 }
Fred Drakeb91a36b2002-06-27 19:40:48 +00001746 else if (!PyDict_Check(intern)) {
1747 PyErr_SetString(PyExc_TypeError, "intern must be a dictionary");
1748 return NULL;
1749 }
1750
1751 result = newxmlparseobject(encoding, namespace_separator, intern);
1752 if (intern_decref) {
1753 Py_DECREF(intern);
1754 }
1755 return result;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001756}
1757
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001758PyDoc_STRVAR(pyexpat_ErrorString__doc__,
Fred Drake0582df92000-07-12 04:49:00 +00001759"ErrorString(errno) -> string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001760Returns string error for given number.");
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001761
1762static PyObject *
Fred Drake0582df92000-07-12 04:49:00 +00001763pyexpat_ErrorString(PyObject *self, PyObject *args)
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001764{
Fred Drake0582df92000-07-12 04:49:00 +00001765 long code = 0;
1766
1767 if (!PyArg_ParseTuple(args, "l:ErrorString", &code))
1768 return NULL;
1769 return Py_BuildValue("z", XML_ErrorString((int)code));
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001770}
1771
1772/* List of methods defined in the module */
1773
1774static struct PyMethodDef pyexpat_methods[] = {
Fred Drake0582df92000-07-12 04:49:00 +00001775 {"ParserCreate", (PyCFunction)pyexpat_ParserCreate,
1776 METH_VARARGS|METH_KEYWORDS, pyexpat_ParserCreate__doc__},
1777 {"ErrorString", (PyCFunction)pyexpat_ErrorString,
1778 METH_VARARGS, pyexpat_ErrorString__doc__},
Fred Drake71b63ff2002-06-28 22:29:01 +00001779
Fred Drake0582df92000-07-12 04:49:00 +00001780 {NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001781};
1782
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001783/* Module docstring */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001784
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001785PyDoc_STRVAR(pyexpat_module_documentation,
1786"Python wrapper for Expat parser.");
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001787
Fred Drake4113b132001-03-24 19:58:26 +00001788/* Return a Python string that represents the version number without the
1789 * extra cruft added by revision control, even if the right options were
1790 * given to the "cvs export" command to make it not include the extra
1791 * cruft.
1792 */
1793static PyObject *
1794get_version_string(void)
1795{
1796 static char *rcsid = "$Revision$";
1797 char *rev = rcsid;
1798 int i = 0;
1799
Neal Norwitz3afb2d22002-03-20 21:32:07 +00001800 while (!isdigit((int)*rev))
Fred Drake4113b132001-03-24 19:58:26 +00001801 ++rev;
1802 while (rev[i] != ' ' && rev[i] != '\0')
1803 ++i;
1804
1805 return PyString_FromStringAndSize(rev, i);
1806}
1807
Fred Drakecde79132001-04-25 16:01:30 +00001808/* Initialization function for the module */
1809
1810#ifndef MODULE_NAME
1811#define MODULE_NAME "pyexpat"
1812#endif
1813
1814#ifndef MODULE_INITFUNC
1815#define MODULE_INITFUNC initpyexpat
1816#endif
1817
Martin v. Löwis069dde22003-01-21 10:58:18 +00001818#ifndef PyMODINIT_FUNC
1819# ifdef MS_WINDOWS
1820# define PyMODINIT_FUNC __declspec(dllexport) void
1821# else
1822# define PyMODINIT_FUNC void
1823# endif
1824#endif
1825
Mark Hammond8235ea12002-07-19 06:55:41 +00001826PyMODINIT_FUNC MODULE_INITFUNC(void); /* avoid compiler warnings */
Fred Drakecde79132001-04-25 16:01:30 +00001827
Martin v. Löwis069dde22003-01-21 10:58:18 +00001828PyMODINIT_FUNC
1829MODULE_INITFUNC(void)
Fred Drake0582df92000-07-12 04:49:00 +00001830{
1831 PyObject *m, *d;
Fred Drakecde79132001-04-25 16:01:30 +00001832 PyObject *errmod_name = PyString_FromString(MODULE_NAME ".errors");
Fred Drake85d835f2001-02-08 15:39:08 +00001833 PyObject *errors_module;
1834 PyObject *modelmod_name;
1835 PyObject *model_module;
Fred Drake0582df92000-07-12 04:49:00 +00001836 PyObject *sys_modules;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001837
Fred Drake6f987622000-08-25 18:03:30 +00001838 if (errmod_name == NULL)
1839 return;
Fred Drakecde79132001-04-25 16:01:30 +00001840 modelmod_name = PyString_FromString(MODULE_NAME ".model");
Fred Drake85d835f2001-02-08 15:39:08 +00001841 if (modelmod_name == NULL)
1842 return;
Fred Drake6f987622000-08-25 18:03:30 +00001843
Fred Drake0582df92000-07-12 04:49:00 +00001844 Xmlparsetype.ob_type = &PyType_Type;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001845
Fred Drake0582df92000-07-12 04:49:00 +00001846 /* Create the module and add the functions */
Fred Drakecde79132001-04-25 16:01:30 +00001847 m = Py_InitModule3(MODULE_NAME, pyexpat_methods,
Fred Drake85d835f2001-02-08 15:39:08 +00001848 pyexpat_module_documentation);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001849
Fred Drake0582df92000-07-12 04:49:00 +00001850 /* Add some symbolic constants to the module */
Fred Drakebd6101c2001-02-14 18:29:45 +00001851 if (ErrorObject == NULL) {
1852 ErrorObject = PyErr_NewException("xml.parsers.expat.ExpatError",
Fred Drake93adb692000-09-23 04:55:48 +00001853 NULL, NULL);
Fred Drakebd6101c2001-02-14 18:29:45 +00001854 if (ErrorObject == NULL)
1855 return;
1856 }
1857 Py_INCREF(ErrorObject);
Fred Drake93adb692000-09-23 04:55:48 +00001858 PyModule_AddObject(m, "error", ErrorObject);
Fred Drakebd6101c2001-02-14 18:29:45 +00001859 Py_INCREF(ErrorObject);
1860 PyModule_AddObject(m, "ExpatError", ErrorObject);
Fred Drake4ba298c2000-10-29 04:57:53 +00001861 Py_INCREF(&Xmlparsetype);
1862 PyModule_AddObject(m, "XMLParserType", (PyObject *) &Xmlparsetype);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001863
Fred Drake4113b132001-03-24 19:58:26 +00001864 PyModule_AddObject(m, "__version__", get_version_string());
Fred Drake738293d2000-12-21 17:25:07 +00001865 PyModule_AddStringConstant(m, "EXPAT_VERSION",
1866 (char *) XML_ExpatVersion());
Fred Drake85d835f2001-02-08 15:39:08 +00001867 {
1868 XML_Expat_Version info = XML_ExpatVersionInfo();
1869 PyModule_AddObject(m, "version_info",
1870 Py_BuildValue("(iii)", info.major,
1871 info.minor, info.micro));
1872 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001873#ifdef Py_USING_UNICODE
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001874 init_template_buffer();
1875#endif
Fred Drake0582df92000-07-12 04:49:00 +00001876 /* XXX When Expat supports some way of figuring out how it was
Fred Drake71b63ff2002-06-28 22:29:01 +00001877 compiled, this should check and set native_encoding
1878 appropriately.
Fred Drake0582df92000-07-12 04:49:00 +00001879 */
Fred Drake93adb692000-09-23 04:55:48 +00001880 PyModule_AddStringConstant(m, "native_encoding", "UTF-8");
Fred Drakec23b5232000-08-24 21:57:43 +00001881
Fred Drake85d835f2001-02-08 15:39:08 +00001882 sys_modules = PySys_GetObject("modules");
Fred Drake93adb692000-09-23 04:55:48 +00001883 d = PyModule_GetDict(m);
Fred Drake6f987622000-08-25 18:03:30 +00001884 errors_module = PyDict_GetItem(d, errmod_name);
1885 if (errors_module == NULL) {
Fred Drakecde79132001-04-25 16:01:30 +00001886 errors_module = PyModule_New(MODULE_NAME ".errors");
Fred Drake6f987622000-08-25 18:03:30 +00001887 if (errors_module != NULL) {
Fred Drake6f987622000-08-25 18:03:30 +00001888 PyDict_SetItem(sys_modules, errmod_name, errors_module);
Fred Drake93adb692000-09-23 04:55:48 +00001889 /* gives away the reference to errors_module */
1890 PyModule_AddObject(m, "errors", errors_module);
Fred Drakec23b5232000-08-24 21:57:43 +00001891 }
1892 }
Fred Drake6f987622000-08-25 18:03:30 +00001893 Py_DECREF(errmod_name);
Fred Drake85d835f2001-02-08 15:39:08 +00001894 model_module = PyDict_GetItem(d, modelmod_name);
1895 if (model_module == NULL) {
Fred Drakecde79132001-04-25 16:01:30 +00001896 model_module = PyModule_New(MODULE_NAME ".model");
Fred Drake85d835f2001-02-08 15:39:08 +00001897 if (model_module != NULL) {
1898 PyDict_SetItem(sys_modules, modelmod_name, model_module);
1899 /* gives away the reference to model_module */
1900 PyModule_AddObject(m, "model", model_module);
1901 }
1902 }
1903 Py_DECREF(modelmod_name);
1904 if (errors_module == NULL || model_module == NULL)
1905 /* Don't core dump later! */
Fred Drake6f987622000-08-25 18:03:30 +00001906 return;
Martin v. Löwis069dde22003-01-21 10:58:18 +00001907
Martin v. Löwisc847f402003-01-21 11:09:21 +00001908#if XML_COMBINED_VERSION > 19505
Martin v. Löwis069dde22003-01-21 10:58:18 +00001909 {
1910 const XML_Feature *features = XML_GetFeatureList();
1911 PyObject *list = PyList_New(0);
1912 if (list == NULL)
1913 /* just ignore it */
1914 PyErr_Clear();
1915 else {
1916 int i = 0;
1917 for (; features[i].feature != XML_FEATURE_END; ++i) {
1918 int ok;
1919 PyObject *item = Py_BuildValue("si", features[i].name,
1920 features[i].value);
1921 if (item == NULL) {
1922 Py_DECREF(list);
1923 list = NULL;
1924 break;
1925 }
1926 ok = PyList_Append(list, item);
1927 Py_DECREF(item);
1928 if (ok < 0) {
1929 PyErr_Clear();
1930 break;
1931 }
1932 }
1933 if (list != NULL)
1934 PyModule_AddObject(m, "features", list);
1935 }
1936 }
Martin v. Löwisc847f402003-01-21 11:09:21 +00001937#endif
Fred Drake6f987622000-08-25 18:03:30 +00001938
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001939#define MYCONST(name) \
Fred Drake93adb692000-09-23 04:55:48 +00001940 PyModule_AddStringConstant(errors_module, #name, \
1941 (char*)XML_ErrorString(name))
Fred Drake7bd9f412000-07-04 23:51:31 +00001942
Fred Drake0582df92000-07-12 04:49:00 +00001943 MYCONST(XML_ERROR_NO_MEMORY);
1944 MYCONST(XML_ERROR_SYNTAX);
1945 MYCONST(XML_ERROR_NO_ELEMENTS);
1946 MYCONST(XML_ERROR_INVALID_TOKEN);
1947 MYCONST(XML_ERROR_UNCLOSED_TOKEN);
1948 MYCONST(XML_ERROR_PARTIAL_CHAR);
1949 MYCONST(XML_ERROR_TAG_MISMATCH);
1950 MYCONST(XML_ERROR_DUPLICATE_ATTRIBUTE);
1951 MYCONST(XML_ERROR_JUNK_AFTER_DOC_ELEMENT);
1952 MYCONST(XML_ERROR_PARAM_ENTITY_REF);
1953 MYCONST(XML_ERROR_UNDEFINED_ENTITY);
1954 MYCONST(XML_ERROR_RECURSIVE_ENTITY_REF);
1955 MYCONST(XML_ERROR_ASYNC_ENTITY);
1956 MYCONST(XML_ERROR_BAD_CHAR_REF);
1957 MYCONST(XML_ERROR_BINARY_ENTITY_REF);
1958 MYCONST(XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF);
1959 MYCONST(XML_ERROR_MISPLACED_XML_PI);
1960 MYCONST(XML_ERROR_UNKNOWN_ENCODING);
1961 MYCONST(XML_ERROR_INCORRECT_ENCODING);
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001962 MYCONST(XML_ERROR_UNCLOSED_CDATA_SECTION);
1963 MYCONST(XML_ERROR_EXTERNAL_ENTITY_HANDLING);
1964 MYCONST(XML_ERROR_NOT_STANDALONE);
Fred Drake283b6702004-08-04 22:28:16 +00001965 MYCONST(XML_ERROR_UNEXPECTED_STATE);
1966 MYCONST(XML_ERROR_ENTITY_DECLARED_IN_PE);
1967 MYCONST(XML_ERROR_FEATURE_REQUIRES_XML_DTD);
1968 MYCONST(XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING);
1969 /* Added in Expat 1.95.7. */
1970 MYCONST(XML_ERROR_UNBOUND_PREFIX);
1971 /* Added in Expat 1.95.8. */
1972 MYCONST(XML_ERROR_UNDECLARING_PREFIX);
1973 MYCONST(XML_ERROR_INCOMPLETE_PE);
1974 MYCONST(XML_ERROR_XML_DECL);
1975 MYCONST(XML_ERROR_TEXT_DECL);
1976 MYCONST(XML_ERROR_PUBLICID);
1977 MYCONST(XML_ERROR_SUSPENDED);
1978 MYCONST(XML_ERROR_NOT_SUSPENDED);
1979 MYCONST(XML_ERROR_ABORTED);
1980 MYCONST(XML_ERROR_FINISHED);
1981 MYCONST(XML_ERROR_SUSPEND_PE);
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001982
Fred Drake85d835f2001-02-08 15:39:08 +00001983 PyModule_AddStringConstant(errors_module, "__doc__",
1984 "Constants used to describe error conditions.");
1985
Fred Drake93adb692000-09-23 04:55:48 +00001986#undef MYCONST
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001987
Fred Drake85d835f2001-02-08 15:39:08 +00001988#define MYCONST(c) PyModule_AddIntConstant(m, #c, c)
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001989 MYCONST(XML_PARAM_ENTITY_PARSING_NEVER);
1990 MYCONST(XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE);
1991 MYCONST(XML_PARAM_ENTITY_PARSING_ALWAYS);
Fred Drake85d835f2001-02-08 15:39:08 +00001992#undef MYCONST
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001993
Fred Drake85d835f2001-02-08 15:39:08 +00001994#define MYCONST(c) PyModule_AddIntConstant(model_module, #c, c)
1995 PyModule_AddStringConstant(model_module, "__doc__",
1996 "Constants used to interpret content model information.");
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001997
Fred Drake85d835f2001-02-08 15:39:08 +00001998 MYCONST(XML_CTYPE_EMPTY);
1999 MYCONST(XML_CTYPE_ANY);
2000 MYCONST(XML_CTYPE_MIXED);
2001 MYCONST(XML_CTYPE_NAME);
2002 MYCONST(XML_CTYPE_CHOICE);
2003 MYCONST(XML_CTYPE_SEQ);
2004
2005 MYCONST(XML_CQUANT_NONE);
2006 MYCONST(XML_CQUANT_OPT);
2007 MYCONST(XML_CQUANT_REP);
2008 MYCONST(XML_CQUANT_PLUS);
2009#undef MYCONST
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00002010}
2011
Fred Drake6f987622000-08-25 18:03:30 +00002012static void
Martin v. Löwis5b68ce32001-10-21 08:53:52 +00002013clear_handlers(xmlparseobject *self, int initial)
Fred Drake0582df92000-07-12 04:49:00 +00002014{
Fred Drakecde79132001-04-25 16:01:30 +00002015 int i = 0;
2016 PyObject *temp;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00002017
Fred Drake71b63ff2002-06-28 22:29:01 +00002018 for (; handler_info[i].name != NULL; i++) {
Martin v. Löwis5b68ce32001-10-21 08:53:52 +00002019 if (initial)
Fred Drake71b63ff2002-06-28 22:29:01 +00002020 self->handlers[i] = NULL;
Martin v. Löwis5b68ce32001-10-21 08:53:52 +00002021 else {
Fred Drakecde79132001-04-25 16:01:30 +00002022 temp = self->handlers[i];
2023 self->handlers[i] = NULL;
2024 Py_XDECREF(temp);
Martin v. Löwis5b68ce32001-10-21 08:53:52 +00002025 handler_info[i].setter(self->itself, NULL);
Fred Drakecde79132001-04-25 16:01:30 +00002026 }
Fred Drakecde79132001-04-25 16:01:30 +00002027 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00002028}
2029
Tim Peters0c322792002-07-17 16:49:03 +00002030static struct HandlerInfo handler_info[] = {
Fred Drake71b63ff2002-06-28 22:29:01 +00002031 {"StartElementHandler",
2032 (xmlhandlersetter)XML_SetStartElementHandler,
Fred Drake0582df92000-07-12 04:49:00 +00002033 (xmlhandler)my_StartElementHandler},
Fred Drake71b63ff2002-06-28 22:29:01 +00002034 {"EndElementHandler",
2035 (xmlhandlersetter)XML_SetEndElementHandler,
Fred Drake0582df92000-07-12 04:49:00 +00002036 (xmlhandler)my_EndElementHandler},
Fred Drake71b63ff2002-06-28 22:29:01 +00002037 {"ProcessingInstructionHandler",
Fred Drake0582df92000-07-12 04:49:00 +00002038 (xmlhandlersetter)XML_SetProcessingInstructionHandler,
2039 (xmlhandler)my_ProcessingInstructionHandler},
Fred Drake71b63ff2002-06-28 22:29:01 +00002040 {"CharacterDataHandler",
Fred Drake0582df92000-07-12 04:49:00 +00002041 (xmlhandlersetter)XML_SetCharacterDataHandler,
2042 (xmlhandler)my_CharacterDataHandler},
Fred Drake71b63ff2002-06-28 22:29:01 +00002043 {"UnparsedEntityDeclHandler",
Fred Drake0582df92000-07-12 04:49:00 +00002044 (xmlhandlersetter)XML_SetUnparsedEntityDeclHandler,
Fred Drake2a3d7db2002-06-28 22:56:48 +00002045 (xmlhandler)my_UnparsedEntityDeclHandler},
Fred Drake71b63ff2002-06-28 22:29:01 +00002046 {"NotationDeclHandler",
Fred Drake0582df92000-07-12 04:49:00 +00002047 (xmlhandlersetter)XML_SetNotationDeclHandler,
Fred Drake2a3d7db2002-06-28 22:56:48 +00002048 (xmlhandler)my_NotationDeclHandler},
Fred Drake71b63ff2002-06-28 22:29:01 +00002049 {"StartNamespaceDeclHandler",
2050 (xmlhandlersetter)XML_SetStartNamespaceDeclHandler,
Fred Drake2a3d7db2002-06-28 22:56:48 +00002051 (xmlhandler)my_StartNamespaceDeclHandler},
Fred Drake71b63ff2002-06-28 22:29:01 +00002052 {"EndNamespaceDeclHandler",
2053 (xmlhandlersetter)XML_SetEndNamespaceDeclHandler,
Fred Drake2a3d7db2002-06-28 22:56:48 +00002054 (xmlhandler)my_EndNamespaceDeclHandler},
Fred Drake0582df92000-07-12 04:49:00 +00002055 {"CommentHandler",
2056 (xmlhandlersetter)XML_SetCommentHandler,
2057 (xmlhandler)my_CommentHandler},
2058 {"StartCdataSectionHandler",
Fred Drake71b63ff2002-06-28 22:29:01 +00002059 (xmlhandlersetter)XML_SetStartCdataSectionHandler,
Fred Drake0582df92000-07-12 04:49:00 +00002060 (xmlhandler)my_StartCdataSectionHandler},
2061 {"EndCdataSectionHandler",
Fred Drake71b63ff2002-06-28 22:29:01 +00002062 (xmlhandlersetter)XML_SetEndCdataSectionHandler,
Fred Drake0582df92000-07-12 04:49:00 +00002063 (xmlhandler)my_EndCdataSectionHandler},
2064 {"DefaultHandler",
2065 (xmlhandlersetter)XML_SetDefaultHandler,
2066 (xmlhandler)my_DefaultHandler},
2067 {"DefaultHandlerExpand",
2068 (xmlhandlersetter)XML_SetDefaultHandlerExpand,
2069 (xmlhandler)my_DefaultHandlerExpandHandler},
2070 {"NotStandaloneHandler",
2071 (xmlhandlersetter)XML_SetNotStandaloneHandler,
2072 (xmlhandler)my_NotStandaloneHandler},
2073 {"ExternalEntityRefHandler",
2074 (xmlhandlersetter)XML_SetExternalEntityRefHandler,
Fred Drake2a3d7db2002-06-28 22:56:48 +00002075 (xmlhandler)my_ExternalEntityRefHandler},
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00002076 {"StartDoctypeDeclHandler",
Fred Drake71b63ff2002-06-28 22:29:01 +00002077 (xmlhandlersetter)XML_SetStartDoctypeDeclHandler,
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00002078 (xmlhandler)my_StartDoctypeDeclHandler},
2079 {"EndDoctypeDeclHandler",
Fred Drake71b63ff2002-06-28 22:29:01 +00002080 (xmlhandlersetter)XML_SetEndDoctypeDeclHandler,
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00002081 (xmlhandler)my_EndDoctypeDeclHandler},
Fred Drake85d835f2001-02-08 15:39:08 +00002082 {"EntityDeclHandler",
2083 (xmlhandlersetter)XML_SetEntityDeclHandler,
2084 (xmlhandler)my_EntityDeclHandler},
2085 {"XmlDeclHandler",
2086 (xmlhandlersetter)XML_SetXmlDeclHandler,
2087 (xmlhandler)my_XmlDeclHandler},
2088 {"ElementDeclHandler",
2089 (xmlhandlersetter)XML_SetElementDeclHandler,
2090 (xmlhandler)my_ElementDeclHandler},
2091 {"AttlistDeclHandler",
2092 (xmlhandlersetter)XML_SetAttlistDeclHandler,
2093 (xmlhandler)my_AttlistDeclHandler},
Martin v. Löwisc847f402003-01-21 11:09:21 +00002094#if XML_COMBINED_VERSION >= 19504
Martin v. Löwis069dde22003-01-21 10:58:18 +00002095 {"SkippedEntityHandler",
2096 (xmlhandlersetter)XML_SetSkippedEntityHandler,
2097 (xmlhandler)my_SkippedEntityHandler},
Martin v. Löwisc847f402003-01-21 11:09:21 +00002098#endif
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00002099
Fred Drake0582df92000-07-12 04:49:00 +00002100 {NULL, NULL, NULL} /* sentinel */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00002101};