blob: 4eb8eeae01b748d46ac61bdd6dc5953cb2edc121 [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
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
16
17While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
29
30******************************************************************/
31
32#include "Python.h"
33#include "xmlparse.h"
34
35/*
36** The version number should match the one in _checkversion
37*/
38#define VERSION "1.9"
39
40enum HandlerTypes{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +000041 StartElement,
42 EndElement,
43 ProcessingInstruction,
44 CharacterData,
45 UnparsedEntityDecl,
46 NotationDecl,
47 StartNamespaceDecl,
48 EndNamespaceDecl,
49 Comment,
50 StartCdataSection,
51 EndCdataSection,
52 Default,
53 DefaultHandlerExpand,
54 NotStandalone,
55 ExternalEntityRef
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000056};
57
58static PyObject *ErrorObject;
59
60/* ----------------------------------------------------- */
61
62/* Declarations for objects of type xmlparser */
63
64typedef struct {
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +000065 PyObject_HEAD
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000066
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +000067 XML_Parser itself;
68 int returns_unicode; /* True if Unicode strings are returned;
69 if false, UTF-8 strings are returned */
70 PyObject **handlers;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000071} xmlparseobject;
72
73staticforward PyTypeObject Xmlparsetype;
74
75typedef void (*xmlhandlersetter)( XML_Parser *self, void *meth );
76typedef void* xmlhandler;
77
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +000078struct HandlerInfo {
79 const char *name;
80 xmlhandlersetter setter;
81 xmlhandler handler;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000082};
83
Guido van Rossum5961f5a2000-03-31 16:18:11 +000084staticforward struct HandlerInfo handler_info[];
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000085
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +000086/* Convert an array of attributes and their values into a Python dict */
87
88static PyObject *conv_atts_using_string( XML_Char **atts){
89 PyObject *attrs_obj=NULL;
90 XML_Char **attrs_p, **attrs_k;
91 int attrs_len;
92 PyObject *rv;
93
94 if( (attrs_obj = PyDict_New()) == NULL )
95 goto finally;
96 for(attrs_len=0, attrs_p = atts;
97 *attrs_p;
98 attrs_p++, attrs_len++) {
99 if (attrs_len%2) {
100 rv=PyString_FromString(*attrs_p);
101 if (! rv) {
102 Py_DECREF(attrs_obj);
103 attrs_obj=NULL;
104 goto finally;
105 }
106 if (PyDict_SetItemString(
107 attrs_obj,
108 (char*)*attrs_k, rv) < 0){
109 Py_DECREF(attrs_obj);
110 attrs_obj=NULL;
111 goto finally;
112 }
113 Py_DECREF(rv);
114 }
115 else attrs_k=attrs_p;
116 }
117 finally:
118 return attrs_obj;
119}
120
121#if !(PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6)
122static PyObject *conv_atts_using_unicode( XML_Char **atts){
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000123 PyObject *attrs_obj=NULL;
124 XML_Char **attrs_p, **attrs_k;
125 int attrs_len;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000126
127 if( (attrs_obj = PyDict_New()) == NULL )
128 goto finally;
129 for(attrs_len=0, attrs_p = atts;
130 *attrs_p;
131 attrs_p++, attrs_len++) {
132 if (attrs_len%2) {
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000133 PyObject *attr_str, *value_str;
134 const char *p = (const char *) (*attrs_k);
135 attr_str=PyUnicode_DecodeUTF8(p, strlen(p), "strict");
136 if (! attr_str) {
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000137 Py_DECREF(attrs_obj);
138 attrs_obj=NULL;
139 goto finally;
140 }
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000141 p = (const char *) *attrs_p;
142 value_str=PyUnicode_DecodeUTF8(p, strlen(p), "strict");
143 if (! value_str) {
144 Py_DECREF(attrs_obj);
145 Py_DECREF(attr_str);
146 attrs_obj=NULL;
147 goto finally;
148 }
149 if (PyDict_SetItem(attrs_obj, attr_str, value_str) < 0) {
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000150 Py_DECREF(attrs_obj);
151 attrs_obj=NULL;
152 goto finally;
153 }
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000154 Py_DECREF(attr_str);
155 Py_DECREF(value_str);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000156 }
157 else attrs_k=attrs_p;
158 }
159 finally:
160 return attrs_obj;
161}
162
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000163/* Convert a string of XML_Chars into a Unicode string.
164 Returns None if str is a null pointer. */
165
166static PyObject *conv_string_to_unicode( XML_Char *str ) {
167 /* XXX currently this code assumes that XML_Char is 8-bit,
168 and hence in UTF-8. */
169 /* UTF-8 from Expat, Unicode desired */
170 if (str == NULL) {Py_INCREF(Py_None); return Py_None;}
171 return PyUnicode_DecodeUTF8( (const char *)str,
172 strlen( (const char *)str ),
173 "strict" );
174}
175
176static PyObject *conv_string_len_to_unicode( const XML_Char *str, int len ) {
177 /* XXX currently this code assumes that XML_Char is 8-bit,
178 and hence in UTF-8. */
179 /* UTF-8 from Expat, Unicode desired */
180 if (str == NULL) {Py_INCREF(Py_None); return Py_None;}
181 return PyUnicode_DecodeUTF8( (const char *)str,
182 len,
183 "strict" );
184}
185#endif
186
187/* Convert a string of XML_Chars into an 8-bit Python string.
188 Returns None if str is a null pointer. */
189
190static PyObject *conv_string_to_utf8( XML_Char *str ) {
191 /* XXX currently this code assumes that XML_Char is 8-bit,
192 and hence in UTF-8. */
193 /* UTF-8 from Expat, UTF-8 desired */
194 if (str == NULL) {Py_INCREF(Py_None); return Py_None;}
195 return PyString_FromString( (const char *)str );
196}
197
198static PyObject *conv_string_len_to_utf8( const XML_Char *str,
199 int len )
200{
201 /* XXX currently this code assumes that XML_Char is 8-bit,
202 and hence in UTF-8. */
203 /* UTF-8 from Expat, UTF-8 desired */
204 if (str == NULL) {Py_INCREF(Py_None); return Py_None;}
205 return PyString_FromStringAndSize( (const char *)str, len );
206}
207
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000208/* Callback routines */
209
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000210static void clear_handlers( xmlparseobject *self );
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000211
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000212static void flag_error( xmlparseobject *self ){
213 clear_handlers(self);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000214}
215
216#define RC_HANDLER( RC, NAME, PARAMS, INIT, PARAM_FORMAT, CONVERSION, \
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000217 RETURN, GETUSERDATA) \
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000218\
219static RC my_##NAME##Handler PARAMS {\
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000220 xmlparseobject *self = GETUSERDATA ; \
221 PyObject *args=NULL; \
222 PyObject *rv=NULL; \
223 INIT \
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000224\
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000225 if (self->handlers[NAME] \
226 && self->handlers[NAME] != Py_None) { \
227 args = Py_BuildValue PARAM_FORMAT ;\
228 if (!args) return RETURN; \
229 rv = PyEval_CallObject(self->handlers[NAME], args); \
230 Py_DECREF(args); \
231 if (rv == NULL) { \
232 flag_error( self ); \
233 return RETURN; \
234 } \
235 CONVERSION \
236 Py_DECREF(rv); \
237 } \
238 return RETURN; \
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000239}
240
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000241#if PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6
242#define STRING_CONV_FUNC conv_string_to_utf8
243#else
244/* Python 1.6 and later versions */
245#define STRING_CONV_FUNC (self->returns_unicode \
246 ? conv_string_to_unicode : conv_string_to_utf8)
247#endif
Guido van Rossum5961f5a2000-03-31 16:18:11 +0000248
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000249#define VOID_HANDLER( NAME, PARAMS, PARAM_FORMAT ) \
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000250 RC_HANDLER( void, NAME, PARAMS, ;, PARAM_FORMAT, ;, ;,\
251 (xmlparseobject *)userData )
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000252
253#define INT_HANDLER( NAME, PARAMS, PARAM_FORMAT )\
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000254 RC_HANDLER( int, NAME, PARAMS, int rc=0;, PARAM_FORMAT, \
255 rc = PyInt_AsLong( rv );, rc, \
256 (xmlparseobject *)userData )
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000257
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000258#if PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000259VOID_HANDLER( StartElement,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000260 (void *userData, const XML_Char *name, const XML_Char **atts ),
261 ("(O&O&)", STRING_CONV_FUNC, name,
262 conv_atts_using_string, atts ) )
263#else
264/* Python 1.6 and later */
265VOID_HANDLER( StartElement,
266 (void *userData, const XML_Char *name, const XML_Char **atts ),
267 ("(O&O&)", STRING_CONV_FUNC, name,
268 (self->returns_unicode
269 ? conv_atts_using_unicode
270 : conv_atts_using_string), atts ) )
271#endif
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000272
273VOID_HANDLER( EndElement,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000274 (void *userData, const XML_Char *name ),
275 ("(O&)", STRING_CONV_FUNC, name) )
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000276
277VOID_HANDLER( ProcessingInstruction,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000278 (void *userData,
279 const XML_Char *target,
280 const XML_Char *data),
281 ("(O&O&)",STRING_CONV_FUNC,target, STRING_CONV_FUNC,data ))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000282
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000283#if PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000284VOID_HANDLER( CharacterData,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000285 (void *userData, const XML_Char *data, int len),
286 ("(O)", conv_string_len_to_utf8(data,len) ) )
287#else
288VOID_HANDLER( CharacterData,
289 (void *userData, const XML_Char *data, int len),
290 ("(O)", (self->returns_unicode
291 ? conv_string_len_to_unicode(data,len)
292 : conv_string_len_to_utf8(data,len) ) ) )
293#endif
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000294
295VOID_HANDLER( UnparsedEntityDecl,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000296 (void *userData,
297 const XML_Char *entityName,
298 const XML_Char *base,
299 const XML_Char *systemId,
300 const XML_Char *publicId,
301 const XML_Char *notationName),
302 ("(O&O&O&O&O&)",
303 STRING_CONV_FUNC,entityName, STRING_CONV_FUNC,base,
304 STRING_CONV_FUNC,systemId, STRING_CONV_FUNC,publicId,
305 STRING_CONV_FUNC,notationName))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000306
307VOID_HANDLER( NotationDecl,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000308 (void *userData,
309 const XML_Char *notationName,
310 const XML_Char *base,
311 const XML_Char *systemId,
312 const XML_Char *publicId),
313 ("(O&O&O&O&)",
314 STRING_CONV_FUNC,notationName, STRING_CONV_FUNC,base,
315 STRING_CONV_FUNC,systemId, STRING_CONV_FUNC,publicId))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000316
317VOID_HANDLER( StartNamespaceDecl,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000318 (void *userData,
319 const XML_Char *prefix,
320 const XML_Char *uri),
321 ("(O&O&)", STRING_CONV_FUNC,prefix, STRING_CONV_FUNC,uri ))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000322
323VOID_HANDLER( EndNamespaceDecl,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000324 (void *userData,
325 const XML_Char *prefix),
326 ("(O&)", STRING_CONV_FUNC,prefix ))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000327
328VOID_HANDLER( Comment,
329 (void *userData, const XML_Char *prefix),
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000330 ("(O&)", STRING_CONV_FUNC,prefix))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000331
332VOID_HANDLER( StartCdataSection,
333 (void *userData),
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000334 ("()" ))
335
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000336VOID_HANDLER( EndCdataSection,
337 (void *userData),
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000338 ("()" ))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000339
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000340#if PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000341VOID_HANDLER( Default,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000342 (void *userData, const XML_Char *s, int len),
343 ("(O)", conv_string_len_to_utf8(s,len) ) )
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000344
345VOID_HANDLER( DefaultHandlerExpand,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000346 (void *userData, const XML_Char *s, int len),
347 ("(O)", conv_string_len_to_utf8(s,len) ) )
348#else
349VOID_HANDLER( Default,
350 (void *userData, const XML_Char *s, int len),
351 ("(O)", (self->returns_unicode
352 ? conv_string_len_to_unicode(s,len)
353 : conv_string_len_to_utf8(s,len) ) ) )
354
355VOID_HANDLER( DefaultHandlerExpand,
356 (void *userData, const XML_Char *s, int len),
357 ("(O)", (self->returns_unicode
358 ? conv_string_len_to_unicode(s,len)
359 : conv_string_len_to_utf8(s,len) ) ) )
360#endif
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000361
362INT_HANDLER( NotStandalone,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000363 (void *userData),
364 ("()"))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000365
366RC_HANDLER( int, ExternalEntityRef,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000367 (XML_Parser parser,
368 const XML_Char *context,
369 const XML_Char *base,
370 const XML_Char *systemId,
371 const XML_Char *publicId),
372 int rc=0;,
373 ("(O&O&O&O&)",
374 STRING_CONV_FUNC,context, STRING_CONV_FUNC,base,
375 STRING_CONV_FUNC,systemId, STRING_CONV_FUNC,publicId ),
376 rc = PyInt_AsLong( rv );, rc,
377 XML_GetUserData( parser ) )
378
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000379
380
381/* File reading copied from cPickle */
382
383#define UNLESS(E) if (!(E))
384
385/*
386static int
387read_other(xmlparseobject *self, char **s, int n) {
388 PyObject *bytes=NULL, *str=NULL, *arg=NULL;
389 int res = -1;
390
391 UNLESS(bytes = PyInt_FromLong(n)) {
392 if (!PyErr_Occurred())
393 PyErr_SetNone(PyExc_EOFError);
394
395 goto finally;
396 }
397
398 UNLESS(arg)
399 UNLESS(arg = PyTuple_New(1))
400 goto finally;
401
402 Py_INCREF(bytes);
403 if (PyTuple_SetItem(arg, 0, bytes) < 0)
404 goto finally;
405
406 UNLESS(str = PyObject_CallObject(self->read, arg))
407 goto finally;
408
409 *s = PyString_AsString(str);
410
411 res = n;
412
413finally:
414 Py_XDECREF(arg);
415 Py_XDECREF(bytes);
416
417 return res;
418}
419
420*/
421
422
423
424
425
426/* ---------------------------------------------------------------- */
427
428static char xmlparse_Parse__doc__[] =
429"(data [,isfinal]) - Parse XML data"
430;
431
432static PyObject *
433xmlparse_Parse( xmlparseobject *self, PyObject *args )
434{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000435 char *s;
436 int slen;
437 int isFinal = 0;
438 int rv;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000439
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000440 if (!PyArg_ParseTuple(args, "s#|i", &s, &slen, &isFinal))
441 return NULL;
442 rv = XML_Parse(self->itself, s, slen, isFinal);
443 if( PyErr_Occurred() ){
444 return NULL;
445 }
446 else if (rv == 0) {
Guido van Rossum5db862d2000-04-10 12:46:51 +0000447 PyErr_Format(ErrorObject, "%.200s: line %i, column %i",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000448 XML_ErrorString( XML_GetErrorCode(self->itself) ),
449 XML_GetErrorLineNumber(self->itself),
450 XML_GetErrorColumnNumber(self->itself) );
451 return NULL;
452 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000453
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000454 return Py_BuildValue("i", rv);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000455}
456
457#define BUF_SIZE 2048
458
459int readinst(char *buf, int buf_size, PyObject *meth){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000460 PyObject *arg=NULL;
461 PyObject *bytes=NULL;
462 PyObject *str=NULL;
463 int len;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000464
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000465 UNLESS(bytes = PyInt_FromLong(buf_size)) {
466 if (!PyErr_Occurred())
467 PyErr_SetNone(PyExc_EOFError);
468 goto finally;
469 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000470
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000471 UNLESS(arg)
472 UNLESS(arg = PyTuple_New(1))
473 goto finally;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000474
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000475 Py_INCREF(bytes);
476 if (PyTuple_SetItem(arg, 0, bytes) < 0)
477 goto finally;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000478
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000479 UNLESS(str = PyObject_CallObject(meth, arg))
480 goto finally;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000481
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000482 UNLESS(PyString_Check( str ))
483 goto finally;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000484
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000485 len=PyString_GET_SIZE( str );
486 strncpy( buf, PyString_AsString(str), len );
487 Py_XDECREF( str );
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000488finally:
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000489 return len;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000490}
491
492static char xmlparse_ParseFile__doc__[] =
493"(file) - Parse XML data"
494;
495
496static PyObject *
497xmlparse_ParseFile( xmlparseobject *self, PyObject *args )
498{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000499 int rv=1;
500 PyObject *f;
501 FILE *fp;
502 PyObject *readmethod=NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000503
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000504 if (!PyArg_ParseTuple(args, "O", &f))
505 return NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000506
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000507 if (PyFile_Check(f)) {
508 fp = PyFile_AsFile(f);
509 }else{
510 fp = NULL;
511 UNLESS(readmethod = PyObject_GetAttrString(f, "read")) {
512 PyErr_Clear();
513 PyErr_SetString( PyExc_TypeError,
514 "argument must have 'read' attribute" );
515 return 0;
516 }
517 }
518
519 for (;;) {
520 int bytes_read;
521 void *buf = XML_GetBuffer(self->itself, BUF_SIZE);
522 if (buf == NULL) {
523 PyErr_SetString(PyExc_MemoryError, "out of memory");
524 return NULL;
525 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000526
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000527 if( fp ){
528 bytes_read=fread( buf, sizeof( char ), BUF_SIZE, fp);
529 }else{
530 bytes_read=readinst( buf, BUF_SIZE, readmethod );
531 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000532
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000533 if (bytes_read < 0) {
534 PyErr_SetFromErrno(PyExc_IOError);
535 return NULL;
536 }
537 rv=XML_ParseBuffer(self->itself, bytes_read, bytes_read == 0);
538 if( PyErr_Occurred() ){
539 return NULL;
540 }
541 if (!rv || bytes_read == 0)
542 break;
543 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000544
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000545 return Py_BuildValue("i", rv);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000546}
547
548static char xmlparse_SetBase__doc__[] =
549"(base_url) - Base URL string"
550;
551
552static PyObject *
553xmlparse_SetBase( xmlparseobject *self, PyObject *args ){
554 char *base;
555
556 if (!PyArg_ParseTuple(args, "s", &base))
557 return NULL;
558 if( !XML_SetBase( self->itself, base ) ){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000559 PyErr_SetNone(PyExc_MemoryError);
560 return NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000561 }
562
563 Py_INCREF(Py_None);
564 return Py_None;
565}
566
567static char xmlparse_GetBase__doc__[] =
568"() - returns base URL string "
569;
570
571static PyObject *
572xmlparse_GetBase( xmlparseobject *self, PyObject *args ){
573 const XML_Char *base;
574 PyObject *rc;
575
576 if( PyTuple_Size( args )!=0 ){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000577 PyArg_ParseTuple(args, "()" ); /* get good error reporting */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000578 return NULL;
579 }
580 base=XML_GetBase( self->itself );
581 if( base ){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000582 rc=Py_BuildValue("s", base);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000583 }else{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000584 Py_INCREF(Py_None);
585 rc=Py_None;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000586 }
587 return rc;
588
589}
590
591static struct PyMethodDef xmlparse_methods[] = {
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000592 {"Parse", (PyCFunction)xmlparse_Parse,
593 METH_VARARGS, xmlparse_Parse__doc__},
594 {"ParseFile", (PyCFunction)xmlparse_ParseFile,
595 METH_VARARGS, xmlparse_ParseFile__doc__},
596 {"SetBase", (PyCFunction)xmlparse_SetBase,
597 METH_VARARGS, xmlparse_SetBase__doc__},
598 {"GetBase", (PyCFunction)xmlparse_GetBase,
599 METH_VARARGS, xmlparse_GetBase__doc__},
600 {NULL, NULL} /* sentinel */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000601};
602
603/* ---------- */
604
605
606static xmlparseobject *
607newxmlparseobject( char *encoding, char *namespace_separator){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000608 int i;
609 xmlparseobject *self;
610
611#if PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6
612 self = PyObject_NEW(xmlparseobject, &Xmlparsetype);
613 if (self == NULL)
614 return NULL;
615
616 self->returns_unicode = 0;
617#else
618 /* Code for versions 1.6 and later */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000619 self = PyObject_New(xmlparseobject, &Xmlparsetype);
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000620 if (self == NULL)
621 return NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000622
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000623 self->returns_unicode = 1;
624#endif
625 if (namespace_separator) {
626 self->itself = XML_ParserCreateNS(encoding,
627 *namespace_separator);
628 }else{
629 self->itself = XML_ParserCreate(encoding);
630 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000631
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000632 if( self->itself==NULL ){
633 PyErr_SetString(PyExc_RuntimeError,
634 "XML_ParserCreate failed");
635 Py_DECREF(self);
636 return NULL;
637 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000638
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000639 XML_SetUserData(self->itself, (void *)self);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000640
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000641 for( i=0; handler_info[i].name!=NULL;i++);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000642
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000643 self->handlers=malloc( sizeof( PyObject *)*i );
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000644
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000645 clear_handlers( self );
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000646
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000647 return self;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000648}
649
650
651static void
652xmlparse_dealloc( xmlparseobject *self )
653{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000654 int i;
655 if (self->itself)
656 XML_ParserFree(self->itself);
657 self->itself = NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000658
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000659 for( i=0; handler_info[i].name!=NULL; i++ ){
660 Py_XDECREF( self->handlers[i] );
661 }
662#if PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6
663 /* Code for versions before 1.6 */
664 free(self);
665#else
666 /* Code for versions 1.6 and later */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000667 PyObject_Del(self);
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000668#endif
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000669}
670
671static int handlername2int( const char *name ){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000672 int i;
673 for( i=0;handler_info[i].name!=NULL;i++){
674 if( strcmp( name, handler_info[i].name )==0 ){
675 return i;
676 }
677 }
678 return -1;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000679}
680
681static PyObject *
682xmlparse_getattr(xmlparseobject *self, char *name)
683{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000684 int handlernum;
685 if (strcmp(name, "ErrorCode") == 0)
686 return Py_BuildValue("l",
687 (long)XML_GetErrorCode(self->itself));
688 if (strcmp(name, "ErrorLineNumber") == 0)
689 return Py_BuildValue("l",
690 (long)XML_GetErrorLineNumber(self->itself));
691 if (strcmp(name, "ErrorColumnNumber") == 0)
692 return Py_BuildValue("l",
693 (long)XML_GetErrorColumnNumber(self->itself));
694 if (strcmp(name, "ErrorByteIndex") == 0)
695 return Py_BuildValue("l",
696 XML_GetErrorByteIndex(self->itself));
697 if (strcmp(name, "returns_unicode") == 0)
698 return Py_BuildValue("i", self->returns_unicode);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000699
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000700 handlernum=handlername2int( name );
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000701
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000702 if( handlernum!=-1 && self->handlers[handlernum]!=NULL){
703 Py_INCREF( self->handlers[handlernum] );
704 return self->handlers[handlernum];
705 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000706
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000707 if (strcmp(name, "__members__") == 0){
708 int i;
709 PyObject *rc=PyList_New(0);
710 for(i=0; handler_info[i].name!=NULL;i++ ){
711 PyList_Append( rc,
712 PyString_FromString( handler_info[i].name ) );
713 }
714 PyList_Append( rc, PyString_FromString( "ErrorCode" ));
715 PyList_Append( rc, PyString_FromString( "ErrorLineNumber" ));
716 PyList_Append( rc, PyString_FromString( "ErrorColumnNumber"));
717 PyList_Append( rc, PyString_FromString( "ErrorByteIndex" ));
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000718
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000719 return rc;
720 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000721
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000722 return Py_FindMethod(xmlparse_methods, (PyObject *)self, name);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000723}
724
725static int sethandler( xmlparseobject *self, const char *name, PyObject* v ){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000726 int handlernum = handlername2int( name );
727 if( handlernum!=-1 ){
728 Py_INCREF( v );
729 Py_XDECREF( self->handlers[handlernum] );
730 self->handlers[handlernum]=v;
731 handler_info[handlernum].setter( self->itself,
732 handler_info[handlernum].handler );
733 return 1;
734 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000735
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000736 return 0;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000737}
738
739static int
740xmlparse_setattr( xmlparseobject *self, char *name, PyObject *v)
741{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000742 /* Set attribute 'name' to value 'v'. v==NULL means delete */
743 if (v==NULL) {
744 PyErr_SetString(PyExc_RuntimeError, "Cannot delete attribute");
745 return -1;
746 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000747
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000748 if (strcmp(name, "returns_unicode") == 0) {
749 PyObject *intobj = PyNumber_Int(v);
750 if (intobj == NULL) return -1;
751 if (PyInt_AsLong(intobj)) {
752#if PY_MAJOR_VERSION == 1 && PY_MINOR_VERSION < 6
753 PyErr_SetString(PyExc_ValueError,
754 "Cannot return Unicode strings in Python 1.5");
755 return -1;
756#else
757 self->returns_unicode = 1;
758#endif
759 }
760 else self->returns_unicode = 0;
761 Py_DECREF(intobj);
762 return 0;
763 }
764 if( sethandler( self, name, v ) ){
765 return 0;
766 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000767
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000768 PyErr_SetString( PyExc_AttributeError, name );
769 return -1;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000770}
771
772static char Xmlparsetype__doc__[] =
773"XML parser"
774;
775
776static PyTypeObject Xmlparsetype = {
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000777 PyObject_HEAD_INIT(NULL)
778 0, /*ob_size*/
779 "xmlparser", /*tp_name*/
780 sizeof(xmlparseobject), /*tp_basicsize*/
781 0, /*tp_itemsize*/
782 /* methods */
783 (destructor)xmlparse_dealloc, /*tp_dealloc*/
784 (printfunc)0, /*tp_print*/
785 (getattrfunc)xmlparse_getattr, /*tp_getattr*/
786 (setattrfunc)xmlparse_setattr, /*tp_setattr*/
787 (cmpfunc)0, /*tp_compare*/
788 (reprfunc)0, /*tp_repr*/
789 0, /*tp_as_number*/
790 0, /*tp_as_sequence*/
791 0, /*tp_as_mapping*/
792 (hashfunc)0, /*tp_hash*/
793 (ternaryfunc)0, /*tp_call*/
794 (reprfunc)0, /*tp_str*/
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000795
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000796 /* Space for future expansion */
797 0L,0L,0L,0L,
798 Xmlparsetype__doc__ /* Documentation string */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000799};
800
801/* End of code for xmlparser objects */
802/* -------------------------------------------------------- */
803
804
805static char pyexpat_ParserCreate__doc__[] =
806"([encoding, namespace_separator]) - Return a new XML parser object"
807;
808
809static PyObject *
810pyexpat_ParserCreate(PyObject *notused, PyObject *args, PyObject *kw) {
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000811 char *encoding = NULL, *namespace_separator=NULL;
812 static char *kwlist[] = {"encoding", "namespace_separator", NULL};
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000813
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000814 if (!PyArg_ParseTupleAndKeywords(args, kw, "|zz", kwlist,
815 &encoding, &namespace_separator))
816 return NULL;
817 return (PyObject *)newxmlparseobject(encoding, namespace_separator);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000818}
819
820static char pyexpat_ErrorString__doc__[] =
821"(errno) Returns string error for given number"
822;
823
824static PyObject *
825pyexpat_ErrorString(self, args)
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000826 PyObject *self; /* Not used */
827 PyObject *args;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000828{
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000829 long code;
830
831 if (!PyArg_ParseTuple(args, "l", &code))
832 return NULL;
833 return Py_BuildValue("z", XML_ErrorString((int)code));
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000834}
835
836/* List of methods defined in the module */
837
838static struct PyMethodDef pyexpat_methods[] = {
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000839 {"ParserCreate", (PyCFunction)pyexpat_ParserCreate,
840 METH_VARARGS|METH_KEYWORDS, pyexpat_ParserCreate__doc__},
841 {"ErrorString", (PyCFunction)pyexpat_ErrorString,
842 METH_VARARGS, pyexpat_ErrorString__doc__},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000843
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000844 {NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000845};
846
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000847/* Module docstring */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000848
849static char pyexpat_module_documentation[] =
850"Python wrapper for Expat parser."
851;
852
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000853/* Initialization function for the module */
854
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000855void
856initpyexpat(){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000857 PyObject *m, *d;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000858 char *rev="$Revision$";
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000859 PyObject *errors_module, *errors_dict;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000860
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000861 Xmlparsetype.ob_type = &PyType_Type;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000862
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000863 /* Create the module and add the functions */
864 m = Py_InitModule4("pyexpat", pyexpat_methods,
865 pyexpat_module_documentation,
866 (PyObject*)NULL,PYTHON_API_VERSION);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000867
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000868 /* Add some symbolic constants to the module */
869 d = PyModule_GetDict(m);
870 ErrorObject = PyString_FromString("pyexpat.error");
871 PyDict_SetItemString(d, "error", ErrorObject);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000872
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000873 PyDict_SetItemString(d,"__version__",
874 PyString_FromStringAndSize(rev+11,
875 strlen(rev+11)-2));
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000876
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000877 errors_module=PyModule_New( "errors" );
878 PyDict_SetItemString(d,"errors", errors_module );
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000879
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000880 /* XXX When Expat supports some way of figuring out how it was
881 compiled, this should check and set native_encoding
882 appropriately.
883 */
884 PyDict_SetItemString(d, "native_encoding",
885 PyString_FromString("UTF-8") );
886
887 errors_dict=PyModule_GetDict( errors_module );
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000888
889#define MYCONST(name) \
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000890 PyDict_SetItemString(errors_dict, #name, \
891 PyString_FromString( XML_ErrorString(name)))
892
893 MYCONST(XML_ERROR_NO_MEMORY);
894 MYCONST(XML_ERROR_SYNTAX);
895 MYCONST(XML_ERROR_NO_ELEMENTS);
896 MYCONST(XML_ERROR_INVALID_TOKEN);
897 MYCONST(XML_ERROR_UNCLOSED_TOKEN);
898 MYCONST(XML_ERROR_PARTIAL_CHAR);
899 MYCONST(XML_ERROR_TAG_MISMATCH);
900 MYCONST(XML_ERROR_DUPLICATE_ATTRIBUTE);
901 MYCONST(XML_ERROR_JUNK_AFTER_DOC_ELEMENT);
902 MYCONST(XML_ERROR_PARAM_ENTITY_REF);
903 MYCONST(XML_ERROR_UNDEFINED_ENTITY);
904 MYCONST(XML_ERROR_RECURSIVE_ENTITY_REF);
905 MYCONST(XML_ERROR_ASYNC_ENTITY);
906 MYCONST(XML_ERROR_BAD_CHAR_REF);
907 MYCONST(XML_ERROR_BINARY_ENTITY_REF);
908 MYCONST(XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF);
909 MYCONST(XML_ERROR_MISPLACED_XML_PI);
910 MYCONST(XML_ERROR_UNKNOWN_ENCODING);
911 MYCONST(XML_ERROR_INCORRECT_ENCODING);
912
913 /* Check for errors */
914 if (PyErr_Occurred())
915 Py_FatalError("can't initialize module pyexpat");
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000916}
917
918void clear_handlers( xmlparseobject *self ){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000919 int i=0;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000920
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000921 for( i=0;handler_info[i].name!=NULL;i++ ){
922 self->handlers[i]=NULL;
923 handler_info[i].setter( self->itself, NULL );
924 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000925}
926
927typedef void (*pairsetter)( XML_Parser, void *handler1, void *handler2 );
928
929void pyxml_UpdatePairedHandlers( xmlparseobject *self,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000930 int startHandler,
931 int endHandler,
932 pairsetter setter){
933 void *start_handler=NULL;
934 void *end_handler=NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000935
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000936 if( self->handlers[startHandler] &&
937 self->handlers[endHandler]!=Py_None ){
938 start_handler=handler_info[startHandler].handler;
939 }
940 if( self->handlers[EndElement] &&
941 self->handlers[EndElement] !=Py_None ){
942 end_handler=handler_info[endHandler].handler;
943 }
944
945 setter(self->itself,
946 start_handler,
947 end_handler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000948}
949
950void pyxml_SetStartElementHandler( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000951 void *junk){
952 pyxml_UpdatePairedHandlers(
953 (xmlparseobject *)XML_GetUserData( parser ),
954 StartElement, EndElement,
955 (pairsetter)XML_SetElementHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000956}
957
958void pyxml_SetEndElementHandler( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000959 void *junk){
960 pyxml_UpdatePairedHandlers(
961 (xmlparseobject *)XML_GetUserData( parser ),
962 StartElement, EndElement,
963 (pairsetter)XML_SetElementHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000964}
965
966void pyxml_SetStartNamespaceDeclHandler( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000967 void *junk){
968 pyxml_UpdatePairedHandlers(
969 (xmlparseobject *)XML_GetUserData( parser ),
970 StartNamespaceDecl, EndNamespaceDecl,
971 (pairsetter)XML_SetNamespaceDeclHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000972}
973
974void pyxml_SetEndNamespaceDeclHandler( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000975 void *junk){
976 pyxml_UpdatePairedHandlers(
977 (xmlparseobject *)XML_GetUserData( parser ),
978 StartNamespaceDecl, EndNamespaceDecl,
979 (pairsetter)XML_SetNamespaceDeclHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000980}
981
982void pyxml_SetStartCdataSection( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000983 void *junk){
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000984
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000985 pyxml_UpdatePairedHandlers(
986 (xmlparseobject *)XML_GetUserData( parser ),
987 StartCdataSection, EndCdataSection,
988 (pairsetter)XML_SetCdataSectionHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000989}
990
991void pyxml_SetEndCdataSection( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000992 void *junk){
993 pyxml_UpdatePairedHandlers(
994 (xmlparseobject *)XML_GetUserData( parser ),
995 StartCdataSection, EndCdataSection,
996 (pairsetter)XML_SetCdataSectionHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000997}
998
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000999statichere struct HandlerInfo handler_info[]=
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001000{{"StartElementHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001001 pyxml_SetStartElementHandler,
1002 my_StartElementHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001003{"EndElementHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001004 pyxml_SetEndElementHandler,
1005 my_EndElementHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001006{"ProcessingInstructionHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001007 (xmlhandlersetter)XML_SetProcessingInstructionHandler,
1008 my_ProcessingInstructionHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001009{"CharacterDataHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001010 (xmlhandlersetter)XML_SetCharacterDataHandler,
1011 my_CharacterDataHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001012{"UnparsedEntityDeclHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001013 (xmlhandlersetter)XML_SetUnparsedEntityDeclHandler,
1014 my_UnparsedEntityDeclHandler },
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001015{"NotationDeclHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001016 (xmlhandlersetter)XML_SetNotationDeclHandler,
1017 my_NotationDeclHandler },
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001018{"StartNamespaceDeclHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001019 pyxml_SetStartNamespaceDeclHandler,
1020 my_StartNamespaceDeclHandler },
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001021{"EndNamespaceDeclHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001022 pyxml_SetEndNamespaceDeclHandler,
1023 my_EndNamespaceDeclHandler },
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001024{"CommentHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001025 (xmlhandlersetter)XML_SetCommentHandler,
1026 my_CommentHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001027{"StartCdataSectionHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001028 pyxml_SetStartCdataSection,
1029 my_StartCdataSectionHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001030{"EndCdataSectionHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001031 pyxml_SetEndCdataSection,
1032 my_EndCdataSectionHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001033{"DefaultHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001034 (xmlhandlersetter)XML_SetDefaultHandler,
1035 my_DefaultHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001036{"DefaultHandlerExpand",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001037 (xmlhandlersetter)XML_SetDefaultHandlerExpand,
1038 my_DefaultHandlerExpandHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001039{"NotStandaloneHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001040 (xmlhandlersetter)XML_SetNotStandaloneHandler,
1041 my_NotStandaloneHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001042{"ExternalEntityRefHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001043 (xmlhandlersetter)XML_SetExternalEntityRefHandler,
1044 my_ExternalEntityRefHandler },
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001045
1046{NULL, NULL, NULL } /* sentinel */
1047};
1048