blob: e0c03f60cb50bfe34ee960442bb3504cbb55b845 [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
Andrew M. Kuchling637f6642000-07-04 14:53:43 +000069staticforward struct HandlerInfo handler_info[64];
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;
Fred Drake7bd9f412000-07-04 23:51:31 +0000843 char *rev = "$Revision$";
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000844 PyObject *errors_module, *errors_dict;
Fred Drake7bd9f412000-07-04 23:51:31 +0000845 PyObject *sys_modules;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000846
Fred Drake7bd9f412000-07-04 23:51:31 +0000847 Xmlparsetype.ob_type = &PyType_Type;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000848
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000849 /* Create the module and add the functions */
850 m = Py_InitModule4("pyexpat", pyexpat_methods,
Fred Drake7bd9f412000-07-04 23:51:31 +0000851 pyexpat_module_documentation,
852 (PyObject*)NULL, PYTHON_API_VERSION);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000853
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000854 /* Add some symbolic constants to the module */
855 d = PyModule_GetDict(m);
856 ErrorObject = PyString_FromString("pyexpat.error");
857 PyDict_SetItemString(d, "error", ErrorObject);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000858
Fred Drake7bd9f412000-07-04 23:51:31 +0000859 PyDict_SetItemString(d, "__version__",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000860 PyString_FromStringAndSize(rev+11,
861 strlen(rev+11)-2));
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000862
Fred Drake7bd9f412000-07-04 23:51:31 +0000863 sys_modules = PySys_GetObject("modules");
864 errors_module = PyModule_New("pyexpat.errors");
865 PyDict_SetItemString(d, "errors", errors_module);
866 PyDict_SetItemString(sys_modules, "pyexpat.errors", errors_module);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000867
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000868 /* XXX When Expat supports some way of figuring out how it was
869 compiled, this should check and set native_encoding
870 appropriately.
871 */
872 PyDict_SetItemString(d, "native_encoding",
Fred Drake7bd9f412000-07-04 23:51:31 +0000873 PyString_FromString("UTF-8"));
874 errors_dict = PyModule_GetDict(errors_module);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000875
876#define MYCONST(name) \
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000877 PyDict_SetItemString(errors_dict, #name, \
Fred Drake7bd9f412000-07-04 23:51:31 +0000878 PyString_FromString(XML_ErrorString(name)))
879
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000880 MYCONST(XML_ERROR_NO_MEMORY);
881 MYCONST(XML_ERROR_SYNTAX);
882 MYCONST(XML_ERROR_NO_ELEMENTS);
883 MYCONST(XML_ERROR_INVALID_TOKEN);
884 MYCONST(XML_ERROR_UNCLOSED_TOKEN);
885 MYCONST(XML_ERROR_PARTIAL_CHAR);
886 MYCONST(XML_ERROR_TAG_MISMATCH);
887 MYCONST(XML_ERROR_DUPLICATE_ATTRIBUTE);
888 MYCONST(XML_ERROR_JUNK_AFTER_DOC_ELEMENT);
889 MYCONST(XML_ERROR_PARAM_ENTITY_REF);
890 MYCONST(XML_ERROR_UNDEFINED_ENTITY);
891 MYCONST(XML_ERROR_RECURSIVE_ENTITY_REF);
892 MYCONST(XML_ERROR_ASYNC_ENTITY);
893 MYCONST(XML_ERROR_BAD_CHAR_REF);
894 MYCONST(XML_ERROR_BINARY_ENTITY_REF);
895 MYCONST(XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF);
896 MYCONST(XML_ERROR_MISPLACED_XML_PI);
897 MYCONST(XML_ERROR_UNKNOWN_ENCODING);
898 MYCONST(XML_ERROR_INCORRECT_ENCODING);
Fred Drake7bd9f412000-07-04 23:51:31 +0000899
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000900 /* Check for errors */
901 if (PyErr_Occurred())
902 Py_FatalError("can't initialize module pyexpat");
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000903}
904
905void clear_handlers( xmlparseobject *self ){
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000906 int i=0;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000907
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000908 for( i=0;handler_info[i].name!=NULL;i++ ){
909 self->handlers[i]=NULL;
910 handler_info[i].setter( self->itself, NULL );
911 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000912}
913
914typedef void (*pairsetter)( XML_Parser, void *handler1, void *handler2 );
915
916void pyxml_UpdatePairedHandlers( xmlparseobject *self,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000917 int startHandler,
918 int endHandler,
919 pairsetter setter){
920 void *start_handler=NULL;
921 void *end_handler=NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000922
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000923 if( self->handlers[startHandler] &&
924 self->handlers[endHandler]!=Py_None ){
925 start_handler=handler_info[startHandler].handler;
926 }
927 if( self->handlers[EndElement] &&
928 self->handlers[EndElement] !=Py_None ){
929 end_handler=handler_info[endHandler].handler;
930 }
931
932 setter(self->itself,
933 start_handler,
934 end_handler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000935}
936
937void pyxml_SetStartElementHandler( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000938 void *junk){
939 pyxml_UpdatePairedHandlers(
940 (xmlparseobject *)XML_GetUserData( parser ),
941 StartElement, EndElement,
942 (pairsetter)XML_SetElementHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000943}
944
945void pyxml_SetEndElementHandler( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000946 void *junk){
947 pyxml_UpdatePairedHandlers(
948 (xmlparseobject *)XML_GetUserData( parser ),
949 StartElement, EndElement,
950 (pairsetter)XML_SetElementHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000951}
952
953void pyxml_SetStartNamespaceDeclHandler( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000954 void *junk){
955 pyxml_UpdatePairedHandlers(
956 (xmlparseobject *)XML_GetUserData( parser ),
957 StartNamespaceDecl, EndNamespaceDecl,
958 (pairsetter)XML_SetNamespaceDeclHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000959}
960
961void pyxml_SetEndNamespaceDeclHandler( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000962 void *junk){
963 pyxml_UpdatePairedHandlers(
964 (xmlparseobject *)XML_GetUserData( parser ),
965 StartNamespaceDecl, EndNamespaceDecl,
966 (pairsetter)XML_SetNamespaceDeclHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000967}
968
969void pyxml_SetStartCdataSection( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000970 void *junk){
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000971
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000972 pyxml_UpdatePairedHandlers(
973 (xmlparseobject *)XML_GetUserData( parser ),
974 StartCdataSection, EndCdataSection,
975 (pairsetter)XML_SetCdataSectionHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000976}
977
978void pyxml_SetEndCdataSection( XML_Parser *parser,
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000979 void *junk){
980 pyxml_UpdatePairedHandlers(
981 (xmlparseobject *)XML_GetUserData( parser ),
982 StartCdataSection, EndCdataSection,
983 (pairsetter)XML_SetCdataSectionHandler);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000984}
985
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000986statichere struct HandlerInfo handler_info[]=
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000987{{"StartElementHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000988 pyxml_SetStartElementHandler,
Andrew M. Kuchling637f6642000-07-04 14:53:43 +0000989 (xmlhandler)my_StartElementHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000990{"EndElementHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000991 pyxml_SetEndElementHandler,
Andrew M. Kuchling637f6642000-07-04 14:53:43 +0000992 (xmlhandler)my_EndElementHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000993{"ProcessingInstructionHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000994 (xmlhandlersetter)XML_SetProcessingInstructionHandler,
Andrew M. Kuchling637f6642000-07-04 14:53:43 +0000995 (xmlhandler)my_ProcessingInstructionHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000996{"CharacterDataHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000997 (xmlhandlersetter)XML_SetCharacterDataHandler,
Andrew M. Kuchling637f6642000-07-04 14:53:43 +0000998 (xmlhandler)my_CharacterDataHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000999{"UnparsedEntityDeclHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001000 (xmlhandlersetter)XML_SetUnparsedEntityDeclHandler,
Andrew M. Kuchling637f6642000-07-04 14:53:43 +00001001 (xmlhandler)my_UnparsedEntityDeclHandler },
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001002{"NotationDeclHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001003 (xmlhandlersetter)XML_SetNotationDeclHandler,
Andrew M. Kuchling637f6642000-07-04 14:53:43 +00001004 (xmlhandler)my_NotationDeclHandler },
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001005{"StartNamespaceDeclHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001006 pyxml_SetStartNamespaceDeclHandler,
Andrew M. Kuchling637f6642000-07-04 14:53:43 +00001007 (xmlhandler)my_StartNamespaceDeclHandler },
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001008{"EndNamespaceDeclHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001009 pyxml_SetEndNamespaceDeclHandler,
Andrew M. Kuchling637f6642000-07-04 14:53:43 +00001010 (xmlhandler)my_EndNamespaceDeclHandler },
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001011{"CommentHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001012 (xmlhandlersetter)XML_SetCommentHandler,
Andrew M. Kuchling637f6642000-07-04 14:53:43 +00001013 (xmlhandler)my_CommentHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001014{"StartCdataSectionHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001015 pyxml_SetStartCdataSection,
Andrew M. Kuchling637f6642000-07-04 14:53:43 +00001016 (xmlhandler)my_StartCdataSectionHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001017{"EndCdataSectionHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001018 pyxml_SetEndCdataSection,
Andrew M. Kuchling637f6642000-07-04 14:53:43 +00001019 (xmlhandler)my_EndCdataSectionHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001020{"DefaultHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001021 (xmlhandlersetter)XML_SetDefaultHandler,
Andrew M. Kuchling637f6642000-07-04 14:53:43 +00001022 (xmlhandler)my_DefaultHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001023{"DefaultHandlerExpand",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001024 (xmlhandlersetter)XML_SetDefaultHandlerExpand,
Andrew M. Kuchling637f6642000-07-04 14:53:43 +00001025 (xmlhandler)my_DefaultHandlerExpandHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001026{"NotStandaloneHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001027 (xmlhandlersetter)XML_SetNotStandaloneHandler,
Andrew M. Kuchling637f6642000-07-04 14:53:43 +00001028 (xmlhandler)my_NotStandaloneHandler},
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001029{"ExternalEntityRefHandler",
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001030 (xmlhandlersetter)XML_SetExternalEntityRefHandler,
Andrew M. Kuchling637f6642000-07-04 14:53:43 +00001031 (xmlhandler)my_ExternalEntityRefHandler },
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001032
1033{NULL, NULL, NULL } /* sentinel */
1034};