blob: ab3dac6db16840437ad2fef57b35d708cfbe683d [file] [log] [blame]
Martin v. Löwis7090ed12001-09-19 10:37:50 +00001#include "Python.h"
Fred Drake4113b132001-03-24 19:58:26 +00002#include <ctype.h>
3
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00004#include "frameobject.h"
Fred Drakea77254a2000-09-29 19:23:29 +00005#include "expat.h"
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00006
Fredrik Lundhc3345042005-12-13 19:49:55 +00007#include "pyexpat.h"
8
Brett Cannond0aeda82014-08-22 14:23:20 -04009/* Do not emit Clinic output to a file as that wreaks havoc with conditionally
10 included methods. */
11/*[clinic input]
12module pyexpat
13[clinic start generated code]*/
14/*[clinic end generated code: output=da39a3ee5e6b4b0d input=b168d503a4490c15]*/
15
Martin v. Löwisc847f402003-01-21 11:09:21 +000016#define XML_COMBINED_VERSION (10000*XML_MAJOR_VERSION+100*XML_MINOR_VERSION+XML_MICRO_VERSION)
17
Christian Heimesfa535f52013-07-07 17:35:11 +020018static XML_Memory_Handling_Suite ExpatMemoryHandler = {
19 PyObject_Malloc, PyObject_Realloc, PyObject_Free};
20
Fred Drake0582df92000-07-12 04:49:00 +000021enum HandlerTypes {
22 StartElement,
23 EndElement,
24 ProcessingInstruction,
25 CharacterData,
26 UnparsedEntityDecl,
27 NotationDecl,
28 StartNamespaceDecl,
29 EndNamespaceDecl,
30 Comment,
31 StartCdataSection,
32 EndCdataSection,
33 Default,
34 DefaultHandlerExpand,
35 NotStandalone,
Martin v. Löwis0078f6c2001-01-21 10:18:10 +000036 ExternalEntityRef,
37 StartDoctypeDecl,
38 EndDoctypeDecl,
Fred Drake85d835f2001-02-08 15:39:08 +000039 EntityDecl,
40 XmlDecl,
41 ElementDecl,
42 AttlistDecl,
Martin v. Löwisc847f402003-01-21 11:09:21 +000043#if XML_COMBINED_VERSION >= 19504
Martin v. Löwis069dde22003-01-21 10:58:18 +000044 SkippedEntity,
Martin v. Löwisc847f402003-01-21 11:09:21 +000045#endif
Fred Drake85d835f2001-02-08 15:39:08 +000046 _DummyDecl
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000047};
48
49static PyObject *ErrorObject;
50
51/* ----------------------------------------------------- */
52
53/* Declarations for objects of type xmlparser */
54
55typedef struct {
Fred Drake0582df92000-07-12 04:49:00 +000056 PyObject_HEAD
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000057
Fred Drake0582df92000-07-12 04:49:00 +000058 XML_Parser itself;
Fred Drake85d835f2001-02-08 15:39:08 +000059 int ordered_attributes; /* Return attributes as a list. */
60 int specified_attributes; /* Report only specified attributes. */
Fred Drakebd6101c2001-02-14 18:29:45 +000061 int in_callback; /* Is a callback active? */
Martin v. Löwis069dde22003-01-21 10:58:18 +000062 int ns_prefixes; /* Namespace-triplets mode? */
Fred Drake2a3d7db2002-06-28 22:56:48 +000063 XML_Char *buffer; /* Buffer used when accumulating characters */
64 /* NULL if not enabled */
65 int buffer_size; /* Size of buffer, in XML_Char units */
66 int buffer_used; /* Buffer units in use */
Fred Drakeb91a36b2002-06-27 19:40:48 +000067 PyObject *intern; /* Dictionary to intern strings */
Fred Drake0582df92000-07-12 04:49:00 +000068 PyObject **handlers;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000069} xmlparseobject;
70
Serhiy Storchaka1009bf12015-04-03 23:53:51 +030071#include "clinic/pyexpat.c.h"
72
Fred Drake2a3d7db2002-06-28 22:56:48 +000073#define CHARACTER_DATA_BUFFER_SIZE 8192
74
Jeremy Hylton938ace62002-07-17 16:30:39 +000075static PyTypeObject Xmlparsetype;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000076
Fred Drake117ac852002-09-24 16:24:54 +000077typedef void (*xmlhandlersetter)(XML_Parser self, void *meth);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000078typedef void* xmlhandler;
79
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +000080struct HandlerInfo {
Fred Drake0582df92000-07-12 04:49:00 +000081 const char *name;
82 xmlhandlersetter setter;
83 xmlhandler handler;
Martin v. Löwis0078f6c2001-01-21 10:18:10 +000084 PyCodeObject *tb_code;
Fred Drake71b63ff2002-06-28 22:29:01 +000085 PyObject *nameobj;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000086};
87
Jeremy Hylton938ace62002-07-17 16:30:39 +000088static struct HandlerInfo handler_info[64];
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +000089
Fred Drakebd6101c2001-02-14 18:29:45 +000090/* Set an integer attribute on the error object; return true on success,
91 * false on an exception.
92 */
93static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +020094set_error_attr(PyObject *err, const char *name, int value)
Fred Drakebd6101c2001-02-14 18:29:45 +000095{
Christian Heimes217cfd12007-12-02 14:31:20 +000096 PyObject *v = PyLong_FromLong(value);
Fred Drake85d835f2001-02-08 15:39:08 +000097
Neal Norwitz2f5e9902006-03-08 06:36:45 +000098 if (v == NULL || PyObject_SetAttrString(err, name, v) == -1) {
99 Py_XDECREF(v);
Fred Drakebd6101c2001-02-14 18:29:45 +0000100 return 0;
101 }
Michael W. Hudson0bb84542004-08-03 11:31:31 +0000102 Py_DECREF(v);
Fred Drakebd6101c2001-02-14 18:29:45 +0000103 return 1;
104}
105
106/* Build and set an Expat exception, including positioning
107 * information. Always returns NULL.
108 */
Fred Drake85d835f2001-02-08 15:39:08 +0000109static PyObject *
Martin v. Löwis069dde22003-01-21 10:58:18 +0000110set_error(xmlparseobject *self, enum XML_Error code)
Fred Drake85d835f2001-02-08 15:39:08 +0000111{
112 PyObject *err;
Victor Stinner499dfcf2011-03-21 13:26:24 +0100113 PyObject *buffer;
Fred Drake85d835f2001-02-08 15:39:08 +0000114 XML_Parser parser = self->itself;
Fred Drakebd6101c2001-02-14 18:29:45 +0000115 int lineno = XML_GetErrorLineNumber(parser);
116 int column = XML_GetErrorColumnNumber(parser);
Fred Drake85d835f2001-02-08 15:39:08 +0000117
Victor Stinner499dfcf2011-03-21 13:26:24 +0100118 buffer = PyUnicode_FromFormat("%s: line %i, column %i",
119 XML_ErrorString(code), lineno, column);
120 if (buffer == NULL)
121 return NULL;
Victor Stinner7bfb42d2016-12-05 17:04:32 +0100122 err = PyObject_CallFunctionObjArgs(ErrorObject, buffer, NULL);
Victor Stinner499dfcf2011-03-21 13:26:24 +0100123 Py_DECREF(buffer);
Fred Drakebd6101c2001-02-14 18:29:45 +0000124 if ( err != NULL
125 && set_error_attr(err, "code", code)
126 && set_error_attr(err, "offset", column)
127 && set_error_attr(err, "lineno", lineno)) {
128 PyErr_SetObject(ErrorObject, err);
Fred Drake85d835f2001-02-08 15:39:08 +0000129 }
Neal Norwitz2f5e9902006-03-08 06:36:45 +0000130 Py_XDECREF(err);
Fred Drake85d835f2001-02-08 15:39:08 +0000131 return NULL;
132}
133
Fred Drake71b63ff2002-06-28 22:29:01 +0000134static int
135have_handler(xmlparseobject *self, int type)
136{
137 PyObject *handler = self->handlers[type];
138 return handler != NULL;
139}
140
141static PyObject *
142get_handler_name(struct HandlerInfo *hinfo)
143{
144 PyObject *name = hinfo->nameobj;
145 if (name == NULL) {
Neal Norwitz392c5be2007-08-25 17:20:32 +0000146 name = PyUnicode_FromString(hinfo->name);
Fred Drake71b63ff2002-06-28 22:29:01 +0000147 hinfo->nameobj = name;
148 }
149 Py_XINCREF(name);
150 return name;
151}
152
Fred Drake85d835f2001-02-08 15:39:08 +0000153
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000154/* Convert a string of XML_Chars into a Unicode string.
155 Returns None if str is a null pointer. */
156
Fred Drake0582df92000-07-12 04:49:00 +0000157static PyObject *
Fred Drakeb91a36b2002-06-27 19:40:48 +0000158conv_string_to_unicode(const XML_Char *str)
Fred Drake0582df92000-07-12 04:49:00 +0000159{
Fred Drake71b63ff2002-06-28 22:29:01 +0000160 /* XXX currently this code assumes that XML_Char is 8-bit,
Fred Drake0582df92000-07-12 04:49:00 +0000161 and hence in UTF-8. */
162 /* UTF-8 from Expat, Unicode desired */
163 if (str == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200164 Py_RETURN_NONE;
Fred Drake0582df92000-07-12 04:49:00 +0000165 }
Fred Drake71b63ff2002-06-28 22:29:01 +0000166 return PyUnicode_DecodeUTF8(str, strlen(str), "strict");
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000167}
168
Fred Drake0582df92000-07-12 04:49:00 +0000169static PyObject *
170conv_string_len_to_unicode(const XML_Char *str, int len)
171{
Fred Drake71b63ff2002-06-28 22:29:01 +0000172 /* XXX currently this code assumes that XML_Char is 8-bit,
Fred Drake0582df92000-07-12 04:49:00 +0000173 and hence in UTF-8. */
174 /* UTF-8 from Expat, Unicode desired */
175 if (str == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200176 Py_RETURN_NONE;
Fred Drake0582df92000-07-12 04:49:00 +0000177 }
Fred Drake6f987622000-08-25 18:03:30 +0000178 return PyUnicode_DecodeUTF8((const char *)str, len, "strict");
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000179}
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000180
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000181/* Callback routines */
182
Martin v. Löwis5b68ce32001-10-21 08:53:52 +0000183static void clear_handlers(xmlparseobject *self, int initial);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000184
Martin v. Löwis069dde22003-01-21 10:58:18 +0000185/* This handler is used when an error has been detected, in the hope
186 that actual parsing can be terminated early. This will only help
187 if an external entity reference is encountered. */
188static int
189error_external_entity_ref_handler(XML_Parser parser,
190 const XML_Char *context,
191 const XML_Char *base,
192 const XML_Char *systemId,
193 const XML_Char *publicId)
194{
195 return 0;
196}
197
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000198/* Dummy character data handler used when an error (exception) has
199 been detected, and the actual parsing can be terminated early.
200 This is needed since character data handler can't be safely removed
201 from within the character data handler, but can be replaced. It is
202 used only from the character data handler trampoline, and must be
203 used right after `flag_error()` is called. */
204static void
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000205noop_character_data_handler(void *userData, const XML_Char *data, int len)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000206{
207 /* Do nothing. */
208}
209
Fred Drake6f987622000-08-25 18:03:30 +0000210static void
211flag_error(xmlparseobject *self)
212{
Martin v. Löwis5b68ce32001-10-21 08:53:52 +0000213 clear_handlers(self, 0);
Martin v. Löwis069dde22003-01-21 10:58:18 +0000214 XML_SetExternalEntityRefHandler(self->itself,
215 error_external_entity_ref_handler);
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000216}
217
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000218static PyObject*
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200219call_with_frame(const char *funcname, int lineno, PyObject* func, PyObject* args,
Fred Drake39689c52004-08-13 03:12:57 +0000220 xmlparseobject *self)
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000221{
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200222 PyObject *res;
Fred Drakebd6101c2001-02-14 18:29:45 +0000223
Fred Drakebd6101c2001-02-14 18:29:45 +0000224 res = PyEval_CallObject(func, args);
Jeremy Hylton9263f572003-06-27 16:13:17 +0000225 if (res == NULL) {
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200226 _PyTraceback_Add(funcname, __FILE__, lineno);
Fred Drake39689c52004-08-13 03:12:57 +0000227 XML_StopParser(self->itself, XML_FALSE);
Jeremy Hylton9263f572003-06-27 16:13:17 +0000228 }
Fred Drakebd6101c2001-02-14 18:29:45 +0000229 return res;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000230}
231
Fred Drakeb91a36b2002-06-27 19:40:48 +0000232static PyObject*
233string_intern(xmlparseobject *self, const char* str)
234{
Guido van Rossum4ca94712007-07-23 17:42:32 +0000235 PyObject *result = conv_string_to_unicode(str);
Fred Drakeb91a36b2002-06-27 19:40:48 +0000236 PyObject *value;
Neal Norwitz484d9a42005-09-30 04:46:49 +0000237 /* result can be NULL if the unicode conversion failed. */
238 if (!result)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 return result;
Fred Drakeb91a36b2002-06-27 19:40:48 +0000240 if (!self->intern)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 return result;
Fred Drakeb91a36b2002-06-27 19:40:48 +0000242 value = PyDict_GetItem(self->intern, result);
243 if (!value) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 if (PyDict_SetItem(self->intern, result, result) == 0)
Fred Drakeb91a36b2002-06-27 19:40:48 +0000245 return result;
Zackery Spytz68def052018-10-19 00:57:38 -0600246 else {
247 Py_DECREF(result);
Fred Drakeb91a36b2002-06-27 19:40:48 +0000248 return NULL;
Zackery Spytz68def052018-10-19 00:57:38 -0600249 }
Fred Drakeb91a36b2002-06-27 19:40:48 +0000250 }
251 Py_INCREF(value);
252 Py_DECREF(result);
253 return value;
254}
255
Fred Drake2a3d7db2002-06-28 22:56:48 +0000256/* Return 0 on success, -1 on exception.
257 * flag_error() will be called before return if needed.
258 */
259static int
260call_character_handler(xmlparseobject *self, const XML_Char *buffer, int len)
261{
262 PyObject *args;
263 PyObject *temp;
264
Georg Brandlc01537f2010-10-15 16:26:08 +0000265 if (!have_handler(self, CharacterData))
266 return -1;
267
Fred Drake2a3d7db2002-06-28 22:56:48 +0000268 args = PyTuple_New(1);
269 if (args == NULL)
270 return -1;
Guido van Rossum4ca94712007-07-23 17:42:32 +0000271 temp = (conv_string_len_to_unicode(buffer, len));
Fred Drake2a3d7db2002-06-28 22:56:48 +0000272 if (temp == NULL) {
273 Py_DECREF(args);
274 flag_error(self);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000275 XML_SetCharacterDataHandler(self->itself,
276 noop_character_data_handler);
Fred Drake2a3d7db2002-06-28 22:56:48 +0000277 return -1;
278 }
279 PyTuple_SET_ITEM(args, 0, temp);
280 /* temp is now a borrowed reference; consider it unused. */
281 self->in_callback = 1;
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200282 temp = call_with_frame("CharacterData", __LINE__,
Fred Drake39689c52004-08-13 03:12:57 +0000283 self->handlers[CharacterData], args, self);
Fred Drake2a3d7db2002-06-28 22:56:48 +0000284 /* temp is an owned reference again, or NULL */
285 self->in_callback = 0;
286 Py_DECREF(args);
287 if (temp == NULL) {
288 flag_error(self);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000289 XML_SetCharacterDataHandler(self->itself,
290 noop_character_data_handler);
Fred Drake2a3d7db2002-06-28 22:56:48 +0000291 return -1;
292 }
293 Py_DECREF(temp);
294 return 0;
295}
296
297static int
298flush_character_buffer(xmlparseobject *self)
299{
300 int rc;
301 if (self->buffer == NULL || self->buffer_used == 0)
302 return 0;
303 rc = call_character_handler(self, self->buffer, self->buffer_used);
304 self->buffer_used = 0;
305 return rc;
306}
307
308static void
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309my_CharacterDataHandler(void *userData, const XML_Char *data, int len)
Fred Drake2a3d7db2002-06-28 22:56:48 +0000310{
311 xmlparseobject *self = (xmlparseobject *) userData;
Victor Stinner9e09c262013-07-18 23:17:01 +0200312
313 if (PyErr_Occurred())
314 return;
315
Fred Drake2a3d7db2002-06-28 22:56:48 +0000316 if (self->buffer == NULL)
317 call_character_handler(self, data, len);
318 else {
319 if ((self->buffer_used + len) > self->buffer_size) {
320 if (flush_character_buffer(self) < 0)
321 return;
322 /* handler might have changed; drop the rest on the floor
323 * if there isn't a handler anymore
324 */
325 if (!have_handler(self, CharacterData))
326 return;
327 }
328 if (len > self->buffer_size) {
329 call_character_handler(self, data, len);
330 self->buffer_used = 0;
331 }
332 else {
333 memcpy(self->buffer + self->buffer_used,
334 data, len * sizeof(XML_Char));
335 self->buffer_used += len;
336 }
337 }
338}
339
Fred Drake85d835f2001-02-08 15:39:08 +0000340static void
341my_StartElementHandler(void *userData,
Fred Drake71b63ff2002-06-28 22:29:01 +0000342 const XML_Char *name, const XML_Char *atts[])
Fred Drake85d835f2001-02-08 15:39:08 +0000343{
344 xmlparseobject *self = (xmlparseobject *)userData;
345
Fred Drake71b63ff2002-06-28 22:29:01 +0000346 if (have_handler(self, StartElement)) {
Fred Drake85d835f2001-02-08 15:39:08 +0000347 PyObject *container, *rv, *args;
348 int i, max;
349
Victor Stinner9e09c262013-07-18 23:17:01 +0200350 if (PyErr_Occurred())
351 return;
352
Fred Drake2a3d7db2002-06-28 22:56:48 +0000353 if (flush_character_buffer(self) < 0)
354 return;
Fred Drake85d835f2001-02-08 15:39:08 +0000355 /* Set max to the number of slots filled in atts[]; max/2 is
356 * the number of attributes we need to process.
357 */
358 if (self->specified_attributes) {
359 max = XML_GetSpecifiedAttributeCount(self->itself);
360 }
361 else {
362 max = 0;
363 while (atts[max] != NULL)
364 max += 2;
365 }
366 /* Build the container. */
367 if (self->ordered_attributes)
368 container = PyList_New(max);
369 else
370 container = PyDict_New();
371 if (container == NULL) {
372 flag_error(self);
373 return;
374 }
375 for (i = 0; i < max; i += 2) {
Fred Drakeb91a36b2002-06-27 19:40:48 +0000376 PyObject *n = string_intern(self, (XML_Char *) atts[i]);
Fred Drake85d835f2001-02-08 15:39:08 +0000377 PyObject *v;
378 if (n == NULL) {
379 flag_error(self);
380 Py_DECREF(container);
381 return;
382 }
Guido van Rossum4ca94712007-07-23 17:42:32 +0000383 v = conv_string_to_unicode((XML_Char *) atts[i+1]);
Fred Drake85d835f2001-02-08 15:39:08 +0000384 if (v == NULL) {
385 flag_error(self);
386 Py_DECREF(container);
387 Py_DECREF(n);
388 return;
389 }
390 if (self->ordered_attributes) {
391 PyList_SET_ITEM(container, i, n);
392 PyList_SET_ITEM(container, i+1, v);
393 }
394 else if (PyDict_SetItem(container, n, v)) {
395 flag_error(self);
396 Py_DECREF(n);
397 Py_DECREF(v);
Zackery Spytz68def052018-10-19 00:57:38 -0600398 Py_DECREF(container);
Fred Drake85d835f2001-02-08 15:39:08 +0000399 return;
400 }
401 else {
402 Py_DECREF(n);
403 Py_DECREF(v);
404 }
405 }
Neal Norwitz484d9a42005-09-30 04:46:49 +0000406 args = string_intern(self, name);
Fred Drake85d835f2001-02-08 15:39:08 +0000407 if (args == NULL) {
408 Py_DECREF(container);
409 return;
410 }
Zackery Spytz68def052018-10-19 00:57:38 -0600411 args = Py_BuildValue("(NN)", args, container);
412 if (args == NULL) {
413 return;
414 }
Fred Drake85d835f2001-02-08 15:39:08 +0000415 /* Container is now a borrowed reference; ignore it. */
Fred Drakebd6101c2001-02-14 18:29:45 +0000416 self->in_callback = 1;
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200417 rv = call_with_frame("StartElement", __LINE__,
Fred Drake39689c52004-08-13 03:12:57 +0000418 self->handlers[StartElement], args, self);
Fred Drakebd6101c2001-02-14 18:29:45 +0000419 self->in_callback = 0;
420 Py_DECREF(args);
Fred Drake85d835f2001-02-08 15:39:08 +0000421 if (rv == NULL) {
422 flag_error(self);
423 return;
Fred Drakebd6101c2001-02-14 18:29:45 +0000424 }
Fred Drake85d835f2001-02-08 15:39:08 +0000425 Py_DECREF(rv);
426 }
427}
428
429#define RC_HANDLER(RC, NAME, PARAMS, INIT, PARAM_FORMAT, CONVERSION, \
430 RETURN, GETUSERDATA) \
431static RC \
432my_##NAME##Handler PARAMS {\
433 xmlparseobject *self = GETUSERDATA ; \
434 PyObject *args = NULL; \
435 PyObject *rv = NULL; \
436 INIT \
437\
Fred Drake71b63ff2002-06-28 22:29:01 +0000438 if (have_handler(self, NAME)) { \
Victor Stinner9e09c262013-07-18 23:17:01 +0200439 if (PyErr_Occurred()) \
440 return RETURN; \
Fred Drake2a3d7db2002-06-28 22:56:48 +0000441 if (flush_character_buffer(self) < 0) \
442 return RETURN; \
Fred Drake85d835f2001-02-08 15:39:08 +0000443 args = Py_BuildValue PARAM_FORMAT ;\
Martin v. Löwis1d7c55f2001-11-10 13:57:55 +0000444 if (!args) { flag_error(self); return RETURN;} \
Fred Drakebd6101c2001-02-14 18:29:45 +0000445 self->in_callback = 1; \
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200446 rv = call_with_frame(#NAME,__LINE__, \
Fred Drake39689c52004-08-13 03:12:57 +0000447 self->handlers[NAME], args, self); \
Fred Drakebd6101c2001-02-14 18:29:45 +0000448 self->in_callback = 0; \
Fred Drake85d835f2001-02-08 15:39:08 +0000449 Py_DECREF(args); \
450 if (rv == NULL) { \
451 flag_error(self); \
452 return RETURN; \
453 } \
454 CONVERSION \
455 Py_DECREF(rv); \
456 } \
457 return RETURN; \
458}
459
Fred Drake6f987622000-08-25 18:03:30 +0000460#define VOID_HANDLER(NAME, PARAMS, PARAM_FORMAT) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 RC_HANDLER(void, NAME, PARAMS, ;, PARAM_FORMAT, ;, ;,\
462 (xmlparseobject *)userData)
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000463
Fred Drake6f987622000-08-25 18:03:30 +0000464#define INT_HANDLER(NAME, PARAMS, PARAM_FORMAT)\
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 RC_HANDLER(int, NAME, PARAMS, int rc=0;, PARAM_FORMAT, \
466 rc = PyLong_AsLong(rv);, rc, \
467 (xmlparseobject *)userData)
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000468
Fred Drake71b63ff2002-06-28 22:29:01 +0000469VOID_HANDLER(EndElement,
470 (void *userData, const XML_Char *name),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000471 ("(N)", string_intern(self, name)))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000472
Fred Drake6f987622000-08-25 18:03:30 +0000473VOID_HANDLER(ProcessingInstruction,
Fred Drake71b63ff2002-06-28 22:29:01 +0000474 (void *userData,
475 const XML_Char *target,
Fred Drake85d835f2001-02-08 15:39:08 +0000476 const XML_Char *data),
Guido van Rossum4ca94712007-07-23 17:42:32 +0000477 ("(NO&)", string_intern(self, target), conv_string_to_unicode ,data))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000478
Fred Drake6f987622000-08-25 18:03:30 +0000479VOID_HANDLER(UnparsedEntityDecl,
Fred Drake71b63ff2002-06-28 22:29:01 +0000480 (void *userData,
Fred Drake85d835f2001-02-08 15:39:08 +0000481 const XML_Char *entityName,
482 const XML_Char *base,
483 const XML_Char *systemId,
484 const XML_Char *publicId,
485 const XML_Char *notationName),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000486 ("(NNNNN)",
Fred Drake71b63ff2002-06-28 22:29:01 +0000487 string_intern(self, entityName), string_intern(self, base),
488 string_intern(self, systemId), string_intern(self, publicId),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000489 string_intern(self, notationName)))
Fred Drake85d835f2001-02-08 15:39:08 +0000490
Fred Drake85d835f2001-02-08 15:39:08 +0000491VOID_HANDLER(EntityDecl,
492 (void *userData,
493 const XML_Char *entityName,
494 int is_parameter_entity,
495 const XML_Char *value,
496 int value_length,
497 const XML_Char *base,
498 const XML_Char *systemId,
499 const XML_Char *publicId,
500 const XML_Char *notationName),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000501 ("NiNNNNN",
502 string_intern(self, entityName), is_parameter_entity,
Guido van Rossum4ca94712007-07-23 17:42:32 +0000503 (conv_string_len_to_unicode(value, value_length)),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000504 string_intern(self, base), string_intern(self, systemId),
505 string_intern(self, publicId),
506 string_intern(self, notationName)))
Fred Drake85d835f2001-02-08 15:39:08 +0000507
508VOID_HANDLER(XmlDecl,
509 (void *userData,
510 const XML_Char *version,
511 const XML_Char *encoding,
512 int standalone),
513 ("(O&O&i)",
Guido van Rossum4ca94712007-07-23 17:42:32 +0000514 conv_string_to_unicode ,version, conv_string_to_unicode ,encoding,
Fred Drake85d835f2001-02-08 15:39:08 +0000515 standalone))
516
517static PyObject *
518conv_content_model(XML_Content * const model,
Fred Drakeb91a36b2002-06-27 19:40:48 +0000519 PyObject *(*conv_string)(const XML_Char *))
Fred Drake85d835f2001-02-08 15:39:08 +0000520{
521 PyObject *result = NULL;
522 PyObject *children = PyTuple_New(model->numchildren);
523 int i;
524
525 if (children != NULL) {
Tim Peters9544fc52001-07-28 09:36:36 +0000526 assert(model->numchildren < INT_MAX);
527 for (i = 0; i < (int)model->numchildren; ++i) {
Fred Drake85d835f2001-02-08 15:39:08 +0000528 PyObject *child = conv_content_model(&model->children[i],
529 conv_string);
530 if (child == NULL) {
531 Py_XDECREF(children);
532 return NULL;
533 }
534 PyTuple_SET_ITEM(children, i, child);
535 }
536 result = Py_BuildValue("(iiO&N)",
537 model->type, model->quant,
538 conv_string,model->name, children);
539 }
540 return result;
541}
542
Fred Drake06dd8cf2003-02-02 03:54:17 +0000543static void
544my_ElementDeclHandler(void *userData,
545 const XML_Char *name,
546 XML_Content *model)
Fred Drake85d835f2001-02-08 15:39:08 +0000547{
Fred Drake06dd8cf2003-02-02 03:54:17 +0000548 xmlparseobject *self = (xmlparseobject *)userData;
549 PyObject *args = NULL;
Fred Drake85d835f2001-02-08 15:39:08 +0000550
Fred Drake06dd8cf2003-02-02 03:54:17 +0000551 if (have_handler(self, ElementDecl)) {
552 PyObject *rv = NULL;
553 PyObject *modelobj, *nameobj;
554
Victor Stinner9e09c262013-07-18 23:17:01 +0200555 if (PyErr_Occurred())
556 return;
557
Fred Drake06dd8cf2003-02-02 03:54:17 +0000558 if (flush_character_buffer(self) < 0)
559 goto finally;
Guido van Rossum4ca94712007-07-23 17:42:32 +0000560 modelobj = conv_content_model(model, (conv_string_to_unicode));
Fred Drake06dd8cf2003-02-02 03:54:17 +0000561 if (modelobj == NULL) {
562 flag_error(self);
563 goto finally;
564 }
565 nameobj = string_intern(self, name);
566 if (nameobj == NULL) {
567 Py_DECREF(modelobj);
568 flag_error(self);
569 goto finally;
570 }
Michael W. Hudson0bb84542004-08-03 11:31:31 +0000571 args = Py_BuildValue("NN", nameobj, modelobj);
Fred Drake06dd8cf2003-02-02 03:54:17 +0000572 if (args == NULL) {
Fred Drake06dd8cf2003-02-02 03:54:17 +0000573 flag_error(self);
574 goto finally;
575 }
576 self->in_callback = 1;
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200577 rv = call_with_frame("ElementDecl", __LINE__,
Fred Drake39689c52004-08-13 03:12:57 +0000578 self->handlers[ElementDecl], args, self);
Fred Drake06dd8cf2003-02-02 03:54:17 +0000579 self->in_callback = 0;
580 if (rv == NULL) {
581 flag_error(self);
582 goto finally;
583 }
584 Py_DECREF(rv);
585 }
586 finally:
587 Py_XDECREF(args);
588 XML_FreeContentModel(self->itself, model);
589 return;
590}
Fred Drake85d835f2001-02-08 15:39:08 +0000591
592VOID_HANDLER(AttlistDecl,
593 (void *userData,
594 const XML_Char *elname,
595 const XML_Char *attname,
596 const XML_Char *att_type,
597 const XML_Char *dflt,
598 int isrequired),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000599 ("(NNO&O&i)",
600 string_intern(self, elname), string_intern(self, attname),
Guido van Rossum4ca94712007-07-23 17:42:32 +0000601 conv_string_to_unicode ,att_type, conv_string_to_unicode ,dflt,
Fred Drake85d835f2001-02-08 15:39:08 +0000602 isrequired))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000603
Martin v. Löwisc847f402003-01-21 11:09:21 +0000604#if XML_COMBINED_VERSION >= 19504
Martin v. Löwis069dde22003-01-21 10:58:18 +0000605VOID_HANDLER(SkippedEntity,
606 (void *userData,
607 const XML_Char *entityName,
608 int is_parameter_entity),
609 ("Ni",
610 string_intern(self, entityName), is_parameter_entity))
Martin v. Löwisc847f402003-01-21 11:09:21 +0000611#endif
Martin v. Löwis069dde22003-01-21 10:58:18 +0000612
Fred Drake71b63ff2002-06-28 22:29:01 +0000613VOID_HANDLER(NotationDecl,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 (void *userData,
615 const XML_Char *notationName,
616 const XML_Char *base,
617 const XML_Char *systemId,
618 const XML_Char *publicId),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000619 ("(NNNN)",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 string_intern(self, notationName), string_intern(self, base),
621 string_intern(self, systemId), string_intern(self, publicId)))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000622
Fred Drake6f987622000-08-25 18:03:30 +0000623VOID_HANDLER(StartNamespaceDecl,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 (void *userData,
625 const XML_Char *prefix,
626 const XML_Char *uri),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000627 ("(NN)",
628 string_intern(self, prefix), string_intern(self, uri)))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000629
Fred Drake6f987622000-08-25 18:03:30 +0000630VOID_HANDLER(EndNamespaceDecl,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 (void *userData,
632 const XML_Char *prefix),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000633 ("(N)", string_intern(self, prefix)))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000634
Fred Drake6f987622000-08-25 18:03:30 +0000635VOID_HANDLER(Comment,
Fred Drakeb91a36b2002-06-27 19:40:48 +0000636 (void *userData, const XML_Char *data),
Guido van Rossum4ca94712007-07-23 17:42:32 +0000637 ("(O&)", conv_string_to_unicode ,data))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000638
Fred Drake6f987622000-08-25 18:03:30 +0000639VOID_HANDLER(StartCdataSection,
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000640 (void *userData),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 ("()"))
Fred Drake71b63ff2002-06-28 22:29:01 +0000642
Fred Drake6f987622000-08-25 18:03:30 +0000643VOID_HANDLER(EndCdataSection,
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000644 (void *userData),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 ("()"))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000646
Fred Drake6f987622000-08-25 18:03:30 +0000647VOID_HANDLER(Default,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 (void *userData, const XML_Char *s, int len),
649 ("(N)", (conv_string_len_to_unicode(s,len))))
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +0000650
Fred Drake6f987622000-08-25 18:03:30 +0000651VOID_HANDLER(DefaultHandlerExpand,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 (void *userData, const XML_Char *s, int len),
653 ("(N)", (conv_string_len_to_unicode(s,len))))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000654
Fred Drake71b63ff2002-06-28 22:29:01 +0000655INT_HANDLER(NotStandalone,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 (void *userData),
657 ("()"))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000658
Fred Drake6f987622000-08-25 18:03:30 +0000659RC_HANDLER(int, ExternalEntityRef,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 (XML_Parser parser,
661 const XML_Char *context,
662 const XML_Char *base,
663 const XML_Char *systemId,
664 const XML_Char *publicId),
665 int rc=0;,
Fred Drakeb91a36b2002-06-27 19:40:48 +0000666 ("(O&NNN)",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 conv_string_to_unicode ,context, string_intern(self, base),
668 string_intern(self, systemId), string_intern(self, publicId)),
669 rc = PyLong_AsLong(rv);, rc,
670 XML_GetUserData(parser))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000671
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000672/* XXX UnknownEncodingHandler */
673
Fred Drake85d835f2001-02-08 15:39:08 +0000674VOID_HANDLER(StartDoctypeDecl,
675 (void *userData, const XML_Char *doctypeName,
676 const XML_Char *sysid, const XML_Char *pubid,
677 int has_internal_subset),
Fred Drakeb91a36b2002-06-27 19:40:48 +0000678 ("(NNNi)", string_intern(self, doctypeName),
679 string_intern(self, sysid), string_intern(self, pubid),
Fred Drake85d835f2001-02-08 15:39:08 +0000680 has_internal_subset))
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000681
682VOID_HANDLER(EndDoctypeDecl, (void *userData), ("()"))
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000683
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000684/* ---------------------------------------------------------------- */
Brett Cannond0aeda82014-08-22 14:23:20 -0400685/*[clinic input]
686class pyexpat.xmlparser "xmlparseobject *" "&Xmlparsetype"
687[clinic start generated code]*/
688/*[clinic end generated code: output=da39a3ee5e6b4b0d input=2393162385232e1c]*/
689
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000690
Fred Drake71b63ff2002-06-28 22:29:01 +0000691static PyObject *
692get_parse_result(xmlparseobject *self, int rv)
693{
694 if (PyErr_Occurred()) {
695 return NULL;
696 }
697 if (rv == 0) {
Martin v. Löwis069dde22003-01-21 10:58:18 +0000698 return set_error(self, XML_GetErrorCode(self->itself));
Fred Drake71b63ff2002-06-28 22:29:01 +0000699 }
Fred Drake2a3d7db2002-06-28 22:56:48 +0000700 if (flush_character_buffer(self) < 0) {
701 return NULL;
702 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000703 return PyLong_FromLong(rv);
Fred Drake71b63ff2002-06-28 22:29:01 +0000704}
705
Serhiy Storchaka43536e92013-02-04 18:26:15 +0200706#define MAX_CHUNK_SIZE (1 << 20)
707
Brett Cannond0aeda82014-08-22 14:23:20 -0400708/*[clinic input]
709pyexpat.xmlparser.Parse
710
711 data: object
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200712 isfinal: bool(accept={int}) = False
Brett Cannond0aeda82014-08-22 14:23:20 -0400713 /
714
715Parse XML data.
716
717`isfinal' should be true at end of input.
718[clinic start generated code]*/
719
Brett Cannond0aeda82014-08-22 14:23:20 -0400720static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -0400721pyexpat_xmlparser_Parse_impl(xmlparseobject *self, PyObject *data,
Serhiy Storchaka8b2e8b62015-05-30 11:30:39 +0300722 int isfinal)
Serhiy Storchaka202fda52017-03-12 10:10:47 +0200723/*[clinic end generated code: output=f4db843dd1f4ed4b input=eb616027bfa9847f]*/
Brett Cannond0aeda82014-08-22 14:23:20 -0400724{
Serhiy Storchaka43536e92013-02-04 18:26:15 +0200725 const char *s;
726 Py_ssize_t slen;
727 Py_buffer view;
728 int rc;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000729
Serhiy Storchaka43536e92013-02-04 18:26:15 +0200730 if (PyUnicode_Check(data)) {
Serhiy Storchaka43536e92013-02-04 18:26:15 +0200731 view.buf = NULL;
Serhiy Storchaka36b365c2013-02-04 18:28:01 +0200732 s = PyUnicode_AsUTF8AndSize(data, &slen);
733 if (s == NULL)
734 return NULL;
Serhiy Storchaka43536e92013-02-04 18:26:15 +0200735 /* Explicitly set UTF-8 encoding. Return code ignored. */
736 (void)XML_SetEncoding(self->itself, "utf-8");
737 }
738 else {
739 if (PyObject_GetBuffer(data, &view, PyBUF_SIMPLE) < 0)
740 return NULL;
741 s = view.buf;
742 slen = view.len;
743 }
744
745 while (slen > MAX_CHUNK_SIZE) {
746 rc = XML_Parse(self->itself, s, MAX_CHUNK_SIZE, 0);
747 if (!rc)
748 goto done;
749 s += MAX_CHUNK_SIZE;
750 slen -= MAX_CHUNK_SIZE;
751 }
Serhiy Storchakafad85aa2015-11-07 15:42:38 +0200752 Py_BUILD_ASSERT(MAX_CHUNK_SIZE <= INT_MAX);
753 assert(slen <= INT_MAX);
Serhiy Storchaka8b2e8b62015-05-30 11:30:39 +0300754 rc = XML_Parse(self->itself, s, (int)slen, isfinal);
Serhiy Storchaka43536e92013-02-04 18:26:15 +0200755
756done:
757 if (view.buf != NULL)
758 PyBuffer_Release(&view);
759 return get_parse_result(self, rc);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000760}
761
Fred Drakeca1f4262000-09-21 20:10:23 +0000762/* File reading copied from cPickle */
763
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000764#define BUF_SIZE 2048
765
Fred Drake0582df92000-07-12 04:49:00 +0000766static int
767readinst(char *buf, int buf_size, PyObject *meth)
768{
Victor Stinner95f1dfc2011-01-10 23:00:36 +0000769 PyObject *str;
770 Py_ssize_t len;
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200771 const char *ptr;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000772
Victor Stinner95f1dfc2011-01-10 23:00:36 +0000773 str = PyObject_CallFunction(meth, "n", buf_size);
Martin v. Löwis9171f022004-10-13 19:50:11 +0000774 if (str == NULL)
Victor Stinner95f1dfc2011-01-10 23:00:36 +0000775 goto error;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000776
Christian Heimes72b710a2008-05-26 13:28:38 +0000777 if (PyBytes_Check(str))
778 ptr = PyBytes_AS_STRING(str);
Christian Heimes9c4756e2008-05-26 13:22:05 +0000779 else if (PyByteArray_Check(str))
780 ptr = PyByteArray_AS_STRING(str);
Guido van Rossum98297ee2007-11-06 21:34:58 +0000781 else {
Fred Drake71b63ff2002-06-28 22:29:01 +0000782 PyErr_Format(PyExc_TypeError,
Guido van Rossum4ca94712007-07-23 17:42:32 +0000783 "read() did not return a bytes object (type=%.400s)",
Christian Heimes90aa7642007-12-19 02:45:37 +0000784 Py_TYPE(str)->tp_name);
Victor Stinner95f1dfc2011-01-10 23:00:36 +0000785 goto error;
Fred Drake0582df92000-07-12 04:49:00 +0000786 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000787 len = Py_SIZE(str);
Fred Drake0582df92000-07-12 04:49:00 +0000788 if (len > buf_size) {
789 PyErr_Format(PyExc_ValueError,
790 "read() returned too much data: "
Victor Stinner9d6f9362011-01-04 22:00:04 +0000791 "%i bytes requested, %zd returned",
Fred Drake0582df92000-07-12 04:49:00 +0000792 buf_size, len);
Victor Stinner95f1dfc2011-01-10 23:00:36 +0000793 goto error;
Fred Drake0582df92000-07-12 04:49:00 +0000794 }
Guido van Rossum98297ee2007-11-06 21:34:58 +0000795 memcpy(buf, ptr, len);
Victor Stinner95f1dfc2011-01-10 23:00:36 +0000796 Py_DECREF(str);
797 /* len <= buf_size <= INT_MAX */
Victor Stinner0fcab4a2011-01-04 12:59:15 +0000798 return (int)len;
Victor Stinner95f1dfc2011-01-10 23:00:36 +0000799
800error:
801 Py_XDECREF(str);
802 return -1;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000803}
804
Brett Cannond0aeda82014-08-22 14:23:20 -0400805/*[clinic input]
806pyexpat.xmlparser.ParseFile
807
808 file: object
809 /
810
811Parse XML data from file-like object.
812[clinic start generated code]*/
813
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000814static PyObject *
Brett Cannond0aeda82014-08-22 14:23:20 -0400815pyexpat_xmlparser_ParseFile(xmlparseobject *self, PyObject *file)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300816/*[clinic end generated code: output=2adc6a13100cc42b input=fbb5a12b6038d735]*/
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000817{
Fred Drake0582df92000-07-12 04:49:00 +0000818 int rv = 1;
Fred Drake0582df92000-07-12 04:49:00 +0000819 PyObject *readmethod = NULL;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200820 _Py_IDENTIFIER(read);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000821
Brett Cannond0aeda82014-08-22 14:23:20 -0400822 readmethod = _PyObject_GetAttrId(file, &PyId_read);
Benjamin Peterson4e7f2852010-08-08 16:54:58 +0000823 if (readmethod == NULL) {
Benjamin Peterson4e7f2852010-08-08 16:54:58 +0000824 PyErr_SetString(PyExc_TypeError,
825 "argument must have 'read' attribute");
826 return NULL;
Fred Drake0582df92000-07-12 04:49:00 +0000827 }
828 for (;;) {
829 int bytes_read;
830 void *buf = XML_GetBuffer(self->itself, BUF_SIZE);
Fred Drake7b6caff2003-07-21 17:05:56 +0000831 if (buf == NULL) {
Fred Drakef239c6d2003-07-21 17:22:43 +0000832 Py_XDECREF(readmethod);
Ned Deilye7d532f2014-03-27 16:39:58 -0700833 return get_parse_result(self, 0);
Fred Drake7b6caff2003-07-21 17:05:56 +0000834 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000835
Benjamin Peterson4e7f2852010-08-08 16:54:58 +0000836 bytes_read = readinst(buf, BUF_SIZE, readmethod);
837 if (bytes_read < 0) {
838 Py_DECREF(readmethod);
839 return NULL;
Fred Drake0582df92000-07-12 04:49:00 +0000840 }
841 rv = XML_ParseBuffer(self->itself, bytes_read, bytes_read == 0);
Fred Drake7b6caff2003-07-21 17:05:56 +0000842 if (PyErr_Occurred()) {
843 Py_XDECREF(readmethod);
Fred Drake0582df92000-07-12 04:49:00 +0000844 return NULL;
Fred Drake7b6caff2003-07-21 17:05:56 +0000845 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000846
Fred Drake0582df92000-07-12 04:49:00 +0000847 if (!rv || bytes_read == 0)
848 break;
849 }
Fred Drake7b6caff2003-07-21 17:05:56 +0000850 Py_XDECREF(readmethod);
Fred Drake71b63ff2002-06-28 22:29:01 +0000851 return get_parse_result(self, rv);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000852}
853
Brett Cannond0aeda82014-08-22 14:23:20 -0400854/*[clinic input]
855pyexpat.xmlparser.SetBase
856
857 base: str
858 /
859
860Set the base URL for the parser.
861[clinic start generated code]*/
862
Brett Cannond0aeda82014-08-22 14:23:20 -0400863static PyObject *
864pyexpat_xmlparser_SetBase_impl(xmlparseobject *self, const char *base)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300865/*[clinic end generated code: output=c212ddceb607b539 input=c684e5de895ee1a8]*/
Brett Cannond0aeda82014-08-22 14:23:20 -0400866{
Fred Drake0582df92000-07-12 04:49:00 +0000867 if (!XML_SetBase(self->itself, base)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 return PyErr_NoMemory();
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000869 }
Brett Cannond0aeda82014-08-22 14:23:20 -0400870 Py_RETURN_NONE;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000871}
872
Brett Cannond0aeda82014-08-22 14:23:20 -0400873/*[clinic input]
874pyexpat.xmlparser.GetBase
875
876Return base URL string for the parser.
877[clinic start generated code]*/
878
Brett Cannond0aeda82014-08-22 14:23:20 -0400879static PyObject *
880pyexpat_xmlparser_GetBase_impl(xmlparseobject *self)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300881/*[clinic end generated code: output=2886cb21f9a8739a input=918d71c38009620e]*/
Fred Drake0582df92000-07-12 04:49:00 +0000882{
Fred Drake0582df92000-07-12 04:49:00 +0000883 return Py_BuildValue("z", XML_GetBase(self->itself));
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +0000884}
885
Brett Cannond0aeda82014-08-22 14:23:20 -0400886/*[clinic input]
887pyexpat.xmlparser.GetInputContext
888
889Return the untranslated text of the input that caused the current event.
890
891If the event was generated by a large amount of text (such as a start tag
892for an element with many attributes), not all of the text may be available.
893[clinic start generated code]*/
894
Brett Cannond0aeda82014-08-22 14:23:20 -0400895static PyObject *
896pyexpat_xmlparser_GetInputContext_impl(xmlparseobject *self)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +0300897/*[clinic end generated code: output=a88026d683fc22cc input=034df8712db68379]*/
Fred Drakebd6101c2001-02-14 18:29:45 +0000898{
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000899 if (self->in_callback) {
900 int offset, size;
901 const char *buffer
902 = XML_GetInputContext(self->itself, &offset, &size);
Fred Drakebd6101c2001-02-14 18:29:45 +0000903
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000904 if (buffer != NULL)
Christian Heimes72b710a2008-05-26 13:28:38 +0000905 return PyBytes_FromStringAndSize(buffer + offset,
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000906 size - offset);
907 else
908 Py_RETURN_NONE;
Fred Drakebd6101c2001-02-14 18:29:45 +0000909 }
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000910 else
911 Py_RETURN_NONE;
Fred Drakebd6101c2001-02-14 18:29:45 +0000912}
Fred Drakebd6101c2001-02-14 18:29:45 +0000913
Brett Cannond0aeda82014-08-22 14:23:20 -0400914/*[clinic input]
915pyexpat.xmlparser.ExternalEntityParserCreate
916
Larry Hastingsdbfdc382015-05-04 06:59:46 -0700917 context: str(accept={str, NoneType})
Brett Cannond0aeda82014-08-22 14:23:20 -0400918 encoding: str = NULL
919 /
920
921Create a parser for parsing an external entity based on the information passed to the ExternalEntityRefHandler.
922[clinic start generated code]*/
923
Brett Cannond0aeda82014-08-22 14:23:20 -0400924static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -0400925pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self,
926 const char *context,
927 const char *encoding)
Larry Hastingsdbfdc382015-05-04 06:59:46 -0700928/*[clinic end generated code: output=535cda9d7a0fbcd6 input=b906714cc122c322]*/
Brett Cannond0aeda82014-08-22 14:23:20 -0400929{
Lars Gustäbel4a30a072000-09-24 20:50:52 +0000930 xmlparseobject *new_parser;
931 int i;
932
Martin v. Löwis894258c2001-09-23 10:20:10 +0000933 new_parser = PyObject_GC_New(xmlparseobject, &Xmlparsetype);
Fred Drake85d835f2001-02-08 15:39:08 +0000934 if (new_parser == NULL)
935 return NULL;
Fred Drake2a3d7db2002-06-28 22:56:48 +0000936 new_parser->buffer_size = self->buffer_size;
937 new_parser->buffer_used = 0;
Victor Stinnerb4ba9862010-09-10 22:25:19 +0000938 new_parser->buffer = NULL;
Fred Drake85d835f2001-02-08 15:39:08 +0000939 new_parser->ordered_attributes = self->ordered_attributes;
940 new_parser->specified_attributes = self->specified_attributes;
Fred Drakebd6101c2001-02-14 18:29:45 +0000941 new_parser->in_callback = 0;
Martin v. Löwis069dde22003-01-21 10:58:18 +0000942 new_parser->ns_prefixes = self->ns_prefixes;
Lars Gustäbel4a30a072000-09-24 20:50:52 +0000943 new_parser->itself = XML_ExternalEntityParserCreate(self->itself, context,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 encoding);
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000945 new_parser->handlers = 0;
Fred Drakeb91a36b2002-06-27 19:40:48 +0000946 new_parser->intern = self->intern;
947 Py_XINCREF(new_parser->intern);
Martin v. Löwis894258c2001-09-23 10:20:10 +0000948 PyObject_GC_Track(new_parser);
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000949
Victor Stinnerb4ba9862010-09-10 22:25:19 +0000950 if (self->buffer != NULL) {
Victor Stinnerb6404912013-07-07 16:21:41 +0200951 new_parser->buffer = PyMem_Malloc(new_parser->buffer_size);
Victor Stinnerb4ba9862010-09-10 22:25:19 +0000952 if (new_parser->buffer == NULL) {
953 Py_DECREF(new_parser);
954 return PyErr_NoMemory();
955 }
956 }
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000957 if (!new_parser->itself) {
Fred Drake85d835f2001-02-08 15:39:08 +0000958 Py_DECREF(new_parser);
959 return PyErr_NoMemory();
Lars Gustäbel4a30a072000-09-24 20:50:52 +0000960 }
961
962 XML_SetUserData(new_parser->itself, (void *)new_parser);
963
964 /* allocate and clear handlers first */
Fred Drake2a3d7db2002-06-28 22:56:48 +0000965 for (i = 0; handler_info[i].name != NULL; i++)
Fred Drake85d835f2001-02-08 15:39:08 +0000966 /* do nothing */;
Lars Gustäbel4a30a072000-09-24 20:50:52 +0000967
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +0200968 new_parser->handlers = PyMem_New(PyObject *, i);
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000969 if (!new_parser->handlers) {
Fred Drake85d835f2001-02-08 15:39:08 +0000970 Py_DECREF(new_parser);
971 return PyErr_NoMemory();
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000972 }
Martin v. Löwis5b68ce32001-10-21 08:53:52 +0000973 clear_handlers(new_parser, 1);
Lars Gustäbel4a30a072000-09-24 20:50:52 +0000974
975 /* then copy handlers from self */
976 for (i = 0; handler_info[i].name != NULL; i++) {
Fred Drake71b63ff2002-06-28 22:29:01 +0000977 PyObject *handler = self->handlers[i];
978 if (handler != NULL) {
979 Py_INCREF(handler);
980 new_parser->handlers[i] = handler;
981 handler_info[i].setter(new_parser->itself,
Fred Drake85d835f2001-02-08 15:39:08 +0000982 handler_info[i].handler);
983 }
Lars Gustäbel4a30a072000-09-24 20:50:52 +0000984 }
Fred Drake71b63ff2002-06-28 22:29:01 +0000985 return (PyObject *)new_parser;
Lars Gustäbel4a30a072000-09-24 20:50:52 +0000986}
987
Brett Cannond0aeda82014-08-22 14:23:20 -0400988/*[clinic input]
989pyexpat.xmlparser.SetParamEntityParsing
Martin v. Löwis0078f6c2001-01-21 10:18:10 +0000990
Brett Cannond0aeda82014-08-22 14:23:20 -0400991 flag: int
992 /
993
994Controls parsing of parameter entities (including the external DTD subset).
995
996Possible flag values are XML_PARAM_ENTITY_PARSING_NEVER,
997XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE and
998XML_PARAM_ENTITY_PARSING_ALWAYS. Returns true if setting the flag
999was successful.
1000[clinic start generated code]*/
1001
Brett Cannond0aeda82014-08-22 14:23:20 -04001002static PyObject *
1003pyexpat_xmlparser_SetParamEntityParsing_impl(xmlparseobject *self, int flag)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001004/*[clinic end generated code: output=18668ee8e760d64c input=8aea19b4b15e9af1]*/
Brett Cannond0aeda82014-08-22 14:23:20 -04001005{
1006 flag = XML_SetParamEntityParsing(self->itself, flag);
Christian Heimes217cfd12007-12-02 14:31:20 +00001007 return PyLong_FromLong(flag);
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001008}
1009
Martin v. Löwisc847f402003-01-21 11:09:21 +00001010
1011#if XML_COMBINED_VERSION >= 19505
Brett Cannond0aeda82014-08-22 14:23:20 -04001012/*[clinic input]
1013pyexpat.xmlparser.UseForeignDTD
1014
1015 flag: bool = True
1016 /
1017
1018Allows the application to provide an artificial external subset if one is not specified as part of the document instance.
1019
1020This readily allows the use of a 'default' document type controlled by the
1021application, while still getting the advantage of providing document type
1022information to the parser. 'flag' defaults to True if not provided.
1023[clinic start generated code]*/
1024
Brett Cannond0aeda82014-08-22 14:23:20 -04001025static PyObject *
1026pyexpat_xmlparser_UseForeignDTD_impl(xmlparseobject *self, int flag)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001027/*[clinic end generated code: output=cfaa9aa50bb0f65c input=78144c519d116a6e]*/
Brett Cannond0aeda82014-08-22 14:23:20 -04001028{
Martin v. Löwis069dde22003-01-21 10:58:18 +00001029 enum XML_Error rc;
Brett Cannond0aeda82014-08-22 14:23:20 -04001030
Antoine Pitrou6f430e42012-08-15 23:18:25 +02001031 rc = XML_UseForeignDTD(self->itself, flag ? XML_TRUE : XML_FALSE);
Martin v. Löwis069dde22003-01-21 10:58:18 +00001032 if (rc != XML_ERROR_NONE) {
1033 return set_error(self, rc);
1034 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001035 Py_RETURN_NONE;
Martin v. Löwis069dde22003-01-21 10:58:18 +00001036}
Martin v. Löwisc847f402003-01-21 11:09:21 +00001037#endif
Martin v. Löwis069dde22003-01-21 10:58:18 +00001038
Brett Cannond0aeda82014-08-22 14:23:20 -04001039/*[clinic input]
1040pyexpat.xmlparser.__dir__
1041[clinic start generated code]*/
1042
Brett Cannond0aeda82014-08-22 14:23:20 -04001043static PyObject *
1044pyexpat_xmlparser___dir___impl(xmlparseobject *self)
Serhiy Storchaka1009bf12015-04-03 23:53:51 +03001045/*[clinic end generated code: output=bc22451efb9e4d17 input=76aa455f2a661384]*/
Brett Cannond0aeda82014-08-22 14:23:20 -04001046{
1047#define APPEND(list, str) \
1048 do { \
1049 PyObject *o = PyUnicode_FromString(str); \
1050 if (o != NULL) \
1051 PyList_Append(list, o); \
1052 Py_XDECREF(o); \
1053 } while (0)
1054
1055 int i;
1056 PyObject *rc = PyList_New(0);
1057 if (!rc)
1058 return NULL;
1059 for (i = 0; handler_info[i].name != NULL; i++) {
1060 PyObject *o = get_handler_name(&handler_info[i]);
1061 if (o != NULL)
1062 PyList_Append(rc, o);
1063 Py_XDECREF(o);
1064 }
1065 APPEND(rc, "ErrorCode");
1066 APPEND(rc, "ErrorLineNumber");
1067 APPEND(rc, "ErrorColumnNumber");
1068 APPEND(rc, "ErrorByteIndex");
1069 APPEND(rc, "CurrentLineNumber");
1070 APPEND(rc, "CurrentColumnNumber");
1071 APPEND(rc, "CurrentByteIndex");
1072 APPEND(rc, "buffer_size");
1073 APPEND(rc, "buffer_text");
1074 APPEND(rc, "buffer_used");
1075 APPEND(rc, "namespace_prefixes");
1076 APPEND(rc, "ordered_attributes");
1077 APPEND(rc, "specified_attributes");
1078 APPEND(rc, "intern");
1079
1080#undef APPEND
1081
1082 if (PyErr_Occurred()) {
1083 Py_DECREF(rc);
1084 rc = NULL;
1085 }
1086
1087 return rc;
1088}
Amaury Forgeot d'Arcba4105c2008-07-02 21:41:01 +00001089
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001090static struct PyMethodDef xmlparse_methods[] = {
Brett Cannond0aeda82014-08-22 14:23:20 -04001091 PYEXPAT_XMLPARSER_PARSE_METHODDEF
1092 PYEXPAT_XMLPARSER_PARSEFILE_METHODDEF
1093 PYEXPAT_XMLPARSER_SETBASE_METHODDEF
1094 PYEXPAT_XMLPARSER_GETBASE_METHODDEF
1095 PYEXPAT_XMLPARSER_GETINPUTCONTEXT_METHODDEF
1096 PYEXPAT_XMLPARSER_EXTERNALENTITYPARSERCREATE_METHODDEF
1097 PYEXPAT_XMLPARSER_SETPARAMENTITYPARSING_METHODDEF
Martin v. Löwisc847f402003-01-21 11:09:21 +00001098#if XML_COMBINED_VERSION >= 19505
Brett Cannond0aeda82014-08-22 14:23:20 -04001099 PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF
Martin v. Löwisc847f402003-01-21 11:09:21 +00001100#endif
Brett Cannond0aeda82014-08-22 14:23:20 -04001101 PYEXPAT_XMLPARSER___DIR___METHODDEF
1102 {NULL, NULL} /* sentinel */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001103};
1104
1105/* ---------- */
1106
1107
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001108
Fred Drake71b63ff2002-06-28 22:29:01 +00001109/* pyexpat international encoding support.
1110 Make it as simple as possible.
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001111*/
1112
Fred Drake71b63ff2002-06-28 22:29:01 +00001113static int
1114PyUnknownEncodingHandler(void *encodingHandlerData,
1115 const XML_Char *name,
1116 XML_Encoding *info)
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001117{
Eli Bendersky6dc32b32013-05-25 05:25:48 -07001118 static unsigned char template_buffer[256] = {0};
1119 PyObject* u;
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001120 int i;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001121 void *data;
Eli Bendersky6dc32b32013-05-25 05:25:48 -07001122 unsigned int kind;
Fred Drake71b63ff2002-06-28 22:29:01 +00001123
Victor Stinner9e09c262013-07-18 23:17:01 +02001124 if (PyErr_Occurred())
1125 return XML_STATUS_ERROR;
1126
Eli Bendersky6dc32b32013-05-25 05:25:48 -07001127 if (template_buffer[1] == 0) {
1128 for (i = 0; i < 256; i++)
1129 template_buffer[i] = i;
Tim Peters63cb99e2001-02-17 18:12:50 +00001130 }
Eli Bendersky6dc32b32013-05-25 05:25:48 -07001131
1132 u = PyUnicode_Decode((char*) template_buffer, 256, name, "replace");
Christian Heimesb5821552013-06-29 20:43:13 +02001133 if (u == NULL || PyUnicode_READY(u)) {
Christian Heimes72172422013-06-29 21:49:27 +02001134 Py_XDECREF(u);
Eli Bendersky6dc32b32013-05-25 05:25:48 -07001135 return XML_STATUS_ERROR;
Christian Heimesb5821552013-06-29 20:43:13 +02001136 }
Eli Bendersky6dc32b32013-05-25 05:25:48 -07001137
1138 if (PyUnicode_GET_LENGTH(u) != 256) {
1139 Py_DECREF(u);
1140 PyErr_SetString(PyExc_ValueError,
1141 "multi-byte encodings are not supported");
1142 return XML_STATUS_ERROR;
1143 }
1144
1145 kind = PyUnicode_KIND(u);
1146 data = PyUnicode_DATA(u);
1147 for (i = 0; i < 256; i++) {
1148 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
1149 if (ch != Py_UNICODE_REPLACEMENT_CHARACTER)
1150 info->map[i] = ch;
1151 else
1152 info->map[i] = -1;
1153 }
1154
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001155 info->data = NULL;
1156 info->convert = NULL;
1157 info->release = NULL;
Eli Bendersky6dc32b32013-05-25 05:25:48 -07001158 Py_DECREF(u);
1159
1160 return XML_STATUS_OK;
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001161}
1162
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001163
1164static PyObject *
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03001165newxmlparseobject(const char *encoding, const char *namespace_separator, PyObject *intern)
Fred Drake0582df92000-07-12 04:49:00 +00001166{
1167 int i;
1168 xmlparseobject *self;
Fred Drake71b63ff2002-06-28 22:29:01 +00001169
Martin v. Löwis894258c2001-09-23 10:20:10 +00001170 self = PyObject_GC_New(xmlparseobject, &Xmlparsetype);
Fred Drake0582df92000-07-12 04:49:00 +00001171 if (self == NULL)
1172 return NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001173
Fred Drake2a3d7db2002-06-28 22:56:48 +00001174 self->buffer = NULL;
1175 self->buffer_size = CHARACTER_DATA_BUFFER_SIZE;
1176 self->buffer_used = 0;
Fred Drake85d835f2001-02-08 15:39:08 +00001177 self->ordered_attributes = 0;
1178 self->specified_attributes = 0;
Fred Drakebd6101c2001-02-14 18:29:45 +00001179 self->in_callback = 0;
Martin v. Löwis069dde22003-01-21 10:58:18 +00001180 self->ns_prefixes = 0;
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001181 self->handlers = NULL;
Victor Stinner54b2d2e2013-07-15 17:15:57 +02001182 self->intern = intern;
1183 Py_XINCREF(self->intern);
1184 PyObject_GC_Track(self);
1185
Christian Heimesfa535f52013-07-07 17:35:11 +02001186 /* namespace_separator is either NULL or contains one char + \0 */
1187 self->itself = XML_ParserCreate_MM(encoding, &ExpatMemoryHandler,
1188 namespace_separator);
Victor Stinner54b2d2e2013-07-15 17:15:57 +02001189 if (self->itself == NULL) {
1190 PyErr_SetString(PyExc_RuntimeError,
1191 "XML_ParserCreate failed");
1192 Py_DECREF(self);
1193 return NULL;
1194 }
Victor Stinner23ec4b52017-06-15 00:54:36 +02001195#if XML_COMBINED_VERSION >= 20100
1196 /* This feature was added upstream in libexpat 2.1.0. */
Gregory P. Smith8e91cf62012-03-14 14:26:55 -07001197 XML_SetHashSalt(self->itself,
Christian Heimes985ecdc2013-11-20 11:46:18 +01001198 (unsigned long)_Py_HashSecret.expat.hashsalt);
Gregory P. Smith25227712012-03-14 18:10:37 -07001199#endif
Fred Drake0582df92000-07-12 04:49:00 +00001200 XML_SetUserData(self->itself, (void *)self);
Fred Drake7c75bf22002-07-01 14:02:31 +00001201 XML_SetUnknownEncodingHandler(self->itself,
1202 (XML_UnknownEncodingHandler) PyUnknownEncodingHandler, NULL);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001203
Fred Drake2a3d7db2002-06-28 22:56:48 +00001204 for (i = 0; handler_info[i].name != NULL; i++)
Fred Drake0582df92000-07-12 04:49:00 +00001205 /* do nothing */;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001206
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001207 self->handlers = PyMem_New(PyObject *, i);
Fred Drake7c75bf22002-07-01 14:02:31 +00001208 if (!self->handlers) {
Fred Drake71b63ff2002-06-28 22:29:01 +00001209 Py_DECREF(self);
1210 return PyErr_NoMemory();
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001211 }
Martin v. Löwis5b68ce32001-10-21 08:53:52 +00001212 clear_handlers(self, 1);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001213
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001214 return (PyObject*)self;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001215}
1216
1217
1218static void
Fred Drake0582df92000-07-12 04:49:00 +00001219xmlparse_dealloc(xmlparseobject *self)
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001220{
Fred Drake0582df92000-07-12 04:49:00 +00001221 int i;
Martin v. Löwis894258c2001-09-23 10:20:10 +00001222 PyObject_GC_UnTrack(self);
Fred Drake85d835f2001-02-08 15:39:08 +00001223 if (self->itself != NULL)
Fred Drake0582df92000-07-12 04:49:00 +00001224 XML_ParserFree(self->itself);
1225 self->itself = NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001226
Fred Drake85d835f2001-02-08 15:39:08 +00001227 if (self->handlers != NULL) {
Serhiy Storchaka1ed017a2015-12-27 15:51:32 +02001228 for (i = 0; handler_info[i].name != NULL; i++)
1229 Py_CLEAR(self->handlers[i]);
Victor Stinnerb6404912013-07-07 16:21:41 +02001230 PyMem_Free(self->handlers);
Fred Drake71b63ff2002-06-28 22:29:01 +00001231 self->handlers = NULL;
Fred Drake0582df92000-07-12 04:49:00 +00001232 }
Fred Drake2a3d7db2002-06-28 22:56:48 +00001233 if (self->buffer != NULL) {
Victor Stinnerb6404912013-07-07 16:21:41 +02001234 PyMem_Free(self->buffer);
Fred Drake2a3d7db2002-06-28 22:56:48 +00001235 self->buffer = NULL;
1236 }
Fred Drakeb91a36b2002-06-27 19:40:48 +00001237 Py_XDECREF(self->intern);
Martin v. Löwis894258c2001-09-23 10:20:10 +00001238 PyObject_GC_Del(self);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001239}
1240
Fred Drake0582df92000-07-12 04:49:00 +00001241static int
Alexander Belopolskye239d232010-12-08 23:31:48 +00001242handlername2int(PyObject *name)
Fred Drake0582df92000-07-12 04:49:00 +00001243{
1244 int i;
Fred Drake71b63ff2002-06-28 22:29:01 +00001245 for (i = 0; handler_info[i].name != NULL; i++) {
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001246 if (_PyUnicode_EqualToASCIIString(name, handler_info[i].name)) {
Fred Drake0582df92000-07-12 04:49:00 +00001247 return i;
1248 }
1249 }
1250 return -1;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001251}
1252
1253static PyObject *
Fred Drake71b63ff2002-06-28 22:29:01 +00001254get_pybool(int istrue)
1255{
1256 PyObject *result = istrue ? Py_True : Py_False;
1257 Py_INCREF(result);
1258 return result;
1259}
1260
1261static PyObject *
Amaury Forgeot d'Arcba4105c2008-07-02 21:41:01 +00001262xmlparse_getattro(xmlparseobject *self, PyObject *nameobj)
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001263{
Victor Stinner9e5bd6c2011-10-01 01:05:40 +02001264 Py_UCS4 first_char;
Amaury Forgeot d'Arcba4105c2008-07-02 21:41:01 +00001265 int handlernum = -1;
1266
Alexander Belopolskye239d232010-12-08 23:31:48 +00001267 if (!PyUnicode_Check(nameobj))
1268 goto generic;
Victor Stinner9e5bd6c2011-10-01 01:05:40 +02001269 if (PyUnicode_READY(nameobj))
1270 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271
Alexander Belopolskye239d232010-12-08 23:31:48 +00001272 handlernum = handlername2int(nameobj);
Fred Drake71b63ff2002-06-28 22:29:01 +00001273
1274 if (handlernum != -1) {
1275 PyObject *result = self->handlers[handlernum];
1276 if (result == NULL)
1277 result = Py_None;
1278 Py_INCREF(result);
1279 return result;
1280 }
Alexander Belopolskye239d232010-12-08 23:31:48 +00001281
Victor Stinner9e5bd6c2011-10-01 01:05:40 +02001282 first_char = PyUnicode_READ_CHAR(nameobj, 0);
1283 if (first_char == 'E') {
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001284 if (_PyUnicode_EqualToASCIIString(nameobj, "ErrorCode"))
Christian Heimes217cfd12007-12-02 14:31:20 +00001285 return PyLong_FromLong((long)
Fred Drake71b63ff2002-06-28 22:29:01 +00001286 XML_GetErrorCode(self->itself));
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001287 if (_PyUnicode_EqualToASCIIString(nameobj, "ErrorLineNumber"))
Christian Heimes217cfd12007-12-02 14:31:20 +00001288 return PyLong_FromLong((long)
Fred Drake71b63ff2002-06-28 22:29:01 +00001289 XML_GetErrorLineNumber(self->itself));
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001290 if (_PyUnicode_EqualToASCIIString(nameobj, "ErrorColumnNumber"))
Christian Heimes217cfd12007-12-02 14:31:20 +00001291 return PyLong_FromLong((long)
Fred Drake71b63ff2002-06-28 22:29:01 +00001292 XML_GetErrorColumnNumber(self->itself));
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001293 if (_PyUnicode_EqualToASCIIString(nameobj, "ErrorByteIndex"))
Christian Heimes217cfd12007-12-02 14:31:20 +00001294 return PyLong_FromLong((long)
Fred Drake71b63ff2002-06-28 22:29:01 +00001295 XML_GetErrorByteIndex(self->itself));
1296 }
Victor Stinner9e5bd6c2011-10-01 01:05:40 +02001297 if (first_char == 'C') {
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001298 if (_PyUnicode_EqualToASCIIString(nameobj, "CurrentLineNumber"))
Christian Heimes217cfd12007-12-02 14:31:20 +00001299 return PyLong_FromLong((long)
Dave Cole3203efb2004-08-26 00:37:31 +00001300 XML_GetCurrentLineNumber(self->itself));
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001301 if (_PyUnicode_EqualToASCIIString(nameobj, "CurrentColumnNumber"))
Christian Heimes217cfd12007-12-02 14:31:20 +00001302 return PyLong_FromLong((long)
Dave Cole3203efb2004-08-26 00:37:31 +00001303 XML_GetCurrentColumnNumber(self->itself));
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001304 if (_PyUnicode_EqualToASCIIString(nameobj, "CurrentByteIndex"))
Christian Heimes217cfd12007-12-02 14:31:20 +00001305 return PyLong_FromLong((long)
Dave Cole3203efb2004-08-26 00:37:31 +00001306 XML_GetCurrentByteIndex(self->itself));
1307 }
Victor Stinner9e5bd6c2011-10-01 01:05:40 +02001308 if (first_char == 'b') {
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001309 if (_PyUnicode_EqualToASCIIString(nameobj, "buffer_size"))
Christian Heimes217cfd12007-12-02 14:31:20 +00001310 return PyLong_FromLong((long) self->buffer_size);
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001311 if (_PyUnicode_EqualToASCIIString(nameobj, "buffer_text"))
Fred Drake2a3d7db2002-06-28 22:56:48 +00001312 return get_pybool(self->buffer != NULL);
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001313 if (_PyUnicode_EqualToASCIIString(nameobj, "buffer_used"))
Christian Heimes217cfd12007-12-02 14:31:20 +00001314 return PyLong_FromLong((long) self->buffer_used);
Fred Drake2a3d7db2002-06-28 22:56:48 +00001315 }
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001316 if (_PyUnicode_EqualToASCIIString(nameobj, "namespace_prefixes"))
Martin v. Löwis069dde22003-01-21 10:58:18 +00001317 return get_pybool(self->ns_prefixes);
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001318 if (_PyUnicode_EqualToASCIIString(nameobj, "ordered_attributes"))
Fred Drake71b63ff2002-06-28 22:29:01 +00001319 return get_pybool(self->ordered_attributes);
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001320 if (_PyUnicode_EqualToASCIIString(nameobj, "specified_attributes"))
Fred Drake71b63ff2002-06-28 22:29:01 +00001321 return get_pybool((long) self->specified_attributes);
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001322 if (_PyUnicode_EqualToASCIIString(nameobj, "intern")) {
Fred Drakeb91a36b2002-06-27 19:40:48 +00001323 if (self->intern == NULL) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001324 Py_RETURN_NONE;
Fred Drakeb91a36b2002-06-27 19:40:48 +00001325 }
1326 else {
1327 Py_INCREF(self->intern);
1328 return self->intern;
1329 }
1330 }
Alexander Belopolskye239d232010-12-08 23:31:48 +00001331 generic:
Amaury Forgeot d'Arcba4105c2008-07-02 21:41:01 +00001332 return PyObject_GenericGetAttr((PyObject*)self, nameobj);
Neal Norwitz8dfc4a92007-08-11 06:39:53 +00001333}
1334
Fred Drake6f987622000-08-25 18:03:30 +00001335static int
Alexander Belopolskye239d232010-12-08 23:31:48 +00001336sethandler(xmlparseobject *self, PyObject *name, PyObject* v)
Fred Drake0582df92000-07-12 04:49:00 +00001337{
1338 int handlernum = handlername2int(name);
Fred Drake71b63ff2002-06-28 22:29:01 +00001339 if (handlernum >= 0) {
1340 xmlhandler c_handler = NULL;
Fred Drake71b63ff2002-06-28 22:29:01 +00001341
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001342 if (v == Py_None) {
1343 /* If this is the character data handler, and a character
1344 data handler is already active, we need to be more
1345 careful. What we can safely do is replace the existing
1346 character data handler callback function with a no-op
1347 function that will refuse to call Python. The downside
1348 is that this doesn't completely remove the character
1349 data handler from the C layer if there's any callback
1350 active, so Expat does a little more work than it
1351 otherwise would, but that's really an odd case. A more
1352 elaborate system of handlers and state could remove the
1353 C handler more effectively. */
1354 if (handlernum == CharacterData && self->in_callback)
1355 c_handler = noop_character_data_handler;
Fred Drake71b63ff2002-06-28 22:29:01 +00001356 v = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001357 }
Fred Drake71b63ff2002-06-28 22:29:01 +00001358 else if (v != NULL) {
1359 Py_INCREF(v);
1360 c_handler = handler_info[handlernum].handler;
1361 }
Serhiy Storchakaec397562016-04-06 09:50:03 +03001362 Py_XSETREF(self->handlers[handlernum], v);
Fred Drake71b63ff2002-06-28 22:29:01 +00001363 handler_info[handlernum].setter(self->itself, c_handler);
Fred Drake0582df92000-07-12 04:49:00 +00001364 return 1;
1365 }
1366 return 0;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001367}
1368
1369static int
Alexander Belopolskye239d232010-12-08 23:31:48 +00001370xmlparse_setattro(xmlparseobject *self, PyObject *name, PyObject *v)
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001371{
Fred Drake6f987622000-08-25 18:03:30 +00001372 /* Set attribute 'name' to value 'v'. v==NULL means delete */
Serhiy Storchaka931331a2015-09-07 22:37:02 +03001373 if (!PyUnicode_Check(name)) {
1374 PyErr_Format(PyExc_TypeError,
1375 "attribute name must be string, not '%.200s'",
1376 name->ob_type->tp_name);
1377 return -1;
1378 }
Fred Drake85d835f2001-02-08 15:39:08 +00001379 if (v == NULL) {
Fred Drake6f987622000-08-25 18:03:30 +00001380 PyErr_SetString(PyExc_RuntimeError, "Cannot delete attribute");
1381 return -1;
1382 }
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001383 if (_PyUnicode_EqualToASCIIString(name, "buffer_text")) {
Antoine Pitrou6f430e42012-08-15 23:18:25 +02001384 int b = PyObject_IsTrue(v);
1385 if (b < 0)
1386 return -1;
1387 if (b) {
Fred Drake2a3d7db2002-06-28 22:56:48 +00001388 if (self->buffer == NULL) {
Victor Stinnerb6404912013-07-07 16:21:41 +02001389 self->buffer = PyMem_Malloc(self->buffer_size);
Fred Drake2a3d7db2002-06-28 22:56:48 +00001390 if (self->buffer == NULL) {
1391 PyErr_NoMemory();
1392 return -1;
1393 }
1394 self->buffer_used = 0;
1395 }
1396 }
1397 else if (self->buffer != NULL) {
1398 if (flush_character_buffer(self) < 0)
1399 return -1;
Victor Stinnerb6404912013-07-07 16:21:41 +02001400 PyMem_Free(self->buffer);
Fred Drake2a3d7db2002-06-28 22:56:48 +00001401 self->buffer = NULL;
1402 }
1403 return 0;
1404 }
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001405 if (_PyUnicode_EqualToASCIIString(name, "namespace_prefixes")) {
Antoine Pitrou6f430e42012-08-15 23:18:25 +02001406 int b = PyObject_IsTrue(v);
1407 if (b < 0)
1408 return -1;
1409 self->ns_prefixes = b;
Martin v. Löwis069dde22003-01-21 10:58:18 +00001410 XML_SetReturnNSTriplet(self->itself, self->ns_prefixes);
1411 return 0;
1412 }
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001413 if (_PyUnicode_EqualToASCIIString(name, "ordered_attributes")) {
Antoine Pitrou6f430e42012-08-15 23:18:25 +02001414 int b = PyObject_IsTrue(v);
1415 if (b < 0)
1416 return -1;
1417 self->ordered_attributes = b;
Fred Drake85d835f2001-02-08 15:39:08 +00001418 return 0;
1419 }
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001420 if (_PyUnicode_EqualToASCIIString(name, "specified_attributes")) {
Antoine Pitrou6f430e42012-08-15 23:18:25 +02001421 int b = PyObject_IsTrue(v);
1422 if (b < 0)
1423 return -1;
1424 self->specified_attributes = b;
Fred Drake6f987622000-08-25 18:03:30 +00001425 return 0;
1426 }
Christian Heimes2380ac72008-01-09 00:17:24 +00001427
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001428 if (_PyUnicode_EqualToASCIIString(name, "buffer_size")) {
Christian Heimes2380ac72008-01-09 00:17:24 +00001429 long new_buffer_size;
1430 if (!PyLong_Check(v)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 PyErr_SetString(PyExc_TypeError, "buffer_size must be an integer");
1432 return -1;
Christian Heimes2380ac72008-01-09 00:17:24 +00001433 }
1434
Serhiy Storchakade5f9f42015-09-07 22:51:56 +03001435 new_buffer_size = PyLong_AsLong(v);
1436 if (new_buffer_size <= 0) {
1437 if (!PyErr_Occurred())
1438 PyErr_SetString(PyExc_ValueError, "buffer_size must be greater than zero");
1439 return -1;
1440 }
1441
Christian Heimes2380ac72008-01-09 00:17:24 +00001442 /* trivial case -- no change */
1443 if (new_buffer_size == self->buffer_size) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 return 0;
Christian Heimes2380ac72008-01-09 00:17:24 +00001445 }
1446
Christian Heimes2380ac72008-01-09 00:17:24 +00001447 /* check maximum */
1448 if (new_buffer_size > INT_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 char errmsg[100];
1450 sprintf(errmsg, "buffer_size must not be greater than %i", INT_MAX);
1451 PyErr_SetString(PyExc_ValueError, errmsg);
1452 return -1;
Christian Heimes2380ac72008-01-09 00:17:24 +00001453 }
1454
1455 if (self->buffer != NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 /* there is already a buffer */
1457 if (self->buffer_used != 0) {
Christian Heimes09994a92013-07-20 22:41:58 +02001458 if (flush_character_buffer(self) < 0) {
1459 return -1;
1460 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 }
1462 /* free existing buffer */
Victor Stinnerb6404912013-07-07 16:21:41 +02001463 PyMem_Free(self->buffer);
Christian Heimes2380ac72008-01-09 00:17:24 +00001464 }
Victor Stinnerb6404912013-07-07 16:21:41 +02001465 self->buffer = PyMem_Malloc(new_buffer_size);
Christian Heimes2380ac72008-01-09 00:17:24 +00001466 if (self->buffer == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 PyErr_NoMemory();
1468 return -1;
1469 }
Christian Heimes2380ac72008-01-09 00:17:24 +00001470 self->buffer_size = new_buffer_size;
1471 return 0;
1472 }
1473
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +02001474 if (_PyUnicode_EqualToASCIIString(name, "CharacterDataHandler")) {
Fred Drake2a3d7db2002-06-28 22:56:48 +00001475 /* If we're changing the character data handler, flush all
1476 * cached data with the old handler. Not sure there's a
1477 * "right" thing to do, though, but this probably won't
1478 * happen.
1479 */
1480 if (flush_character_buffer(self) < 0)
1481 return -1;
1482 }
Fred Drake6f987622000-08-25 18:03:30 +00001483 if (sethandler(self, name, v)) {
1484 return 0;
1485 }
Alexander Belopolskye239d232010-12-08 23:31:48 +00001486 PyErr_SetObject(PyExc_AttributeError, name);
Fred Drake6f987622000-08-25 18:03:30 +00001487 return -1;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001488}
1489
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001490static int
1491xmlparse_traverse(xmlparseobject *op, visitproc visit, void *arg)
1492{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001493 int i;
1494 for (i = 0; handler_info[i].name != NULL; i++)
1495 Py_VISIT(op->handlers[i]);
Fred Drakecde79132001-04-25 16:01:30 +00001496 return 0;
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001497}
1498
1499static int
1500xmlparse_clear(xmlparseobject *op)
1501{
Martin v. Löwis5b68ce32001-10-21 08:53:52 +00001502 clear_handlers(op, 0);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001503 Py_CLEAR(op->intern);
Fred Drakecde79132001-04-25 16:01:30 +00001504 return 0;
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001505}
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001506
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001507PyDoc_STRVAR(Xmlparsetype__doc__, "XML parser");
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001508
1509static PyTypeObject Xmlparsetype = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 PyVarObject_HEAD_INIT(NULL, 0)
1511 "pyexpat.xmlparser", /*tp_name*/
Antoine Pitrou23683ef2011-01-04 00:00:31 +00001512 sizeof(xmlparseobject), /*tp_basicsize*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 0, /*tp_itemsize*/
1514 /* methods */
1515 (destructor)xmlparse_dealloc, /*tp_dealloc*/
1516 (printfunc)0, /*tp_print*/
1517 0, /*tp_getattr*/
Alexander Belopolskye239d232010-12-08 23:31:48 +00001518 0, /*tp_setattr*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 0, /*tp_reserved*/
1520 (reprfunc)0, /*tp_repr*/
1521 0, /*tp_as_number*/
1522 0, /*tp_as_sequence*/
1523 0, /*tp_as_mapping*/
1524 (hashfunc)0, /*tp_hash*/
1525 (ternaryfunc)0, /*tp_call*/
1526 (reprfunc)0, /*tp_str*/
1527 (getattrofunc)xmlparse_getattro, /* tp_getattro */
Alexander Belopolskye239d232010-12-08 23:31:48 +00001528 (setattrofunc)xmlparse_setattro, /* tp_setattro */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 0, /* tp_as_buffer */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 Xmlparsetype__doc__, /* tp_doc - Documentation string */
1532 (traverseproc)xmlparse_traverse, /* tp_traverse */
1533 (inquiry)xmlparse_clear, /* tp_clear */
1534 0, /* tp_richcompare */
1535 0, /* tp_weaklistoffset */
1536 0, /* tp_iter */
1537 0, /* tp_iternext */
1538 xmlparse_methods, /* tp_methods */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001539};
1540
1541/* End of code for xmlparser objects */
1542/* -------------------------------------------------------- */
1543
Brett Cannond0aeda82014-08-22 14:23:20 -04001544/*[clinic input]
1545pyexpat.ParserCreate
1546
Larry Hastingsdbfdc382015-05-04 06:59:46 -07001547 encoding: str(accept={str, NoneType}) = NULL
1548 namespace_separator: str(accept={str, NoneType}) = NULL
Brett Cannond0aeda82014-08-22 14:23:20 -04001549 intern: object = NULL
1550
1551Return a new XML parser object.
1552[clinic start generated code]*/
1553
Brett Cannond0aeda82014-08-22 14:23:20 -04001554static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001555pyexpat_ParserCreate_impl(PyObject *module, const char *encoding,
Larry Hastings89964c42015-04-14 18:07:59 -04001556 const char *namespace_separator, PyObject *intern)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001557/*[clinic end generated code: output=295c0cf01ab1146c input=23d29704acad385d]*/
Brett Cannond0aeda82014-08-22 14:23:20 -04001558{
Fred Drakeb91a36b2002-06-27 19:40:48 +00001559 PyObject *result;
1560 int intern_decref = 0;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001561
Fred Drakecde79132001-04-25 16:01:30 +00001562 if (namespace_separator != NULL
1563 && strlen(namespace_separator) > 1) {
1564 PyErr_SetString(PyExc_ValueError,
1565 "namespace_separator must be at most one"
1566 " character, omitted, or None");
1567 return NULL;
1568 }
Fred Drakeb91a36b2002-06-27 19:40:48 +00001569 /* Explicitly passing None means no interning is desired.
1570 Not passing anything means that a new dictionary is used. */
1571 if (intern == Py_None)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 intern = NULL;
Fred Drakeb91a36b2002-06-27 19:40:48 +00001573 else if (intern == NULL) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 intern = PyDict_New();
1575 if (!intern)
1576 return NULL;
1577 intern_decref = 1;
Fred Drake71b63ff2002-06-28 22:29:01 +00001578 }
Fred Drakeb91a36b2002-06-27 19:40:48 +00001579 else if (!PyDict_Check(intern)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 PyErr_SetString(PyExc_TypeError, "intern must be a dictionary");
1581 return NULL;
Fred Drakeb91a36b2002-06-27 19:40:48 +00001582 }
1583
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03001584 result = newxmlparseobject(encoding, namespace_separator, intern);
Fred Drakeb91a36b2002-06-27 19:40:48 +00001585 if (intern_decref) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 Py_DECREF(intern);
Fred Drakeb91a36b2002-06-27 19:40:48 +00001587 }
1588 return result;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001589}
1590
Brett Cannond0aeda82014-08-22 14:23:20 -04001591/*[clinic input]
1592pyexpat.ErrorString
1593
1594 code: long
1595 /
1596
1597Returns string error for given number.
1598[clinic start generated code]*/
1599
Brett Cannond0aeda82014-08-22 14:23:20 -04001600static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001601pyexpat_ErrorString_impl(PyObject *module, long code)
1602/*[clinic end generated code: output=2feae50d166f2174 input=cc67de010d9e62b3]*/
Brett Cannond0aeda82014-08-22 14:23:20 -04001603{
Fred Drake0582df92000-07-12 04:49:00 +00001604 return Py_BuildValue("z", XML_ErrorString((int)code));
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001605}
1606
1607/* List of methods defined in the module */
1608
1609static struct PyMethodDef pyexpat_methods[] = {
Brett Cannond0aeda82014-08-22 14:23:20 -04001610 PYEXPAT_PARSERCREATE_METHODDEF
1611 PYEXPAT_ERRORSTRING_METHODDEF
1612 {NULL, NULL} /* sentinel */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001613};
1614
Andrew M. Kuchlingbeba0562000-06-27 00:33:30 +00001615/* Module docstring */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001616
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001617PyDoc_STRVAR(pyexpat_module_documentation,
1618"Python wrapper for Expat parser.");
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001619
Fred Drakecde79132001-04-25 16:01:30 +00001620/* Initialization function for the module */
1621
1622#ifndef MODULE_NAME
1623#define MODULE_NAME "pyexpat"
1624#endif
1625
1626#ifndef MODULE_INITFUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00001627#define MODULE_INITFUNC PyInit_pyexpat
Fred Drakecde79132001-04-25 16:01:30 +00001628#endif
1629
Martin v. Löwis1a214512008-06-11 05:26:20 +00001630static struct PyModuleDef pyexpatmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 PyModuleDef_HEAD_INIT,
1632 MODULE_NAME,
1633 pyexpat_module_documentation,
1634 -1,
1635 pyexpat_methods,
1636 NULL,
1637 NULL,
1638 NULL,
1639 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001640};
1641
Martin v. Löwis069dde22003-01-21 10:58:18 +00001642PyMODINIT_FUNC
1643MODULE_INITFUNC(void)
Fred Drake0582df92000-07-12 04:49:00 +00001644{
1645 PyObject *m, *d;
Neal Norwitz392c5be2007-08-25 17:20:32 +00001646 PyObject *errmod_name = PyUnicode_FromString(MODULE_NAME ".errors");
Fred Drake85d835f2001-02-08 15:39:08 +00001647 PyObject *errors_module;
1648 PyObject *modelmod_name;
1649 PyObject *model_module;
Georg Brandlb4dac712010-10-15 14:46:48 +00001650 PyObject *tmpnum, *tmpstr;
1651 PyObject *codes_dict;
1652 PyObject *rev_codes_dict;
1653 int res;
Fredrik Lundhd7a42882005-12-13 20:43:04 +00001654 static struct PyExpat_CAPI capi;
Georg Brandlb4dac712010-10-15 14:46:48 +00001655 PyObject *capi_object;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001656
Fred Drake6f987622000-08-25 18:03:30 +00001657 if (errmod_name == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001658 return NULL;
Neal Norwitz392c5be2007-08-25 17:20:32 +00001659 modelmod_name = PyUnicode_FromString(MODULE_NAME ".model");
Fred Drake85d835f2001-02-08 15:39:08 +00001660 if (modelmod_name == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001661 return NULL;
Fred Drake6f987622000-08-25 18:03:30 +00001662
Amaury Forgeot d'Arcba4105c2008-07-02 21:41:01 +00001663 if (PyType_Ready(&Xmlparsetype) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 return NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001665
Fred Drake0582df92000-07-12 04:49:00 +00001666 /* Create the module and add the functions */
Martin v. Löwis1a214512008-06-11 05:26:20 +00001667 m = PyModule_Create(&pyexpatmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001668 if (m == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 return NULL;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001670
Fred Drake0582df92000-07-12 04:49:00 +00001671 /* Add some symbolic constants to the module */
Fred Drakebd6101c2001-02-14 18:29:45 +00001672 if (ErrorObject == NULL) {
1673 ErrorObject = PyErr_NewException("xml.parsers.expat.ExpatError",
Fred Drake93adb692000-09-23 04:55:48 +00001674 NULL, NULL);
Fred Drakebd6101c2001-02-14 18:29:45 +00001675 if (ErrorObject == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001676 return NULL;
Fred Drakebd6101c2001-02-14 18:29:45 +00001677 }
1678 Py_INCREF(ErrorObject);
Fred Drake93adb692000-09-23 04:55:48 +00001679 PyModule_AddObject(m, "error", ErrorObject);
Fred Drakebd6101c2001-02-14 18:29:45 +00001680 Py_INCREF(ErrorObject);
1681 PyModule_AddObject(m, "ExpatError", ErrorObject);
Fred Drake4ba298c2000-10-29 04:57:53 +00001682 Py_INCREF(&Xmlparsetype);
1683 PyModule_AddObject(m, "XMLParserType", (PyObject *) &Xmlparsetype);
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001684
Fred Drake738293d2000-12-21 17:25:07 +00001685 PyModule_AddStringConstant(m, "EXPAT_VERSION",
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03001686 XML_ExpatVersion());
Fred Drake85d835f2001-02-08 15:39:08 +00001687 {
1688 XML_Expat_Version info = XML_ExpatVersionInfo();
1689 PyModule_AddObject(m, "version_info",
1690 Py_BuildValue("(iii)", info.major,
1691 info.minor, info.micro));
1692 }
Fred Drake0582df92000-07-12 04:49:00 +00001693 /* XXX When Expat supports some way of figuring out how it was
Fred Drake71b63ff2002-06-28 22:29:01 +00001694 compiled, this should check and set native_encoding
1695 appropriately.
Fred Drake0582df92000-07-12 04:49:00 +00001696 */
Fred Drake93adb692000-09-23 04:55:48 +00001697 PyModule_AddStringConstant(m, "native_encoding", "UTF-8");
Fred Drakec23b5232000-08-24 21:57:43 +00001698
Fred Drake93adb692000-09-23 04:55:48 +00001699 d = PyModule_GetDict(m);
Christian Heimes7a5457b2016-09-09 00:13:35 +02001700 if (d == NULL) {
1701 Py_DECREF(m);
1702 return NULL;
1703 }
Fred Drake6f987622000-08-25 18:03:30 +00001704 errors_module = PyDict_GetItem(d, errmod_name);
1705 if (errors_module == NULL) {
Fred Drakecde79132001-04-25 16:01:30 +00001706 errors_module = PyModule_New(MODULE_NAME ".errors");
Fred Drake6f987622000-08-25 18:03:30 +00001707 if (errors_module != NULL) {
Eric Snow3f9eee62017-09-15 16:35:20 -06001708 _PyImport_SetModule(errmod_name, errors_module);
Fred Drake93adb692000-09-23 04:55:48 +00001709 /* gives away the reference to errors_module */
1710 PyModule_AddObject(m, "errors", errors_module);
Fred Drakec23b5232000-08-24 21:57:43 +00001711 }
1712 }
Fred Drake6f987622000-08-25 18:03:30 +00001713 Py_DECREF(errmod_name);
Fred Drake85d835f2001-02-08 15:39:08 +00001714 model_module = PyDict_GetItem(d, modelmod_name);
1715 if (model_module == NULL) {
Fred Drakecde79132001-04-25 16:01:30 +00001716 model_module = PyModule_New(MODULE_NAME ".model");
Fred Drake85d835f2001-02-08 15:39:08 +00001717 if (model_module != NULL) {
Eric Snow3f9eee62017-09-15 16:35:20 -06001718 _PyImport_SetModule(modelmod_name, model_module);
Fred Drake85d835f2001-02-08 15:39:08 +00001719 /* gives away the reference to model_module */
1720 PyModule_AddObject(m, "model", model_module);
1721 }
1722 }
1723 Py_DECREF(modelmod_name);
Christian Heimes7a5457b2016-09-09 00:13:35 +02001724 if (errors_module == NULL || model_module == NULL) {
Fred Drake85d835f2001-02-08 15:39:08 +00001725 /* Don't core dump later! */
Christian Heimes7a5457b2016-09-09 00:13:35 +02001726 Py_DECREF(m);
Martin v. Löwis1a214512008-06-11 05:26:20 +00001727 return NULL;
Christian Heimes7a5457b2016-09-09 00:13:35 +02001728 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729
Martin v. Löwisc847f402003-01-21 11:09:21 +00001730#if XML_COMBINED_VERSION > 19505
Martin v. Löwis069dde22003-01-21 10:58:18 +00001731 {
1732 const XML_Feature *features = XML_GetFeatureList();
1733 PyObject *list = PyList_New(0);
1734 if (list == NULL)
1735 /* just ignore it */
1736 PyErr_Clear();
1737 else {
1738 int i = 0;
1739 for (; features[i].feature != XML_FEATURE_END; ++i) {
1740 int ok;
1741 PyObject *item = Py_BuildValue("si", features[i].name,
1742 features[i].value);
1743 if (item == NULL) {
1744 Py_DECREF(list);
1745 list = NULL;
1746 break;
1747 }
1748 ok = PyList_Append(list, item);
1749 Py_DECREF(item);
1750 if (ok < 0) {
1751 PyErr_Clear();
1752 break;
1753 }
1754 }
1755 if (list != NULL)
1756 PyModule_AddObject(m, "features", list);
1757 }
1758 }
Martin v. Löwisc847f402003-01-21 11:09:21 +00001759#endif
Fred Drake6f987622000-08-25 18:03:30 +00001760
Georg Brandlb4dac712010-10-15 14:46:48 +00001761 codes_dict = PyDict_New();
1762 rev_codes_dict = PyDict_New();
1763 if (codes_dict == NULL || rev_codes_dict == NULL) {
1764 Py_XDECREF(codes_dict);
1765 Py_XDECREF(rev_codes_dict);
1766 return NULL;
1767 }
Victor Stinner0fcab4a2011-01-04 12:59:15 +00001768
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001769#define MYCONST(name) \
Georg Brandlb4dac712010-10-15 14:46:48 +00001770 if (PyModule_AddStringConstant(errors_module, #name, \
Serhiy Storchaka20b39b22014-09-28 11:27:24 +03001771 XML_ErrorString(name)) < 0) \
Georg Brandlb4dac712010-10-15 14:46:48 +00001772 return NULL; \
1773 tmpnum = PyLong_FromLong(name); \
1774 if (tmpnum == NULL) return NULL; \
1775 res = PyDict_SetItemString(codes_dict, \
1776 XML_ErrorString(name), tmpnum); \
1777 if (res < 0) return NULL; \
1778 tmpstr = PyUnicode_FromString(XML_ErrorString(name)); \
1779 if (tmpstr == NULL) return NULL; \
1780 res = PyDict_SetItem(rev_codes_dict, tmpnum, tmpstr); \
1781 Py_DECREF(tmpstr); \
1782 Py_DECREF(tmpnum); \
1783 if (res < 0) return NULL; \
Fred Drake7bd9f412000-07-04 23:51:31 +00001784
Fred Drake0582df92000-07-12 04:49:00 +00001785 MYCONST(XML_ERROR_NO_MEMORY);
1786 MYCONST(XML_ERROR_SYNTAX);
1787 MYCONST(XML_ERROR_NO_ELEMENTS);
1788 MYCONST(XML_ERROR_INVALID_TOKEN);
1789 MYCONST(XML_ERROR_UNCLOSED_TOKEN);
1790 MYCONST(XML_ERROR_PARTIAL_CHAR);
1791 MYCONST(XML_ERROR_TAG_MISMATCH);
1792 MYCONST(XML_ERROR_DUPLICATE_ATTRIBUTE);
1793 MYCONST(XML_ERROR_JUNK_AFTER_DOC_ELEMENT);
1794 MYCONST(XML_ERROR_PARAM_ENTITY_REF);
1795 MYCONST(XML_ERROR_UNDEFINED_ENTITY);
1796 MYCONST(XML_ERROR_RECURSIVE_ENTITY_REF);
1797 MYCONST(XML_ERROR_ASYNC_ENTITY);
1798 MYCONST(XML_ERROR_BAD_CHAR_REF);
1799 MYCONST(XML_ERROR_BINARY_ENTITY_REF);
1800 MYCONST(XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF);
1801 MYCONST(XML_ERROR_MISPLACED_XML_PI);
1802 MYCONST(XML_ERROR_UNKNOWN_ENCODING);
1803 MYCONST(XML_ERROR_INCORRECT_ENCODING);
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001804 MYCONST(XML_ERROR_UNCLOSED_CDATA_SECTION);
1805 MYCONST(XML_ERROR_EXTERNAL_ENTITY_HANDLING);
1806 MYCONST(XML_ERROR_NOT_STANDALONE);
Fred Drake283b6702004-08-04 22:28:16 +00001807 MYCONST(XML_ERROR_UNEXPECTED_STATE);
1808 MYCONST(XML_ERROR_ENTITY_DECLARED_IN_PE);
1809 MYCONST(XML_ERROR_FEATURE_REQUIRES_XML_DTD);
1810 MYCONST(XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING);
1811 /* Added in Expat 1.95.7. */
1812 MYCONST(XML_ERROR_UNBOUND_PREFIX);
1813 /* Added in Expat 1.95.8. */
1814 MYCONST(XML_ERROR_UNDECLARING_PREFIX);
1815 MYCONST(XML_ERROR_INCOMPLETE_PE);
1816 MYCONST(XML_ERROR_XML_DECL);
1817 MYCONST(XML_ERROR_TEXT_DECL);
1818 MYCONST(XML_ERROR_PUBLICID);
1819 MYCONST(XML_ERROR_SUSPENDED);
1820 MYCONST(XML_ERROR_NOT_SUSPENDED);
1821 MYCONST(XML_ERROR_ABORTED);
1822 MYCONST(XML_ERROR_FINISHED);
1823 MYCONST(XML_ERROR_SUSPEND_PE);
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001824
Georg Brandlb4dac712010-10-15 14:46:48 +00001825 if (PyModule_AddStringConstant(errors_module, "__doc__",
1826 "Constants used to describe "
1827 "error conditions.") < 0)
1828 return NULL;
Fred Drake85d835f2001-02-08 15:39:08 +00001829
Georg Brandlb4dac712010-10-15 14:46:48 +00001830 if (PyModule_AddObject(errors_module, "codes", codes_dict) < 0)
1831 return NULL;
1832 if (PyModule_AddObject(errors_module, "messages", rev_codes_dict) < 0)
1833 return NULL;
Victor Stinner0fcab4a2011-01-04 12:59:15 +00001834
Fred Drake93adb692000-09-23 04:55:48 +00001835#undef MYCONST
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001836
Fred Drake85d835f2001-02-08 15:39:08 +00001837#define MYCONST(c) PyModule_AddIntConstant(m, #c, c)
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001838 MYCONST(XML_PARAM_ENTITY_PARSING_NEVER);
1839 MYCONST(XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE);
1840 MYCONST(XML_PARAM_ENTITY_PARSING_ALWAYS);
Fred Drake85d835f2001-02-08 15:39:08 +00001841#undef MYCONST
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001842
Fred Drake85d835f2001-02-08 15:39:08 +00001843#define MYCONST(c) PyModule_AddIntConstant(model_module, #c, c)
1844 PyModule_AddStringConstant(model_module, "__doc__",
1845 "Constants used to interpret content model information.");
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001846
Fred Drake85d835f2001-02-08 15:39:08 +00001847 MYCONST(XML_CTYPE_EMPTY);
1848 MYCONST(XML_CTYPE_ANY);
1849 MYCONST(XML_CTYPE_MIXED);
1850 MYCONST(XML_CTYPE_NAME);
1851 MYCONST(XML_CTYPE_CHOICE);
1852 MYCONST(XML_CTYPE_SEQ);
1853
1854 MYCONST(XML_CQUANT_NONE);
1855 MYCONST(XML_CQUANT_OPT);
1856 MYCONST(XML_CQUANT_REP);
1857 MYCONST(XML_CQUANT_PLUS);
1858#undef MYCONST
Fredrik Lundhc3345042005-12-13 19:49:55 +00001859
1860 /* initialize pyexpat dispatch table */
Fredrik Lundhd7a42882005-12-13 20:43:04 +00001861 capi.size = sizeof(capi);
Fredrik Lundhcc117db2005-12-13 21:55:36 +00001862 capi.magic = PyExpat_CAPI_MAGIC;
Fredrik Lundhd7a42882005-12-13 20:43:04 +00001863 capi.MAJOR_VERSION = XML_MAJOR_VERSION;
1864 capi.MINOR_VERSION = XML_MINOR_VERSION;
1865 capi.MICRO_VERSION = XML_MICRO_VERSION;
1866 capi.ErrorString = XML_ErrorString;
Fredrik Lundhcc117db2005-12-13 21:55:36 +00001867 capi.GetErrorCode = XML_GetErrorCode;
1868 capi.GetErrorColumnNumber = XML_GetErrorColumnNumber;
1869 capi.GetErrorLineNumber = XML_GetErrorLineNumber;
Fredrik Lundhd7a42882005-12-13 20:43:04 +00001870 capi.Parse = XML_Parse;
1871 capi.ParserCreate_MM = XML_ParserCreate_MM;
1872 capi.ParserFree = XML_ParserFree;
1873 capi.SetCharacterDataHandler = XML_SetCharacterDataHandler;
1874 capi.SetCommentHandler = XML_SetCommentHandler;
1875 capi.SetDefaultHandlerExpand = XML_SetDefaultHandlerExpand;
1876 capi.SetElementHandler = XML_SetElementHandler;
1877 capi.SetNamespaceDeclHandler = XML_SetNamespaceDeclHandler;
1878 capi.SetProcessingInstructionHandler = XML_SetProcessingInstructionHandler;
1879 capi.SetUnknownEncodingHandler = XML_SetUnknownEncodingHandler;
1880 capi.SetUserData = XML_SetUserData;
Eli Bendersky2b6b73e2012-06-01 11:32:34 +03001881 capi.SetStartDoctypeDeclHandler = XML_SetStartDoctypeDeclHandler;
Serhiy Storchaka66d53fa2013-05-22 17:07:51 +03001882 capi.SetEncoding = XML_SetEncoding;
Eli Bendersky6dc32b32013-05-25 05:25:48 -07001883 capi.DefaultUnknownEncodingHandler = PyUnknownEncodingHandler;
Christian Heimescb5778f2018-09-18 14:38:58 +02001884#if XML_COMBINED_VERSION >= 20100
1885 capi.SetHashSalt = XML_SetHashSalt;
1886#else
1887 capi.SetHashSalt = NULL;
1888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001889
Benjamin Petersonb173f782009-05-05 22:31:58 +00001890 /* export using capsule */
1891 capi_object = PyCapsule_New(&capi, PyExpat_CAPSULE_NAME, NULL);
Fredrik Lundhd7a42882005-12-13 20:43:04 +00001892 if (capi_object)
1893 PyModule_AddObject(m, "expat_CAPI", capi_object);
Martin v. Löwis1a214512008-06-11 05:26:20 +00001894 return m;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001895}
1896
Fred Drake6f987622000-08-25 18:03:30 +00001897static void
Martin v. Löwis5b68ce32001-10-21 08:53:52 +00001898clear_handlers(xmlparseobject *self, int initial)
Fred Drake0582df92000-07-12 04:49:00 +00001899{
Fred Drakecde79132001-04-25 16:01:30 +00001900 int i = 0;
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001901
Fred Drake71b63ff2002-06-28 22:29:01 +00001902 for (; handler_info[i].name != NULL; i++) {
Martin v. Löwis5b68ce32001-10-21 08:53:52 +00001903 if (initial)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 self->handlers[i] = NULL;
1905 else {
Serhiy Storchaka1ed017a2015-12-27 15:51:32 +02001906 Py_CLEAR(self->handlers[i]);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 handler_info[i].setter(self->itself, NULL);
Fred Drakecde79132001-04-25 16:01:30 +00001908 }
Fred Drakecde79132001-04-25 16:01:30 +00001909 }
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001910}
1911
Tim Peters0c322792002-07-17 16:49:03 +00001912static struct HandlerInfo handler_info[] = {
Fred Drake71b63ff2002-06-28 22:29:01 +00001913 {"StartElementHandler",
1914 (xmlhandlersetter)XML_SetStartElementHandler,
Fred Drake0582df92000-07-12 04:49:00 +00001915 (xmlhandler)my_StartElementHandler},
Fred Drake71b63ff2002-06-28 22:29:01 +00001916 {"EndElementHandler",
1917 (xmlhandlersetter)XML_SetEndElementHandler,
Fred Drake0582df92000-07-12 04:49:00 +00001918 (xmlhandler)my_EndElementHandler},
Fred Drake71b63ff2002-06-28 22:29:01 +00001919 {"ProcessingInstructionHandler",
Fred Drake0582df92000-07-12 04:49:00 +00001920 (xmlhandlersetter)XML_SetProcessingInstructionHandler,
1921 (xmlhandler)my_ProcessingInstructionHandler},
Fred Drake71b63ff2002-06-28 22:29:01 +00001922 {"CharacterDataHandler",
Fred Drake0582df92000-07-12 04:49:00 +00001923 (xmlhandlersetter)XML_SetCharacterDataHandler,
1924 (xmlhandler)my_CharacterDataHandler},
Fred Drake71b63ff2002-06-28 22:29:01 +00001925 {"UnparsedEntityDeclHandler",
Fred Drake0582df92000-07-12 04:49:00 +00001926 (xmlhandlersetter)XML_SetUnparsedEntityDeclHandler,
Fred Drake2a3d7db2002-06-28 22:56:48 +00001927 (xmlhandler)my_UnparsedEntityDeclHandler},
Fred Drake71b63ff2002-06-28 22:29:01 +00001928 {"NotationDeclHandler",
Fred Drake0582df92000-07-12 04:49:00 +00001929 (xmlhandlersetter)XML_SetNotationDeclHandler,
Fred Drake2a3d7db2002-06-28 22:56:48 +00001930 (xmlhandler)my_NotationDeclHandler},
Fred Drake71b63ff2002-06-28 22:29:01 +00001931 {"StartNamespaceDeclHandler",
1932 (xmlhandlersetter)XML_SetStartNamespaceDeclHandler,
Fred Drake2a3d7db2002-06-28 22:56:48 +00001933 (xmlhandler)my_StartNamespaceDeclHandler},
Fred Drake71b63ff2002-06-28 22:29:01 +00001934 {"EndNamespaceDeclHandler",
1935 (xmlhandlersetter)XML_SetEndNamespaceDeclHandler,
Fred Drake2a3d7db2002-06-28 22:56:48 +00001936 (xmlhandler)my_EndNamespaceDeclHandler},
Fred Drake0582df92000-07-12 04:49:00 +00001937 {"CommentHandler",
1938 (xmlhandlersetter)XML_SetCommentHandler,
1939 (xmlhandler)my_CommentHandler},
1940 {"StartCdataSectionHandler",
Fred Drake71b63ff2002-06-28 22:29:01 +00001941 (xmlhandlersetter)XML_SetStartCdataSectionHandler,
Fred Drake0582df92000-07-12 04:49:00 +00001942 (xmlhandler)my_StartCdataSectionHandler},
1943 {"EndCdataSectionHandler",
Fred Drake71b63ff2002-06-28 22:29:01 +00001944 (xmlhandlersetter)XML_SetEndCdataSectionHandler,
Fred Drake0582df92000-07-12 04:49:00 +00001945 (xmlhandler)my_EndCdataSectionHandler},
1946 {"DefaultHandler",
1947 (xmlhandlersetter)XML_SetDefaultHandler,
1948 (xmlhandler)my_DefaultHandler},
1949 {"DefaultHandlerExpand",
1950 (xmlhandlersetter)XML_SetDefaultHandlerExpand,
1951 (xmlhandler)my_DefaultHandlerExpandHandler},
1952 {"NotStandaloneHandler",
1953 (xmlhandlersetter)XML_SetNotStandaloneHandler,
1954 (xmlhandler)my_NotStandaloneHandler},
1955 {"ExternalEntityRefHandler",
1956 (xmlhandlersetter)XML_SetExternalEntityRefHandler,
Fred Drake2a3d7db2002-06-28 22:56:48 +00001957 (xmlhandler)my_ExternalEntityRefHandler},
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001958 {"StartDoctypeDeclHandler",
Fred Drake71b63ff2002-06-28 22:29:01 +00001959 (xmlhandlersetter)XML_SetStartDoctypeDeclHandler,
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001960 (xmlhandler)my_StartDoctypeDeclHandler},
1961 {"EndDoctypeDeclHandler",
Fred Drake71b63ff2002-06-28 22:29:01 +00001962 (xmlhandlersetter)XML_SetEndDoctypeDeclHandler,
Martin v. Löwis0078f6c2001-01-21 10:18:10 +00001963 (xmlhandler)my_EndDoctypeDeclHandler},
Fred Drake85d835f2001-02-08 15:39:08 +00001964 {"EntityDeclHandler",
1965 (xmlhandlersetter)XML_SetEntityDeclHandler,
1966 (xmlhandler)my_EntityDeclHandler},
1967 {"XmlDeclHandler",
1968 (xmlhandlersetter)XML_SetXmlDeclHandler,
1969 (xmlhandler)my_XmlDeclHandler},
1970 {"ElementDeclHandler",
1971 (xmlhandlersetter)XML_SetElementDeclHandler,
1972 (xmlhandler)my_ElementDeclHandler},
1973 {"AttlistDeclHandler",
1974 (xmlhandlersetter)XML_SetAttlistDeclHandler,
1975 (xmlhandler)my_AttlistDeclHandler},
Martin v. Löwisc847f402003-01-21 11:09:21 +00001976#if XML_COMBINED_VERSION >= 19504
Martin v. Löwis069dde22003-01-21 10:58:18 +00001977 {"SkippedEntityHandler",
1978 (xmlhandlersetter)XML_SetSkippedEntityHandler,
1979 (xmlhandler)my_SkippedEntityHandler},
Martin v. Löwisc847f402003-01-21 11:09:21 +00001980#endif
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001981
Fred Drake0582df92000-07-12 04:49:00 +00001982 {NULL, NULL, NULL} /* sentinel */
Andrew M. Kuchlingb7f10532000-03-31 15:43:31 +00001983};