blob: a1ef8cbbffbd33510eef0482c7e842eb8ea6bae0 [file] [log] [blame]
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001/***********************************************************
2Copyright 2000 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
4
5 All Rights Reserved
6
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000014
15******************************************************************/
16
17#include "Python.h"
18#include "xmlparse.h"
19
20/*
21** The version number should match the one in _checkversion
22*/
23#define VERSION "1.9"
24
25enum HandlerTypes{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +000026 StartElement,
27 EndElement,
28 ProcessingInstruction,
29 CharacterData,
30 UnparsedEntityDecl,
31 NotationDecl,
32 StartNamespaceDecl,
33 EndNamespaceDecl,
34 Comment,
35 StartCdataSection,
36 EndCdataSection,
37 Default,
38 DefaultHandlerExpand,
39 NotStandalone,
40 ExternalEntityRef
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000041};
42
43static PyObject *ErrorObject;
44
45/* ----------------------------------------------------- */
46
47/* Declarations for objects of type xmlparser */
48
49typedef struct {
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +000050 PyObject_HEAD
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000051
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +000052 XML_Parser itself;
53 int returns_unicode; /* True if Unicode strings are returned;
54 if false, UTF-8 strings are returned */
55 PyObject **handlers;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000056} xmlparseobject;
57
58staticforward PyTypeObject Xmlparsetype;
59
60typedef void (*xmlhandlersetter)( XML_Parser *self, void *meth );
61typedef void* xmlhandler;
62
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +000063struct HandlerInfo {
64 const char *name;
65 xmlhandlersetter setter;
66 xmlhandler handler;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000067};
68
Guido van Rossum5961f5a2000-03-31 16:18:11 +000069staticforward struct HandlerInfo handler_info[];
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000070
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +000071/* Convert an array of attributes and their values into a Python dict */
72
73static PyObject *conv_atts_using_string( XML_Char **atts){
74 PyObject *attrs_obj=NULL;
75 XML_Char **attrs_p, **attrs_k;
76 int attrs_len;
77 PyObject *rv;
78
79 if( (attrs_obj = PyDict_New()) == NULL )
80 goto finally;
81 for(attrs_len=0, attrs_p = atts;
82 *attrs_p;
83 attrs_p++, attrs_len++) {
84 if (attrs_len%2) {
85 rv=PyString_FromString(*attrs_p);
86 if (! rv) {
87 Py_DECREF(attrs_obj);
88 attrs_obj=NULL;
89 goto finally;
90 }
91 if (PyDict_SetItemString(
92 attrs_obj,
93 (char*)*attrs_k, rv) < 0){
94 Py_DECREF(attrs_obj);
95 attrs_obj=NULL;
96 goto finally;
97 }
98 Py_DECREF(rv);
99 }
100 else attrs_k=attrs_p;
101 }
102 finally:
103 return attrs_obj;
104}
105
106#if !(PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6)
107static PyObject *conv_atts_using_unicode( XML_Char **atts){
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000108 PyObject *attrs_obj=NULL;
109 XML_Char **attrs_p, **attrs_k;
110 int attrs_len;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000111
112 if( (attrs_obj = PyDict_New()) == NULL )
113 goto finally;
114 for(attrs_len=0, attrs_p = atts;
115 *attrs_p;
116 attrs_p++, attrs_len++) {
117 if (attrs_len%2) {
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000118 PyObject *attr_str, *value_str;
119 const char *p = (const char *) (*attrs_k);
120 attr_str=PyUnicode_DecodeUTF8(p, strlen(p), "strict");
121 if (! attr_str) {
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000122 Py_DECREF(attrs_obj);
123 attrs_obj=NULL;
124 goto finally;
125 }
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000126 p = (const char *) *attrs_p;
127 value_str=PyUnicode_DecodeUTF8(p, strlen(p), "strict");
128 if (! value_str) {
129 Py_DECREF(attrs_obj);
130 Py_DECREF(attr_str);
131 attrs_obj=NULL;
132 goto finally;
133 }
134 if (PyDict_SetItem(attrs_obj, attr_str, value_str) < 0) {
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000135 Py_DECREF(attrs_obj);
136 attrs_obj=NULL;
137 goto finally;
138 }
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000139 Py_DECREF(attr_str);
140 Py_DECREF(value_str);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000141 }
142 else attrs_k=attrs_p;
143 }
144 finally:
145 return attrs_obj;
146}
147
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000148/* Convert a string of XML_Chars into a Unicode string.
149 Returns None if str is a null pointer. */
150
151static PyObject *conv_string_to_unicode( XML_Char *str ) {
152 /* XXX currently this code assumes that XML_Char is 8-bit,
153 and hence in UTF-8. */
154 /* UTF-8 from Expat, Unicode desired */
155 if (str == NULL) {Py_INCREF(Py_None); return Py_None;}
156 return PyUnicode_DecodeUTF8( (const char *)str,
157 strlen( (const char *)str ),
158 "strict" );
159}
160
161static PyObject *conv_string_len_to_unicode( const XML_Char *str, int len ) {
162 /* XXX currently this code assumes that XML_Char is 8-bit,
163 and hence in UTF-8. */
164 /* UTF-8 from Expat, Unicode desired */
165 if (str == NULL) {Py_INCREF(Py_None); return Py_None;}
166 return PyUnicode_DecodeUTF8( (const char *)str,
167 len,
168 "strict" );
169}
170#endif
171
172/* Convert a string of XML_Chars into an 8-bit Python string.
173 Returns None if str is a null pointer. */
174
175static PyObject *conv_string_to_utf8( XML_Char *str ) {
176 /* XXX currently this code assumes that XML_Char is 8-bit,
177 and hence in UTF-8. */
178 /* UTF-8 from Expat, UTF-8 desired */
179 if (str == NULL) {Py_INCREF(Py_None); return Py_None;}
180 return PyString_FromString( (const char *)str );
181}
182
183static PyObject *conv_string_len_to_utf8( const XML_Char *str,
184 int len )
185{
186 /* XXX currently this code assumes that XML_Char is 8-bit,
187 and hence in UTF-8. */
188 /* UTF-8 from Expat, UTF-8 desired */
189 if (str == NULL) {Py_INCREF(Py_None); return Py_None;}
190 return PyString_FromStringAndSize( (const char *)str, len );
191}
192
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000193/* Callback routines */
194
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000195static void clear_handlers( xmlparseobject *self );
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000196
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000197static void flag_error( xmlparseobject *self ){
198 clear_handlers(self);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000199}
200
201#define RC_HANDLER( RC, NAME, PARAMS, INIT, PARAM_FORMAT, CONVERSION, \
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000202 RETURN, GETUSERDATA) \
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000203\
204static RC my_##NAME##Handler PARAMS {\
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000205 xmlparseobject *self = GETUSERDATA ; \
206 PyObject *args=NULL; \
207 PyObject *rv=NULL; \
208 INIT \
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000209\
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000210 if (self->handlers[NAME] \
211 && self->handlers[NAME] != Py_None) { \
212 args = Py_BuildValue PARAM_FORMAT ;\
213 if (!args) return RETURN; \
214 rv = PyEval_CallObject(self->handlers[NAME], args); \
215 Py_DECREF(args); \
216 if (rv == NULL) { \
217 flag_error( self ); \
218 return RETURN; \
219 } \
220 CONVERSION \
221 Py_DECREF(rv); \
222 } \
223 return RETURN; \
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000224}
225
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000226#if PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6
227#define STRING_CONV_FUNC conv_string_to_utf8
228#else
229/* Python 1.6 and later versions */
230#define STRING_CONV_FUNC (self->returns_unicode \
231 ? conv_string_to_unicode : conv_string_to_utf8)
232#endif
Guido van Rossum5961f5a2000-03-31 16:18:11 +0000233
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000234#define VOID_HANDLER( NAME, PARAMS, PARAM_FORMAT ) \
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000235 RC_HANDLER( void, NAME, PARAMS, ;, PARAM_FORMAT, ;, ;,\
236 (xmlparseobject *)userData )
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000237
238#define INT_HANDLER( NAME, PARAMS, PARAM_FORMAT )\
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000239 RC_HANDLER( int, NAME, PARAMS, int rc=0;, PARAM_FORMAT, \
240 rc = PyInt_AsLong( rv );, rc, \
241 (xmlparseobject *)userData )
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000242
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000243#if PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000244VOID_HANDLER( StartElement,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000245 (void *userData, const XML_Char *name, const XML_Char **atts ),
246 ("(O&O&)", STRING_CONV_FUNC, name,
247 conv_atts_using_string, atts ) )
248#else
249/* Python 1.6 and later */
250VOID_HANDLER( StartElement,
251 (void *userData, const XML_Char *name, const XML_Char **atts ),
252 ("(O&O&)", STRING_CONV_FUNC, name,
253 (self->returns_unicode
254 ? conv_atts_using_unicode
255 : conv_atts_using_string), atts ) )
256#endif
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000257
258VOID_HANDLER( EndElement,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000259 (void *userData, const XML_Char *name ),
260 ("(O&)", STRING_CONV_FUNC, name) )
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000261
262VOID_HANDLER( ProcessingInstruction,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000263 (void *userData,
264 const XML_Char *target,
265 const XML_Char *data),
266 ("(O&O&)",STRING_CONV_FUNC,target, STRING_CONV_FUNC,data ))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000267
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000268#if PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000269VOID_HANDLER( CharacterData,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000270 (void *userData, const XML_Char *data, int len),
271 ("(O)", conv_string_len_to_utf8(data,len) ) )
272#else
273VOID_HANDLER( CharacterData,
274 (void *userData, const XML_Char *data, int len),
275 ("(O)", (self->returns_unicode
276 ? conv_string_len_to_unicode(data,len)
277 : conv_string_len_to_utf8(data,len) ) ) )
278#endif
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000279
280VOID_HANDLER( UnparsedEntityDecl,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000281 (void *userData,
282 const XML_Char *entityName,
283 const XML_Char *base,
284 const XML_Char *systemId,
285 const XML_Char *publicId,
286 const XML_Char *notationName),
287 ("(O&O&O&O&O&)",
288 STRING_CONV_FUNC,entityName, STRING_CONV_FUNC,base,
289 STRING_CONV_FUNC,systemId, STRING_CONV_FUNC,publicId,
290 STRING_CONV_FUNC,notationName))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000291
292VOID_HANDLER( NotationDecl,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000293 (void *userData,
294 const XML_Char *notationName,
295 const XML_Char *base,
296 const XML_Char *systemId,
297 const XML_Char *publicId),
298 ("(O&O&O&O&)",
299 STRING_CONV_FUNC,notationName, STRING_CONV_FUNC,base,
300 STRING_CONV_FUNC,systemId, STRING_CONV_FUNC,publicId))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000301
302VOID_HANDLER( StartNamespaceDecl,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000303 (void *userData,
304 const XML_Char *prefix,
305 const XML_Char *uri),
306 ("(O&O&)", STRING_CONV_FUNC,prefix, STRING_CONV_FUNC,uri ))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000307
308VOID_HANDLER( EndNamespaceDecl,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000309 (void *userData,
310 const XML_Char *prefix),
311 ("(O&)", STRING_CONV_FUNC,prefix ))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000312
313VOID_HANDLER( Comment,
314 (void *userData, const XML_Char *prefix),
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000315 ("(O&)", STRING_CONV_FUNC,prefix))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000316
317VOID_HANDLER( StartCdataSection,
318 (void *userData),
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000319 ("()" ))
320
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000321VOID_HANDLER( EndCdataSection,
322 (void *userData),
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000323 ("()" ))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000324
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000325#if PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000326VOID_HANDLER( Default,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000327 (void *userData, const XML_Char *s, int len),
328 ("(O)", conv_string_len_to_utf8(s,len) ) )
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000329
330VOID_HANDLER( DefaultHandlerExpand,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000331 (void *userData, const XML_Char *s, int len),
332 ("(O)", conv_string_len_to_utf8(s,len) ) )
333#else
334VOID_HANDLER( Default,
335 (void *userData, const XML_Char *s, int len),
336 ("(O)", (self->returns_unicode
337 ? conv_string_len_to_unicode(s,len)
338 : conv_string_len_to_utf8(s,len) ) ) )
339
340VOID_HANDLER( DefaultHandlerExpand,
341 (void *userData, const XML_Char *s, int len),
342 ("(O)", (self->returns_unicode
343 ? conv_string_len_to_unicode(s,len)
344 : conv_string_len_to_utf8(s,len) ) ) )
345#endif
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000346
347INT_HANDLER( NotStandalone,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000348 (void *userData),
349 ("()"))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000350
351RC_HANDLER( int, ExternalEntityRef,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000352 (XML_Parser parser,
353 const XML_Char *context,
354 const XML_Char *base,
355 const XML_Char *systemId,
356 const XML_Char *publicId),
357 int rc=0;,
358 ("(O&O&O&O&)",
359 STRING_CONV_FUNC,context, STRING_CONV_FUNC,base,
360 STRING_CONV_FUNC,systemId, STRING_CONV_FUNC,publicId ),
361 rc = PyInt_AsLong( rv );, rc,
362 XML_GetUserData( parser ) )
363
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000364
365
366/* File reading copied from cPickle */
367
368#define UNLESS(E) if (!(E))
369
370/*
371static int
372read_other(xmlparseobject *self, char **s, int n) {
373 PyObject *bytes=NULL, *str=NULL, *arg=NULL;
374 int res = -1;
375
376 UNLESS(bytes = PyInt_FromLong(n)) {
377 if (!PyErr_Occurred())
378 PyErr_SetNone(PyExc_EOFError);
379
380 goto finally;
381 }
382
383 UNLESS(arg)
384 UNLESS(arg = PyTuple_New(1))
385 goto finally;
386
387 Py_INCREF(bytes);
388 if (PyTuple_SetItem(arg, 0, bytes) < 0)
389 goto finally;
390
391 UNLESS(str = PyObject_CallObject(self->read, arg))
392 goto finally;
393
394 *s = PyString_AsString(str);
395
396 res = n;
397
398finally:
399 Py_XDECREF(arg);
400 Py_XDECREF(bytes);
401
402 return res;
403}
404
405*/
406
407
408
409
410
411/* ---------------------------------------------------------------- */
412
413static char xmlparse_Parse__doc__[] =
414"(data [,isfinal]) - Parse XML data"
415;
416
417static PyObject *
418xmlparse_Parse( xmlparseobject *self, PyObject *args )
419{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000420 char *s;
421 int slen;
422 int isFinal = 0;
423 int rv;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000424
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000425 if (!PyArg_ParseTuple(args, "s#|i", &s, &slen, &isFinal))
426 return NULL;
427 rv = XML_Parse(self->itself, s, slen, isFinal);
428 if( PyErr_Occurred() ){
429 return NULL;
430 }
431 else if (rv == 0) {
Guido van Rossum5db862d2000-04-10 12:46:51 +0000432 PyErr_Format(ErrorObject, "%.200s: line %i, column %i",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000433 XML_ErrorString( XML_GetErrorCode(self->itself) ),
434 XML_GetErrorLineNumber(self->itself),
435 XML_GetErrorColumnNumber(self->itself) );
436 return NULL;
437 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000438
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000439 return Py_BuildValue("i", rv);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000440}
441
442#define BUF_SIZE 2048
443
444int readinst(char *buf, int buf_size, PyObject *meth){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000445 PyObject *arg=NULL;
446 PyObject *bytes=NULL;
447 PyObject *str=NULL;
448 int len;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000449
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000450 UNLESS(bytes = PyInt_FromLong(buf_size)) {
451 if (!PyErr_Occurred())
452 PyErr_SetNone(PyExc_EOFError);
453 goto finally;
454 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000455
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000456 UNLESS(arg)
457 UNLESS(arg = PyTuple_New(1))
458 goto finally;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000459
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000460 Py_INCREF(bytes);
461 if (PyTuple_SetItem(arg, 0, bytes) < 0)
462 goto finally;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000463
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000464 UNLESS(str = PyObject_CallObject(meth, arg))
465 goto finally;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000466
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000467 UNLESS(PyString_Check( str ))
468 goto finally;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000469
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000470 len=PyString_GET_SIZE( str );
471 strncpy( buf, PyString_AsString(str), len );
472 Py_XDECREF( str );
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000473finally:
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000474 return len;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000475}
476
477static char xmlparse_ParseFile__doc__[] =
478"(file) - Parse XML data"
479;
480
481static PyObject *
482xmlparse_ParseFile( xmlparseobject *self, PyObject *args )
483{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000484 int rv=1;
485 PyObject *f;
486 FILE *fp;
487 PyObject *readmethod=NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000488
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000489 if (!PyArg_ParseTuple(args, "O", &f))
490 return NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000491
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000492 if (PyFile_Check(f)) {
493 fp = PyFile_AsFile(f);
494 }else{
495 fp = NULL;
496 UNLESS(readmethod = PyObject_GetAttrString(f, "read")) {
497 PyErr_Clear();
498 PyErr_SetString( PyExc_TypeError,
499 "argument must have 'read' attribute" );
500 return 0;
501 }
502 }
503
504 for (;;) {
505 int bytes_read;
506 void *buf = XML_GetBuffer(self->itself, BUF_SIZE);
507 if (buf == NULL) {
508 PyErr_SetString(PyExc_MemoryError, "out of memory");
509 return NULL;
510 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000511
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000512 if( fp ){
513 bytes_read=fread( buf, sizeof( char ), BUF_SIZE, fp);
514 }else{
515 bytes_read=readinst( buf, BUF_SIZE, readmethod );
516 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000517
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000518 if (bytes_read < 0) {
519 PyErr_SetFromErrno(PyExc_IOError);
520 return NULL;
521 }
522 rv=XML_ParseBuffer(self->itself, bytes_read, bytes_read == 0);
523 if( PyErr_Occurred() ){
524 return NULL;
525 }
526 if (!rv || bytes_read == 0)
527 break;
528 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000529
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000530 return Py_BuildValue("i", rv);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000531}
532
533static char xmlparse_SetBase__doc__[] =
534"(base_url) - Base URL string"
535;
536
537static PyObject *
538xmlparse_SetBase( xmlparseobject *self, PyObject *args ){
539 char *base;
540
541 if (!PyArg_ParseTuple(args, "s", &base))
542 return NULL;
543 if( !XML_SetBase( self->itself, base ) ){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000544 PyErr_SetNone(PyExc_MemoryError);
545 return NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000546 }
547
548 Py_INCREF(Py_None);
549 return Py_None;
550}
551
552static char xmlparse_GetBase__doc__[] =
553"() - returns base URL string "
554;
555
556static PyObject *
557xmlparse_GetBase( xmlparseobject *self, PyObject *args ){
558 const XML_Char *base;
559 PyObject *rc;
560
561 if( PyTuple_Size( args )!=0 ){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000562 PyArg_ParseTuple(args, "()" ); /* get good error reporting */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000563 return NULL;
564 }
565 base=XML_GetBase( self->itself );
566 if( base ){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000567 rc=Py_BuildValue("s", base);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000568 }else{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000569 Py_INCREF(Py_None);
570 rc=Py_None;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000571 }
572 return rc;
573
574}
575
576static struct PyMethodDef xmlparse_methods[] = {
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000577 {"Parse", (PyCFunction)xmlparse_Parse,
578 METH_VARARGS, xmlparse_Parse__doc__},
579 {"ParseFile", (PyCFunction)xmlparse_ParseFile,
580 METH_VARARGS, xmlparse_ParseFile__doc__},
581 {"SetBase", (PyCFunction)xmlparse_SetBase,
582 METH_VARARGS, xmlparse_SetBase__doc__},
583 {"GetBase", (PyCFunction)xmlparse_GetBase,
584 METH_VARARGS, xmlparse_GetBase__doc__},
585 {NULL, NULL} /* sentinel */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000586};
587
588/* ---------- */
589
590
591static xmlparseobject *
592newxmlparseobject( char *encoding, char *namespace_separator){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000593 int i;
594 xmlparseobject *self;
595
596#if PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6
597 self = PyObject_NEW(xmlparseobject, &Xmlparsetype);
598 if (self == NULL)
599 return NULL;
600
601 self->returns_unicode = 0;
602#else
603 /* Code for versions 1.6 and later */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000604 self = PyObject_New(xmlparseobject, &Xmlparsetype);
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000605 if (self == NULL)
606 return NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000607
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000608 self->returns_unicode = 1;
609#endif
610 if (namespace_separator) {
611 self->itself = XML_ParserCreateNS(encoding,
612 *namespace_separator);
613 }else{
614 self->itself = XML_ParserCreate(encoding);
615 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000616
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000617 if( self->itself==NULL ){
618 PyErr_SetString(PyExc_RuntimeError,
619 "XML_ParserCreate failed");
620 Py_DECREF(self);
621 return NULL;
622 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000623
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000624 XML_SetUserData(self->itself, (void *)self);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000625
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000626 for( i=0; handler_info[i].name!=NULL;i++);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000627
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000628 self->handlers=malloc( sizeof( PyObject *)*i );
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000629
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000630 clear_handlers( self );
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000631
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000632 return self;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000633}
634
635
636static void
637xmlparse_dealloc( xmlparseobject *self )
638{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000639 int i;
640 if (self->itself)
641 XML_ParserFree(self->itself);
642 self->itself = NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000643
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000644 for( i=0; handler_info[i].name!=NULL; i++ ){
645 Py_XDECREF( self->handlers[i] );
646 }
647#if PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6
648 /* Code for versions before 1.6 */
649 free(self);
650#else
651 /* Code for versions 1.6 and later */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000652 PyObject_Del(self);
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000653#endif
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000654}
655
656static int handlername2int( const char *name ){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000657 int i;
658 for( i=0;handler_info[i].name!=NULL;i++){
659 if( strcmp( name, handler_info[i].name )==0 ){
660 return i;
661 }
662 }
663 return -1;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000664}
665
666static PyObject *
667xmlparse_getattr(xmlparseobject *self, char *name)
668{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000669 int handlernum;
670 if (strcmp(name, "ErrorCode") == 0)
671 return Py_BuildValue("l",
672 (long)XML_GetErrorCode(self->itself));
673 if (strcmp(name, "ErrorLineNumber") == 0)
674 return Py_BuildValue("l",
675 (long)XML_GetErrorLineNumber(self->itself));
676 if (strcmp(name, "ErrorColumnNumber") == 0)
677 return Py_BuildValue("l",
678 (long)XML_GetErrorColumnNumber(self->itself));
679 if (strcmp(name, "ErrorByteIndex") == 0)
680 return Py_BuildValue("l",
681 XML_GetErrorByteIndex(self->itself));
682 if (strcmp(name, "returns_unicode") == 0)
683 return Py_BuildValue("i", self->returns_unicode);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000684
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000685 handlernum=handlername2int( name );
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000686
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000687 if( handlernum!=-1 && self->handlers[handlernum]!=NULL){
688 Py_INCREF( self->handlers[handlernum] );
689 return self->handlers[handlernum];
690 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000691
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000692 if (strcmp(name, "__members__") == 0){
693 int i;
694 PyObject *rc=PyList_New(0);
695 for(i=0; handler_info[i].name!=NULL;i++ ){
696 PyList_Append( rc,
697 PyString_FromString( handler_info[i].name ) );
698 }
699 PyList_Append( rc, PyString_FromString( "ErrorCode" ));
700 PyList_Append( rc, PyString_FromString( "ErrorLineNumber" ));
701 PyList_Append( rc, PyString_FromString( "ErrorColumnNumber"));
702 PyList_Append( rc, PyString_FromString( "ErrorByteIndex" ));
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000703
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000704 return rc;
705 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000706
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000707 return Py_FindMethod(xmlparse_methods, (PyObject *)self, name);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000708}
709
710static int sethandler( xmlparseobject *self, const char *name, PyObject* v ){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000711 int handlernum = handlername2int( name );
712 if( handlernum!=-1 ){
713 Py_INCREF( v );
714 Py_XDECREF( self->handlers[handlernum] );
715 self->handlers[handlernum]=v;
716 handler_info[handlernum].setter( self->itself,
717 handler_info[handlernum].handler );
718 return 1;
719 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000720
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000721 return 0;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000722}
723
724static int
725xmlparse_setattr( xmlparseobject *self, char *name, PyObject *v)
726{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000727 /* Set attribute 'name' to value 'v'. v==NULL means delete */
728 if (v==NULL) {
729 PyErr_SetString(PyExc_RuntimeError, "Cannot delete attribute");
730 return -1;
731 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000732
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000733 if (strcmp(name, "returns_unicode") == 0) {
734 PyObject *intobj = PyNumber_Int(v);
735 if (intobj == NULL) return -1;
736 if (PyInt_AsLong(intobj)) {
737#if PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6
738 PyErr_SetString(PyExc_ValueError,
739 "Cannot return Unicode strings in Python 1.5");
740 return -1;
741#else
742 self->returns_unicode = 1;
743#endif
744 }
745 else self->returns_unicode = 0;
746 Py_DECREF(intobj);
747 return 0;
748 }
749 if( sethandler( self, name, v ) ){
750 return 0;
751 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000752
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000753 PyErr_SetString( PyExc_AttributeError, name );
754 return -1;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000755}
756
757static char Xmlparsetype__doc__[] =
758"XML parser"
759;
760
761static PyTypeObject Xmlparsetype = {
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000762 PyObject_HEAD_INIT(NULL)
763 0, /*ob_size*/
764 "xmlparser", /*tp_name*/
765 sizeof(xmlparseobject), /*tp_basicsize*/
766 0, /*tp_itemsize*/
767 /* methods */
768 (destructor)xmlparse_dealloc, /*tp_dealloc*/
769 (printfunc)0, /*tp_print*/
770 (getattrfunc)xmlparse_getattr, /*tp_getattr*/
771 (setattrfunc)xmlparse_setattr, /*tp_setattr*/
772 (cmpfunc)0, /*tp_compare*/
773 (reprfunc)0, /*tp_repr*/
774 0, /*tp_as_number*/
775 0, /*tp_as_sequence*/
776 0, /*tp_as_mapping*/
777 (hashfunc)0, /*tp_hash*/
778 (ternaryfunc)0, /*tp_call*/
779 (reprfunc)0, /*tp_str*/
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000780
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000781 /* Space for future expansion */
782 0L,0L,0L,0L,
783 Xmlparsetype__doc__ /* Documentation string */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000784};
785
786/* End of code for xmlparser objects */
787/* -------------------------------------------------------- */
788
789
790static char pyexpat_ParserCreate__doc__[] =
791"([encoding, namespace_separator]) - Return a new XML parser object"
792;
793
794static PyObject *
795pyexpat_ParserCreate(PyObject *notused, PyObject *args, PyObject *kw) {
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000796 char *encoding = NULL, *namespace_separator=NULL;
797 static char *kwlist[] = {"encoding", "namespace_separator", NULL};
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000798
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000799 if (!PyArg_ParseTupleAndKeywords(args, kw, "|zz", kwlist,
800 &encoding, &namespace_separator))
801 return NULL;
802 return (PyObject *)newxmlparseobject(encoding, namespace_separator);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000803}
804
805static char pyexpat_ErrorString__doc__[] =
806"(errno) Returns string error for given number"
807;
808
809static PyObject *
810pyexpat_ErrorString(self, args)
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000811 PyObject *self; /* Not used */
812 PyObject *args;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000813{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000814 long code;
815
816 if (!PyArg_ParseTuple(args, "l", &code))
817 return NULL;
818 return Py_BuildValue("z", XML_ErrorString((int)code));
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000819}
820
821/* List of methods defined in the module */
822
823static struct PyMethodDef pyexpat_methods[] = {
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000824 {"ParserCreate", (PyCFunction)pyexpat_ParserCreate,
825 METH_VARARGS|METH_KEYWORDS, pyexpat_ParserCreate__doc__},
826 {"ErrorString", (PyCFunction)pyexpat_ErrorString,
827 METH_VARARGS, pyexpat_ErrorString__doc__},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000828
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000829 {NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000830};
831
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000832/* Module docstring */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000833
834static char pyexpat_module_documentation[] =
835"Python wrapper for Expat parser."
836;
837
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000838/* Initialization function for the module */
839
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000840void
841initpyexpat(){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000842 PyObject *m, *d;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000843 char *rev="$Revision$";
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000844 PyObject *errors_module, *errors_dict;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000845
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000846 Xmlparsetype.ob_type = &PyType_Type;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000847
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000848 /* Create the module and add the functions */
849 m = Py_InitModule4("pyexpat", pyexpat_methods,
850 pyexpat_module_documentation,
851 (PyObject*)NULL,PYTHON_API_VERSION);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000852
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000853 /* Add some symbolic constants to the module */
854 d = PyModule_GetDict(m);
855 ErrorObject = PyString_FromString("pyexpat.error");
856 PyDict_SetItemString(d, "error", ErrorObject);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000857
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000858 PyDict_SetItemString(d,"__version__",
859 PyString_FromStringAndSize(rev+11,
860 strlen(rev+11)-2));
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000861
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000862 errors_module=PyModule_New( "errors" );
863 PyDict_SetItemString(d,"errors", errors_module );
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000864
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000865 /* XXX When Expat supports some way of figuring out how it was
866 compiled, this should check and set native_encoding
867 appropriately.
868 */
869 PyDict_SetItemString(d, "native_encoding",
870 PyString_FromString("UTF-8") );
871
872 errors_dict=PyModule_GetDict( errors_module );
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000873
874#define MYCONST(name) \
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000875 PyDict_SetItemString(errors_dict, #name, \
876 PyString_FromString( XML_ErrorString(name)))
877
878 MYCONST(XML_ERROR_NO_MEMORY);
879 MYCONST(XML_ERROR_SYNTAX);
880 MYCONST(XML_ERROR_NO_ELEMENTS);
881 MYCONST(XML_ERROR_INVALID_TOKEN);
882 MYCONST(XML_ERROR_UNCLOSED_TOKEN);
883 MYCONST(XML_ERROR_PARTIAL_CHAR);
884 MYCONST(XML_ERROR_TAG_MISMATCH);
885 MYCONST(XML_ERROR_DUPLICATE_ATTRIBUTE);
886 MYCONST(XML_ERROR_JUNK_AFTER_DOC_ELEMENT);
887 MYCONST(XML_ERROR_PARAM_ENTITY_REF);
888 MYCONST(XML_ERROR_UNDEFINED_ENTITY);
889 MYCONST(XML_ERROR_RECURSIVE_ENTITY_REF);
890 MYCONST(XML_ERROR_ASYNC_ENTITY);
891 MYCONST(XML_ERROR_BAD_CHAR_REF);
892 MYCONST(XML_ERROR_BINARY_ENTITY_REF);
893 MYCONST(XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF);
894 MYCONST(XML_ERROR_MISPLACED_XML_PI);
895 MYCONST(XML_ERROR_UNKNOWN_ENCODING);
896 MYCONST(XML_ERROR_INCORRECT_ENCODING);
897
898 /* Check for errors */
899 if (PyErr_Occurred())
900 Py_FatalError("can't initialize module pyexpat");
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000901}
902
903void clear_handlers( xmlparseobject *self ){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000904 int i=0;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000905
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000906 for( i=0;handler_info[i].name!=NULL;i++ ){
907 self->handlers[i]=NULL;
908 handler_info[i].setter( self->itself, NULL );
909 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000910}
911
912typedef void (*pairsetter)( XML_Parser, void *handler1, void *handler2 );
913
914void pyxml_UpdatePairedHandlers( xmlparseobject *self,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000915 int startHandler,
916 int endHandler,
917 pairsetter setter){
918 void *start_handler=NULL;
919 void *end_handler=NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000920
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000921 if( self->handlers[startHandler] &&
922 self->handlers[endHandler]!=Py_None ){
923 start_handler=handler_info[startHandler].handler;
924 }
925 if( self->handlers[EndElement] &&
926 self->handlers[EndElement] !=Py_None ){
927 end_handler=handler_info[endHandler].handler;
928 }
929
930 setter(self->itself,
931 start_handler,
932 end_handler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000933}
934
935void pyxml_SetStartElementHandler( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000936 void *junk){
937 pyxml_UpdatePairedHandlers(
938 (xmlparseobject *)XML_GetUserData( parser ),
939 StartElement, EndElement,
940 (pairsetter)XML_SetElementHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000941}
942
943void pyxml_SetEndElementHandler( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000944 void *junk){
945 pyxml_UpdatePairedHandlers(
946 (xmlparseobject *)XML_GetUserData( parser ),
947 StartElement, EndElement,
948 (pairsetter)XML_SetElementHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000949}
950
951void pyxml_SetStartNamespaceDeclHandler( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000952 void *junk){
953 pyxml_UpdatePairedHandlers(
954 (xmlparseobject *)XML_GetUserData( parser ),
955 StartNamespaceDecl, EndNamespaceDecl,
956 (pairsetter)XML_SetNamespaceDeclHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000957}
958
959void pyxml_SetEndNamespaceDeclHandler( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000960 void *junk){
961 pyxml_UpdatePairedHandlers(
962 (xmlparseobject *)XML_GetUserData( parser ),
963 StartNamespaceDecl, EndNamespaceDecl,
964 (pairsetter)XML_SetNamespaceDeclHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000965}
966
967void pyxml_SetStartCdataSection( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000968 void *junk){
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000969
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000970 pyxml_UpdatePairedHandlers(
971 (xmlparseobject *)XML_GetUserData( parser ),
972 StartCdataSection, EndCdataSection,
973 (pairsetter)XML_SetCdataSectionHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000974}
975
976void pyxml_SetEndCdataSection( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000977 void *junk){
978 pyxml_UpdatePairedHandlers(
979 (xmlparseobject *)XML_GetUserData( parser ),
980 StartCdataSection, EndCdataSection,
981 (pairsetter)XML_SetCdataSectionHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000982}
983
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000984statichere struct HandlerInfo handler_info[]=
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000985{{"StartElementHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000986 pyxml_SetStartElementHandler,
987 my_StartElementHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000988{"EndElementHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000989 pyxml_SetEndElementHandler,
990 my_EndElementHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000991{"ProcessingInstructionHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000992 (xmlhandlersetter)XML_SetProcessingInstructionHandler,
993 my_ProcessingInstructionHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000994{"CharacterDataHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000995 (xmlhandlersetter)XML_SetCharacterDataHandler,
996 my_CharacterDataHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000997{"UnparsedEntityDeclHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000998 (xmlhandlersetter)XML_SetUnparsedEntityDeclHandler,
999 my_UnparsedEntityDeclHandler },
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001000{"NotationDeclHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001001 (xmlhandlersetter)XML_SetNotationDeclHandler,
1002 my_NotationDeclHandler },
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001003{"StartNamespaceDeclHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001004 pyxml_SetStartNamespaceDeclHandler,
1005 my_StartNamespaceDeclHandler },
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001006{"EndNamespaceDeclHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001007 pyxml_SetEndNamespaceDeclHandler,
1008 my_EndNamespaceDeclHandler },
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001009{"CommentHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001010 (xmlhandlersetter)XML_SetCommentHandler,
1011 my_CommentHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001012{"StartCdataSectionHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001013 pyxml_SetStartCdataSection,
1014 my_StartCdataSectionHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001015{"EndCdataSectionHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001016 pyxml_SetEndCdataSection,
1017 my_EndCdataSectionHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001018{"DefaultHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001019 (xmlhandlersetter)XML_SetDefaultHandler,
1020 my_DefaultHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001021{"DefaultHandlerExpand",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001022 (xmlhandlersetter)XML_SetDefaultHandlerExpand,
1023 my_DefaultHandlerExpandHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001024{"NotStandaloneHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001025 (xmlhandlersetter)XML_SetNotStandaloneHandler,
1026 my_NotStandaloneHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001027{"ExternalEntityRefHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001028 (xmlhandlersetter)XML_SetExternalEntityRefHandler,
1029 my_ExternalEntityRefHandler },
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001030
1031{NULL, NULL, NULL } /* sentinel */
1032};
1033