17db96d56Sopenharmony_ci#include "Python.h" 27db96d56Sopenharmony_ci#include <ctype.h> 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci#include "structmember.h" // PyMemberDef 57db96d56Sopenharmony_ci#include "expat.h" 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci#include "pyexpat.h" 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ci/* Do not emit Clinic output to a file as that wreaks havoc with conditionally 107db96d56Sopenharmony_ci included methods. */ 117db96d56Sopenharmony_ci/*[clinic input] 127db96d56Sopenharmony_cimodule pyexpat 137db96d56Sopenharmony_ci[clinic start generated code]*/ 147db96d56Sopenharmony_ci/*[clinic end generated code: output=da39a3ee5e6b4b0d input=b168d503a4490c15]*/ 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ci#define XML_COMBINED_VERSION (10000*XML_MAJOR_VERSION+100*XML_MINOR_VERSION+XML_MICRO_VERSION) 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_cistatic XML_Memory_Handling_Suite ExpatMemoryHandler = { 197db96d56Sopenharmony_ci PyObject_Malloc, PyObject_Realloc, PyObject_Free}; 207db96d56Sopenharmony_ci 217db96d56Sopenharmony_cienum HandlerTypes { 227db96d56Sopenharmony_ci StartElement, 237db96d56Sopenharmony_ci EndElement, 247db96d56Sopenharmony_ci ProcessingInstruction, 257db96d56Sopenharmony_ci CharacterData, 267db96d56Sopenharmony_ci UnparsedEntityDecl, 277db96d56Sopenharmony_ci NotationDecl, 287db96d56Sopenharmony_ci StartNamespaceDecl, 297db96d56Sopenharmony_ci EndNamespaceDecl, 307db96d56Sopenharmony_ci Comment, 317db96d56Sopenharmony_ci StartCdataSection, 327db96d56Sopenharmony_ci EndCdataSection, 337db96d56Sopenharmony_ci Default, 347db96d56Sopenharmony_ci DefaultHandlerExpand, 357db96d56Sopenharmony_ci NotStandalone, 367db96d56Sopenharmony_ci ExternalEntityRef, 377db96d56Sopenharmony_ci StartDoctypeDecl, 387db96d56Sopenharmony_ci EndDoctypeDecl, 397db96d56Sopenharmony_ci EntityDecl, 407db96d56Sopenharmony_ci XmlDecl, 417db96d56Sopenharmony_ci ElementDecl, 427db96d56Sopenharmony_ci AttlistDecl, 437db96d56Sopenharmony_ci#if XML_COMBINED_VERSION >= 19504 447db96d56Sopenharmony_ci SkippedEntity, 457db96d56Sopenharmony_ci#endif 467db96d56Sopenharmony_ci _DummyDecl 477db96d56Sopenharmony_ci}; 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_citypedef struct { 507db96d56Sopenharmony_ci PyTypeObject *xml_parse_type; 517db96d56Sopenharmony_ci PyObject *error; 527db96d56Sopenharmony_ci PyObject *str_read; 537db96d56Sopenharmony_ci} pyexpat_state; 547db96d56Sopenharmony_ci 557db96d56Sopenharmony_cistatic inline pyexpat_state* 567db96d56Sopenharmony_cipyexpat_get_state(PyObject *module) 577db96d56Sopenharmony_ci{ 587db96d56Sopenharmony_ci void *state = PyModule_GetState(module); 597db96d56Sopenharmony_ci assert(state != NULL); 607db96d56Sopenharmony_ci return (pyexpat_state *)state; 617db96d56Sopenharmony_ci} 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci/* ----------------------------------------------------- */ 647db96d56Sopenharmony_ci 657db96d56Sopenharmony_ci/* Declarations for objects of type xmlparser */ 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_citypedef struct { 687db96d56Sopenharmony_ci PyObject_HEAD 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci XML_Parser itself; 717db96d56Sopenharmony_ci int ordered_attributes; /* Return attributes as a list. */ 727db96d56Sopenharmony_ci int specified_attributes; /* Report only specified attributes. */ 737db96d56Sopenharmony_ci int in_callback; /* Is a callback active? */ 747db96d56Sopenharmony_ci int ns_prefixes; /* Namespace-triplets mode? */ 757db96d56Sopenharmony_ci XML_Char *buffer; /* Buffer used when accumulating characters */ 767db96d56Sopenharmony_ci /* NULL if not enabled */ 777db96d56Sopenharmony_ci int buffer_size; /* Size of buffer, in XML_Char units */ 787db96d56Sopenharmony_ci int buffer_used; /* Buffer units in use */ 797db96d56Sopenharmony_ci PyObject *intern; /* Dictionary to intern strings */ 807db96d56Sopenharmony_ci PyObject **handlers; 817db96d56Sopenharmony_ci} xmlparseobject; 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ci#include "clinic/pyexpat.c.h" 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_ci#define CHARACTER_DATA_BUFFER_SIZE 8192 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_citypedef void (*xmlhandlersetter)(XML_Parser self, void *meth); 887db96d56Sopenharmony_citypedef void* xmlhandler; 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_cistruct HandlerInfo { 917db96d56Sopenharmony_ci const char *name; 927db96d56Sopenharmony_ci xmlhandlersetter setter; 937db96d56Sopenharmony_ci xmlhandler handler; 947db96d56Sopenharmony_ci PyGetSetDef getset; 957db96d56Sopenharmony_ci}; 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_cistatic struct HandlerInfo handler_info[64]; 987db96d56Sopenharmony_ci 997db96d56Sopenharmony_ci/* Set an integer attribute on the error object; return true on success, 1007db96d56Sopenharmony_ci * false on an exception. 1017db96d56Sopenharmony_ci */ 1027db96d56Sopenharmony_cistatic int 1037db96d56Sopenharmony_ciset_error_attr(PyObject *err, const char *name, int value) 1047db96d56Sopenharmony_ci{ 1057db96d56Sopenharmony_ci PyObject *v = PyLong_FromLong(value); 1067db96d56Sopenharmony_ci 1077db96d56Sopenharmony_ci if (v == NULL || PyObject_SetAttrString(err, name, v) == -1) { 1087db96d56Sopenharmony_ci Py_XDECREF(v); 1097db96d56Sopenharmony_ci return 0; 1107db96d56Sopenharmony_ci } 1117db96d56Sopenharmony_ci Py_DECREF(v); 1127db96d56Sopenharmony_ci return 1; 1137db96d56Sopenharmony_ci} 1147db96d56Sopenharmony_ci 1157db96d56Sopenharmony_ci/* Build and set an Expat exception, including positioning 1167db96d56Sopenharmony_ci * information. Always returns NULL. 1177db96d56Sopenharmony_ci */ 1187db96d56Sopenharmony_cistatic PyObject * 1197db96d56Sopenharmony_ciset_error(pyexpat_state *state, xmlparseobject *self, enum XML_Error code) 1207db96d56Sopenharmony_ci{ 1217db96d56Sopenharmony_ci PyObject *err; 1227db96d56Sopenharmony_ci PyObject *buffer; 1237db96d56Sopenharmony_ci XML_Parser parser = self->itself; 1247db96d56Sopenharmony_ci int lineno = XML_GetErrorLineNumber(parser); 1257db96d56Sopenharmony_ci int column = XML_GetErrorColumnNumber(parser); 1267db96d56Sopenharmony_ci 1277db96d56Sopenharmony_ci buffer = PyUnicode_FromFormat("%s: line %i, column %i", 1287db96d56Sopenharmony_ci XML_ErrorString(code), lineno, column); 1297db96d56Sopenharmony_ci if (buffer == NULL) 1307db96d56Sopenharmony_ci return NULL; 1317db96d56Sopenharmony_ci err = PyObject_CallOneArg(state->error, buffer); 1327db96d56Sopenharmony_ci Py_DECREF(buffer); 1337db96d56Sopenharmony_ci if ( err != NULL 1347db96d56Sopenharmony_ci && set_error_attr(err, "code", code) 1357db96d56Sopenharmony_ci && set_error_attr(err, "offset", column) 1367db96d56Sopenharmony_ci && set_error_attr(err, "lineno", lineno)) { 1377db96d56Sopenharmony_ci PyErr_SetObject(state->error, err); 1387db96d56Sopenharmony_ci } 1397db96d56Sopenharmony_ci Py_XDECREF(err); 1407db96d56Sopenharmony_ci return NULL; 1417db96d56Sopenharmony_ci} 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_cistatic int 1447db96d56Sopenharmony_cihave_handler(xmlparseobject *self, int type) 1457db96d56Sopenharmony_ci{ 1467db96d56Sopenharmony_ci PyObject *handler = self->handlers[type]; 1477db96d56Sopenharmony_ci return handler != NULL; 1487db96d56Sopenharmony_ci} 1497db96d56Sopenharmony_ci 1507db96d56Sopenharmony_ci/* Convert a string of XML_Chars into a Unicode string. 1517db96d56Sopenharmony_ci Returns None if str is a null pointer. */ 1527db96d56Sopenharmony_ci 1537db96d56Sopenharmony_cistatic PyObject * 1547db96d56Sopenharmony_ciconv_string_to_unicode(const XML_Char *str) 1557db96d56Sopenharmony_ci{ 1567db96d56Sopenharmony_ci /* XXX currently this code assumes that XML_Char is 8-bit, 1577db96d56Sopenharmony_ci and hence in UTF-8. */ 1587db96d56Sopenharmony_ci /* UTF-8 from Expat, Unicode desired */ 1597db96d56Sopenharmony_ci if (str == NULL) { 1607db96d56Sopenharmony_ci Py_RETURN_NONE; 1617db96d56Sopenharmony_ci } 1627db96d56Sopenharmony_ci return PyUnicode_DecodeUTF8(str, strlen(str), "strict"); 1637db96d56Sopenharmony_ci} 1647db96d56Sopenharmony_ci 1657db96d56Sopenharmony_cistatic PyObject * 1667db96d56Sopenharmony_ciconv_string_len_to_unicode(const XML_Char *str, int len) 1677db96d56Sopenharmony_ci{ 1687db96d56Sopenharmony_ci /* XXX currently this code assumes that XML_Char is 8-bit, 1697db96d56Sopenharmony_ci and hence in UTF-8. */ 1707db96d56Sopenharmony_ci /* UTF-8 from Expat, Unicode desired */ 1717db96d56Sopenharmony_ci if (str == NULL) { 1727db96d56Sopenharmony_ci Py_RETURN_NONE; 1737db96d56Sopenharmony_ci } 1747db96d56Sopenharmony_ci return PyUnicode_DecodeUTF8((const char *)str, len, "strict"); 1757db96d56Sopenharmony_ci} 1767db96d56Sopenharmony_ci 1777db96d56Sopenharmony_ci/* Callback routines */ 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_cistatic void clear_handlers(xmlparseobject *self, int initial); 1807db96d56Sopenharmony_ci 1817db96d56Sopenharmony_ci/* This handler is used when an error has been detected, in the hope 1827db96d56Sopenharmony_ci that actual parsing can be terminated early. This will only help 1837db96d56Sopenharmony_ci if an external entity reference is encountered. */ 1847db96d56Sopenharmony_cistatic int 1857db96d56Sopenharmony_cierror_external_entity_ref_handler(XML_Parser parser, 1867db96d56Sopenharmony_ci const XML_Char *context, 1877db96d56Sopenharmony_ci const XML_Char *base, 1887db96d56Sopenharmony_ci const XML_Char *systemId, 1897db96d56Sopenharmony_ci const XML_Char *publicId) 1907db96d56Sopenharmony_ci{ 1917db96d56Sopenharmony_ci return 0; 1927db96d56Sopenharmony_ci} 1937db96d56Sopenharmony_ci 1947db96d56Sopenharmony_ci/* Dummy character data handler used when an error (exception) has 1957db96d56Sopenharmony_ci been detected, and the actual parsing can be terminated early. 1967db96d56Sopenharmony_ci This is needed since character data handler can't be safely removed 1977db96d56Sopenharmony_ci from within the character data handler, but can be replaced. It is 1987db96d56Sopenharmony_ci used only from the character data handler trampoline, and must be 1997db96d56Sopenharmony_ci used right after `flag_error()` is called. */ 2007db96d56Sopenharmony_cistatic void 2017db96d56Sopenharmony_cinoop_character_data_handler(void *userData, const XML_Char *data, int len) 2027db96d56Sopenharmony_ci{ 2037db96d56Sopenharmony_ci /* Do nothing. */ 2047db96d56Sopenharmony_ci} 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_cistatic void 2077db96d56Sopenharmony_ciflag_error(xmlparseobject *self) 2087db96d56Sopenharmony_ci{ 2097db96d56Sopenharmony_ci clear_handlers(self, 0); 2107db96d56Sopenharmony_ci XML_SetExternalEntityRefHandler(self->itself, 2117db96d56Sopenharmony_ci error_external_entity_ref_handler); 2127db96d56Sopenharmony_ci} 2137db96d56Sopenharmony_ci 2147db96d56Sopenharmony_cistatic PyObject* 2157db96d56Sopenharmony_cicall_with_frame(const char *funcname, int lineno, PyObject* func, PyObject* args, 2167db96d56Sopenharmony_ci xmlparseobject *self) 2177db96d56Sopenharmony_ci{ 2187db96d56Sopenharmony_ci PyObject *res; 2197db96d56Sopenharmony_ci 2207db96d56Sopenharmony_ci res = PyObject_Call(func, args, NULL); 2217db96d56Sopenharmony_ci if (res == NULL) { 2227db96d56Sopenharmony_ci _PyTraceback_Add(funcname, __FILE__, lineno); 2237db96d56Sopenharmony_ci XML_StopParser(self->itself, XML_FALSE); 2247db96d56Sopenharmony_ci } 2257db96d56Sopenharmony_ci return res; 2267db96d56Sopenharmony_ci} 2277db96d56Sopenharmony_ci 2287db96d56Sopenharmony_cistatic PyObject* 2297db96d56Sopenharmony_cistring_intern(xmlparseobject *self, const char* str) 2307db96d56Sopenharmony_ci{ 2317db96d56Sopenharmony_ci PyObject *result = conv_string_to_unicode(str); 2327db96d56Sopenharmony_ci PyObject *value; 2337db96d56Sopenharmony_ci /* result can be NULL if the unicode conversion failed. */ 2347db96d56Sopenharmony_ci if (!result) 2357db96d56Sopenharmony_ci return result; 2367db96d56Sopenharmony_ci if (!self->intern) 2377db96d56Sopenharmony_ci return result; 2387db96d56Sopenharmony_ci value = PyDict_GetItemWithError(self->intern, result); 2397db96d56Sopenharmony_ci if (!value) { 2407db96d56Sopenharmony_ci if (!PyErr_Occurred() && 2417db96d56Sopenharmony_ci PyDict_SetItem(self->intern, result, result) == 0) 2427db96d56Sopenharmony_ci { 2437db96d56Sopenharmony_ci return result; 2447db96d56Sopenharmony_ci } 2457db96d56Sopenharmony_ci else { 2467db96d56Sopenharmony_ci Py_DECREF(result); 2477db96d56Sopenharmony_ci return NULL; 2487db96d56Sopenharmony_ci } 2497db96d56Sopenharmony_ci } 2507db96d56Sopenharmony_ci Py_INCREF(value); 2517db96d56Sopenharmony_ci Py_DECREF(result); 2527db96d56Sopenharmony_ci return value; 2537db96d56Sopenharmony_ci} 2547db96d56Sopenharmony_ci 2557db96d56Sopenharmony_ci/* Return 0 on success, -1 on exception. 2567db96d56Sopenharmony_ci * flag_error() will be called before return if needed. 2577db96d56Sopenharmony_ci */ 2587db96d56Sopenharmony_cistatic int 2597db96d56Sopenharmony_cicall_character_handler(xmlparseobject *self, const XML_Char *buffer, int len) 2607db96d56Sopenharmony_ci{ 2617db96d56Sopenharmony_ci PyObject *args; 2627db96d56Sopenharmony_ci PyObject *temp; 2637db96d56Sopenharmony_ci 2647db96d56Sopenharmony_ci if (!have_handler(self, CharacterData)) 2657db96d56Sopenharmony_ci return -1; 2667db96d56Sopenharmony_ci 2677db96d56Sopenharmony_ci args = PyTuple_New(1); 2687db96d56Sopenharmony_ci if (args == NULL) 2697db96d56Sopenharmony_ci return -1; 2707db96d56Sopenharmony_ci temp = (conv_string_len_to_unicode(buffer, len)); 2717db96d56Sopenharmony_ci if (temp == NULL) { 2727db96d56Sopenharmony_ci Py_DECREF(args); 2737db96d56Sopenharmony_ci flag_error(self); 2747db96d56Sopenharmony_ci XML_SetCharacterDataHandler(self->itself, 2757db96d56Sopenharmony_ci noop_character_data_handler); 2767db96d56Sopenharmony_ci return -1; 2777db96d56Sopenharmony_ci } 2787db96d56Sopenharmony_ci PyTuple_SET_ITEM(args, 0, temp); 2797db96d56Sopenharmony_ci /* temp is now a borrowed reference; consider it unused. */ 2807db96d56Sopenharmony_ci self->in_callback = 1; 2817db96d56Sopenharmony_ci temp = call_with_frame("CharacterData", __LINE__, 2827db96d56Sopenharmony_ci self->handlers[CharacterData], args, self); 2837db96d56Sopenharmony_ci /* temp is an owned reference again, or NULL */ 2847db96d56Sopenharmony_ci self->in_callback = 0; 2857db96d56Sopenharmony_ci Py_DECREF(args); 2867db96d56Sopenharmony_ci if (temp == NULL) { 2877db96d56Sopenharmony_ci flag_error(self); 2887db96d56Sopenharmony_ci XML_SetCharacterDataHandler(self->itself, 2897db96d56Sopenharmony_ci noop_character_data_handler); 2907db96d56Sopenharmony_ci return -1; 2917db96d56Sopenharmony_ci } 2927db96d56Sopenharmony_ci Py_DECREF(temp); 2937db96d56Sopenharmony_ci return 0; 2947db96d56Sopenharmony_ci} 2957db96d56Sopenharmony_ci 2967db96d56Sopenharmony_cistatic int 2977db96d56Sopenharmony_ciflush_character_buffer(xmlparseobject *self) 2987db96d56Sopenharmony_ci{ 2997db96d56Sopenharmony_ci int rc; 3007db96d56Sopenharmony_ci if (self->buffer == NULL || self->buffer_used == 0) 3017db96d56Sopenharmony_ci return 0; 3027db96d56Sopenharmony_ci rc = call_character_handler(self, self->buffer, self->buffer_used); 3037db96d56Sopenharmony_ci self->buffer_used = 0; 3047db96d56Sopenharmony_ci return rc; 3057db96d56Sopenharmony_ci} 3067db96d56Sopenharmony_ci 3077db96d56Sopenharmony_cistatic void 3087db96d56Sopenharmony_cimy_CharacterDataHandler(void *userData, const XML_Char *data, int len) 3097db96d56Sopenharmony_ci{ 3107db96d56Sopenharmony_ci xmlparseobject *self = (xmlparseobject *) userData; 3117db96d56Sopenharmony_ci 3127db96d56Sopenharmony_ci if (PyErr_Occurred()) 3137db96d56Sopenharmony_ci return; 3147db96d56Sopenharmony_ci 3157db96d56Sopenharmony_ci if (self->buffer == NULL) 3167db96d56Sopenharmony_ci call_character_handler(self, data, len); 3177db96d56Sopenharmony_ci else { 3187db96d56Sopenharmony_ci if ((self->buffer_used + len) > self->buffer_size) { 3197db96d56Sopenharmony_ci if (flush_character_buffer(self) < 0) 3207db96d56Sopenharmony_ci return; 3217db96d56Sopenharmony_ci /* handler might have changed; drop the rest on the floor 3227db96d56Sopenharmony_ci * if there isn't a handler anymore 3237db96d56Sopenharmony_ci */ 3247db96d56Sopenharmony_ci if (!have_handler(self, CharacterData)) 3257db96d56Sopenharmony_ci return; 3267db96d56Sopenharmony_ci } 3277db96d56Sopenharmony_ci if (len > self->buffer_size) { 3287db96d56Sopenharmony_ci call_character_handler(self, data, len); 3297db96d56Sopenharmony_ci self->buffer_used = 0; 3307db96d56Sopenharmony_ci } 3317db96d56Sopenharmony_ci else { 3327db96d56Sopenharmony_ci memcpy(self->buffer + self->buffer_used, 3337db96d56Sopenharmony_ci data, len * sizeof(XML_Char)); 3347db96d56Sopenharmony_ci self->buffer_used += len; 3357db96d56Sopenharmony_ci } 3367db96d56Sopenharmony_ci } 3377db96d56Sopenharmony_ci} 3387db96d56Sopenharmony_ci 3397db96d56Sopenharmony_cistatic void 3407db96d56Sopenharmony_cimy_StartElementHandler(void *userData, 3417db96d56Sopenharmony_ci const XML_Char *name, const XML_Char *atts[]) 3427db96d56Sopenharmony_ci{ 3437db96d56Sopenharmony_ci xmlparseobject *self = (xmlparseobject *)userData; 3447db96d56Sopenharmony_ci 3457db96d56Sopenharmony_ci if (have_handler(self, StartElement)) { 3467db96d56Sopenharmony_ci PyObject *container, *rv, *args; 3477db96d56Sopenharmony_ci int i, max; 3487db96d56Sopenharmony_ci 3497db96d56Sopenharmony_ci if (PyErr_Occurred()) 3507db96d56Sopenharmony_ci return; 3517db96d56Sopenharmony_ci 3527db96d56Sopenharmony_ci if (flush_character_buffer(self) < 0) 3537db96d56Sopenharmony_ci return; 3547db96d56Sopenharmony_ci /* Set max to the number of slots filled in atts[]; max/2 is 3557db96d56Sopenharmony_ci * the number of attributes we need to process. 3567db96d56Sopenharmony_ci */ 3577db96d56Sopenharmony_ci if (self->specified_attributes) { 3587db96d56Sopenharmony_ci max = XML_GetSpecifiedAttributeCount(self->itself); 3597db96d56Sopenharmony_ci } 3607db96d56Sopenharmony_ci else { 3617db96d56Sopenharmony_ci max = 0; 3627db96d56Sopenharmony_ci while (atts[max] != NULL) 3637db96d56Sopenharmony_ci max += 2; 3647db96d56Sopenharmony_ci } 3657db96d56Sopenharmony_ci /* Build the container. */ 3667db96d56Sopenharmony_ci if (self->ordered_attributes) 3677db96d56Sopenharmony_ci container = PyList_New(max); 3687db96d56Sopenharmony_ci else 3697db96d56Sopenharmony_ci container = PyDict_New(); 3707db96d56Sopenharmony_ci if (container == NULL) { 3717db96d56Sopenharmony_ci flag_error(self); 3727db96d56Sopenharmony_ci return; 3737db96d56Sopenharmony_ci } 3747db96d56Sopenharmony_ci for (i = 0; i < max; i += 2) { 3757db96d56Sopenharmony_ci PyObject *n = string_intern(self, (XML_Char *) atts[i]); 3767db96d56Sopenharmony_ci PyObject *v; 3777db96d56Sopenharmony_ci if (n == NULL) { 3787db96d56Sopenharmony_ci flag_error(self); 3797db96d56Sopenharmony_ci Py_DECREF(container); 3807db96d56Sopenharmony_ci return; 3817db96d56Sopenharmony_ci } 3827db96d56Sopenharmony_ci v = conv_string_to_unicode((XML_Char *) atts[i+1]); 3837db96d56Sopenharmony_ci if (v == NULL) { 3847db96d56Sopenharmony_ci flag_error(self); 3857db96d56Sopenharmony_ci Py_DECREF(container); 3867db96d56Sopenharmony_ci Py_DECREF(n); 3877db96d56Sopenharmony_ci return; 3887db96d56Sopenharmony_ci } 3897db96d56Sopenharmony_ci if (self->ordered_attributes) { 3907db96d56Sopenharmony_ci PyList_SET_ITEM(container, i, n); 3917db96d56Sopenharmony_ci PyList_SET_ITEM(container, i+1, v); 3927db96d56Sopenharmony_ci } 3937db96d56Sopenharmony_ci else if (PyDict_SetItem(container, n, v)) { 3947db96d56Sopenharmony_ci flag_error(self); 3957db96d56Sopenharmony_ci Py_DECREF(n); 3967db96d56Sopenharmony_ci Py_DECREF(v); 3977db96d56Sopenharmony_ci Py_DECREF(container); 3987db96d56Sopenharmony_ci return; 3997db96d56Sopenharmony_ci } 4007db96d56Sopenharmony_ci else { 4017db96d56Sopenharmony_ci Py_DECREF(n); 4027db96d56Sopenharmony_ci Py_DECREF(v); 4037db96d56Sopenharmony_ci } 4047db96d56Sopenharmony_ci } 4057db96d56Sopenharmony_ci args = string_intern(self, name); 4067db96d56Sopenharmony_ci if (args == NULL) { 4077db96d56Sopenharmony_ci Py_DECREF(container); 4087db96d56Sopenharmony_ci return; 4097db96d56Sopenharmony_ci } 4107db96d56Sopenharmony_ci args = Py_BuildValue("(NN)", args, container); 4117db96d56Sopenharmony_ci if (args == NULL) { 4127db96d56Sopenharmony_ci return; 4137db96d56Sopenharmony_ci } 4147db96d56Sopenharmony_ci /* Container is now a borrowed reference; ignore it. */ 4157db96d56Sopenharmony_ci self->in_callback = 1; 4167db96d56Sopenharmony_ci rv = call_with_frame("StartElement", __LINE__, 4177db96d56Sopenharmony_ci self->handlers[StartElement], args, self); 4187db96d56Sopenharmony_ci self->in_callback = 0; 4197db96d56Sopenharmony_ci Py_DECREF(args); 4207db96d56Sopenharmony_ci if (rv == NULL) { 4217db96d56Sopenharmony_ci flag_error(self); 4227db96d56Sopenharmony_ci return; 4237db96d56Sopenharmony_ci } 4247db96d56Sopenharmony_ci Py_DECREF(rv); 4257db96d56Sopenharmony_ci } 4267db96d56Sopenharmony_ci} 4277db96d56Sopenharmony_ci 4287db96d56Sopenharmony_ci#define RC_HANDLER(RC, NAME, PARAMS, INIT, PARAM_FORMAT, CONVERSION, \ 4297db96d56Sopenharmony_ci RETURN, GETUSERDATA) \ 4307db96d56Sopenharmony_cistatic RC \ 4317db96d56Sopenharmony_cimy_##NAME##Handler PARAMS {\ 4327db96d56Sopenharmony_ci xmlparseobject *self = GETUSERDATA ; \ 4337db96d56Sopenharmony_ci PyObject *args = NULL; \ 4347db96d56Sopenharmony_ci PyObject *rv = NULL; \ 4357db96d56Sopenharmony_ci INIT \ 4367db96d56Sopenharmony_ci\ 4377db96d56Sopenharmony_ci if (have_handler(self, NAME)) { \ 4387db96d56Sopenharmony_ci if (PyErr_Occurred()) \ 4397db96d56Sopenharmony_ci return RETURN; \ 4407db96d56Sopenharmony_ci if (flush_character_buffer(self) < 0) \ 4417db96d56Sopenharmony_ci return RETURN; \ 4427db96d56Sopenharmony_ci args = Py_BuildValue PARAM_FORMAT ;\ 4437db96d56Sopenharmony_ci if (!args) { flag_error(self); return RETURN;} \ 4447db96d56Sopenharmony_ci self->in_callback = 1; \ 4457db96d56Sopenharmony_ci rv = call_with_frame(#NAME,__LINE__, \ 4467db96d56Sopenharmony_ci self->handlers[NAME], args, self); \ 4477db96d56Sopenharmony_ci self->in_callback = 0; \ 4487db96d56Sopenharmony_ci Py_DECREF(args); \ 4497db96d56Sopenharmony_ci if (rv == NULL) { \ 4507db96d56Sopenharmony_ci flag_error(self); \ 4517db96d56Sopenharmony_ci return RETURN; \ 4527db96d56Sopenharmony_ci } \ 4537db96d56Sopenharmony_ci CONVERSION \ 4547db96d56Sopenharmony_ci Py_DECREF(rv); \ 4557db96d56Sopenharmony_ci } \ 4567db96d56Sopenharmony_ci return RETURN; \ 4577db96d56Sopenharmony_ci} 4587db96d56Sopenharmony_ci 4597db96d56Sopenharmony_ci#define VOID_HANDLER(NAME, PARAMS, PARAM_FORMAT) \ 4607db96d56Sopenharmony_ci RC_HANDLER(void, NAME, PARAMS, ;, PARAM_FORMAT, ;, ;,\ 4617db96d56Sopenharmony_ci (xmlparseobject *)userData) 4627db96d56Sopenharmony_ci 4637db96d56Sopenharmony_ci#define INT_HANDLER(NAME, PARAMS, PARAM_FORMAT)\ 4647db96d56Sopenharmony_ci RC_HANDLER(int, NAME, PARAMS, int rc=0;, PARAM_FORMAT, \ 4657db96d56Sopenharmony_ci rc = PyLong_AsLong(rv);, rc, \ 4667db96d56Sopenharmony_ci (xmlparseobject *)userData) 4677db96d56Sopenharmony_ci 4687db96d56Sopenharmony_ciVOID_HANDLER(EndElement, 4697db96d56Sopenharmony_ci (void *userData, const XML_Char *name), 4707db96d56Sopenharmony_ci ("(N)", string_intern(self, name))) 4717db96d56Sopenharmony_ci 4727db96d56Sopenharmony_ciVOID_HANDLER(ProcessingInstruction, 4737db96d56Sopenharmony_ci (void *userData, 4747db96d56Sopenharmony_ci const XML_Char *target, 4757db96d56Sopenharmony_ci const XML_Char *data), 4767db96d56Sopenharmony_ci ("(NO&)", string_intern(self, target), conv_string_to_unicode ,data)) 4777db96d56Sopenharmony_ci 4787db96d56Sopenharmony_ciVOID_HANDLER(UnparsedEntityDecl, 4797db96d56Sopenharmony_ci (void *userData, 4807db96d56Sopenharmony_ci const XML_Char *entityName, 4817db96d56Sopenharmony_ci const XML_Char *base, 4827db96d56Sopenharmony_ci const XML_Char *systemId, 4837db96d56Sopenharmony_ci const XML_Char *publicId, 4847db96d56Sopenharmony_ci const XML_Char *notationName), 4857db96d56Sopenharmony_ci ("(NNNNN)", 4867db96d56Sopenharmony_ci string_intern(self, entityName), string_intern(self, base), 4877db96d56Sopenharmony_ci string_intern(self, systemId), string_intern(self, publicId), 4887db96d56Sopenharmony_ci string_intern(self, notationName))) 4897db96d56Sopenharmony_ci 4907db96d56Sopenharmony_ciVOID_HANDLER(EntityDecl, 4917db96d56Sopenharmony_ci (void *userData, 4927db96d56Sopenharmony_ci const XML_Char *entityName, 4937db96d56Sopenharmony_ci int is_parameter_entity, 4947db96d56Sopenharmony_ci const XML_Char *value, 4957db96d56Sopenharmony_ci int value_length, 4967db96d56Sopenharmony_ci const XML_Char *base, 4977db96d56Sopenharmony_ci const XML_Char *systemId, 4987db96d56Sopenharmony_ci const XML_Char *publicId, 4997db96d56Sopenharmony_ci const XML_Char *notationName), 5007db96d56Sopenharmony_ci ("NiNNNNN", 5017db96d56Sopenharmony_ci string_intern(self, entityName), is_parameter_entity, 5027db96d56Sopenharmony_ci (conv_string_len_to_unicode(value, value_length)), 5037db96d56Sopenharmony_ci string_intern(self, base), string_intern(self, systemId), 5047db96d56Sopenharmony_ci string_intern(self, publicId), 5057db96d56Sopenharmony_ci string_intern(self, notationName))) 5067db96d56Sopenharmony_ci 5077db96d56Sopenharmony_ciVOID_HANDLER(XmlDecl, 5087db96d56Sopenharmony_ci (void *userData, 5097db96d56Sopenharmony_ci const XML_Char *version, 5107db96d56Sopenharmony_ci const XML_Char *encoding, 5117db96d56Sopenharmony_ci int standalone), 5127db96d56Sopenharmony_ci ("(O&O&i)", 5137db96d56Sopenharmony_ci conv_string_to_unicode ,version, conv_string_to_unicode ,encoding, 5147db96d56Sopenharmony_ci standalone)) 5157db96d56Sopenharmony_ci 5167db96d56Sopenharmony_cistatic PyObject * 5177db96d56Sopenharmony_ciconv_content_model(XML_Content * const model, 5187db96d56Sopenharmony_ci PyObject *(*conv_string)(const XML_Char *)) 5197db96d56Sopenharmony_ci{ 5207db96d56Sopenharmony_ci PyObject *result = NULL; 5217db96d56Sopenharmony_ci PyObject *children = PyTuple_New(model->numchildren); 5227db96d56Sopenharmony_ci int i; 5237db96d56Sopenharmony_ci 5247db96d56Sopenharmony_ci if (children != NULL) { 5257db96d56Sopenharmony_ci assert(model->numchildren < INT_MAX); 5267db96d56Sopenharmony_ci for (i = 0; i < (int)model->numchildren; ++i) { 5277db96d56Sopenharmony_ci PyObject *child = conv_content_model(&model->children[i], 5287db96d56Sopenharmony_ci conv_string); 5297db96d56Sopenharmony_ci if (child == NULL) { 5307db96d56Sopenharmony_ci Py_XDECREF(children); 5317db96d56Sopenharmony_ci return NULL; 5327db96d56Sopenharmony_ci } 5337db96d56Sopenharmony_ci PyTuple_SET_ITEM(children, i, child); 5347db96d56Sopenharmony_ci } 5357db96d56Sopenharmony_ci result = Py_BuildValue("(iiO&N)", 5367db96d56Sopenharmony_ci model->type, model->quant, 5377db96d56Sopenharmony_ci conv_string,model->name, children); 5387db96d56Sopenharmony_ci } 5397db96d56Sopenharmony_ci return result; 5407db96d56Sopenharmony_ci} 5417db96d56Sopenharmony_ci 5427db96d56Sopenharmony_cistatic void 5437db96d56Sopenharmony_cimy_ElementDeclHandler(void *userData, 5447db96d56Sopenharmony_ci const XML_Char *name, 5457db96d56Sopenharmony_ci XML_Content *model) 5467db96d56Sopenharmony_ci{ 5477db96d56Sopenharmony_ci xmlparseobject *self = (xmlparseobject *)userData; 5487db96d56Sopenharmony_ci PyObject *args = NULL; 5497db96d56Sopenharmony_ci 5507db96d56Sopenharmony_ci if (have_handler(self, ElementDecl)) { 5517db96d56Sopenharmony_ci PyObject *rv = NULL; 5527db96d56Sopenharmony_ci PyObject *modelobj, *nameobj; 5537db96d56Sopenharmony_ci 5547db96d56Sopenharmony_ci if (PyErr_Occurred()) 5557db96d56Sopenharmony_ci return; 5567db96d56Sopenharmony_ci 5577db96d56Sopenharmony_ci if (flush_character_buffer(self) < 0) 5587db96d56Sopenharmony_ci goto finally; 5597db96d56Sopenharmony_ci modelobj = conv_content_model(model, (conv_string_to_unicode)); 5607db96d56Sopenharmony_ci if (modelobj == NULL) { 5617db96d56Sopenharmony_ci flag_error(self); 5627db96d56Sopenharmony_ci goto finally; 5637db96d56Sopenharmony_ci } 5647db96d56Sopenharmony_ci nameobj = string_intern(self, name); 5657db96d56Sopenharmony_ci if (nameobj == NULL) { 5667db96d56Sopenharmony_ci Py_DECREF(modelobj); 5677db96d56Sopenharmony_ci flag_error(self); 5687db96d56Sopenharmony_ci goto finally; 5697db96d56Sopenharmony_ci } 5707db96d56Sopenharmony_ci args = Py_BuildValue("NN", nameobj, modelobj); 5717db96d56Sopenharmony_ci if (args == NULL) { 5727db96d56Sopenharmony_ci flag_error(self); 5737db96d56Sopenharmony_ci goto finally; 5747db96d56Sopenharmony_ci } 5757db96d56Sopenharmony_ci self->in_callback = 1; 5767db96d56Sopenharmony_ci rv = call_with_frame("ElementDecl", __LINE__, 5777db96d56Sopenharmony_ci self->handlers[ElementDecl], args, self); 5787db96d56Sopenharmony_ci self->in_callback = 0; 5797db96d56Sopenharmony_ci if (rv == NULL) { 5807db96d56Sopenharmony_ci flag_error(self); 5817db96d56Sopenharmony_ci goto finally; 5827db96d56Sopenharmony_ci } 5837db96d56Sopenharmony_ci Py_DECREF(rv); 5847db96d56Sopenharmony_ci } 5857db96d56Sopenharmony_ci finally: 5867db96d56Sopenharmony_ci Py_XDECREF(args); 5877db96d56Sopenharmony_ci XML_FreeContentModel(self->itself, model); 5887db96d56Sopenharmony_ci return; 5897db96d56Sopenharmony_ci} 5907db96d56Sopenharmony_ci 5917db96d56Sopenharmony_ciVOID_HANDLER(AttlistDecl, 5927db96d56Sopenharmony_ci (void *userData, 5937db96d56Sopenharmony_ci const XML_Char *elname, 5947db96d56Sopenharmony_ci const XML_Char *attname, 5957db96d56Sopenharmony_ci const XML_Char *att_type, 5967db96d56Sopenharmony_ci const XML_Char *dflt, 5977db96d56Sopenharmony_ci int isrequired), 5987db96d56Sopenharmony_ci ("(NNO&O&i)", 5997db96d56Sopenharmony_ci string_intern(self, elname), string_intern(self, attname), 6007db96d56Sopenharmony_ci conv_string_to_unicode ,att_type, conv_string_to_unicode ,dflt, 6017db96d56Sopenharmony_ci isrequired)) 6027db96d56Sopenharmony_ci 6037db96d56Sopenharmony_ci#if XML_COMBINED_VERSION >= 19504 6047db96d56Sopenharmony_ciVOID_HANDLER(SkippedEntity, 6057db96d56Sopenharmony_ci (void *userData, 6067db96d56Sopenharmony_ci const XML_Char *entityName, 6077db96d56Sopenharmony_ci int is_parameter_entity), 6087db96d56Sopenharmony_ci ("Ni", 6097db96d56Sopenharmony_ci string_intern(self, entityName), is_parameter_entity)) 6107db96d56Sopenharmony_ci#endif 6117db96d56Sopenharmony_ci 6127db96d56Sopenharmony_ciVOID_HANDLER(NotationDecl, 6137db96d56Sopenharmony_ci (void *userData, 6147db96d56Sopenharmony_ci const XML_Char *notationName, 6157db96d56Sopenharmony_ci const XML_Char *base, 6167db96d56Sopenharmony_ci const XML_Char *systemId, 6177db96d56Sopenharmony_ci const XML_Char *publicId), 6187db96d56Sopenharmony_ci ("(NNNN)", 6197db96d56Sopenharmony_ci string_intern(self, notationName), string_intern(self, base), 6207db96d56Sopenharmony_ci string_intern(self, systemId), string_intern(self, publicId))) 6217db96d56Sopenharmony_ci 6227db96d56Sopenharmony_ciVOID_HANDLER(StartNamespaceDecl, 6237db96d56Sopenharmony_ci (void *userData, 6247db96d56Sopenharmony_ci const XML_Char *prefix, 6257db96d56Sopenharmony_ci const XML_Char *uri), 6267db96d56Sopenharmony_ci ("(NN)", 6277db96d56Sopenharmony_ci string_intern(self, prefix), string_intern(self, uri))) 6287db96d56Sopenharmony_ci 6297db96d56Sopenharmony_ciVOID_HANDLER(EndNamespaceDecl, 6307db96d56Sopenharmony_ci (void *userData, 6317db96d56Sopenharmony_ci const XML_Char *prefix), 6327db96d56Sopenharmony_ci ("(N)", string_intern(self, prefix))) 6337db96d56Sopenharmony_ci 6347db96d56Sopenharmony_ciVOID_HANDLER(Comment, 6357db96d56Sopenharmony_ci (void *userData, const XML_Char *data), 6367db96d56Sopenharmony_ci ("(O&)", conv_string_to_unicode ,data)) 6377db96d56Sopenharmony_ci 6387db96d56Sopenharmony_ciVOID_HANDLER(StartCdataSection, 6397db96d56Sopenharmony_ci (void *userData), 6407db96d56Sopenharmony_ci ("()")) 6417db96d56Sopenharmony_ci 6427db96d56Sopenharmony_ciVOID_HANDLER(EndCdataSection, 6437db96d56Sopenharmony_ci (void *userData), 6447db96d56Sopenharmony_ci ("()")) 6457db96d56Sopenharmony_ci 6467db96d56Sopenharmony_ciVOID_HANDLER(Default, 6477db96d56Sopenharmony_ci (void *userData, const XML_Char *s, int len), 6487db96d56Sopenharmony_ci ("(N)", (conv_string_len_to_unicode(s,len)))) 6497db96d56Sopenharmony_ci 6507db96d56Sopenharmony_ciVOID_HANDLER(DefaultHandlerExpand, 6517db96d56Sopenharmony_ci (void *userData, const XML_Char *s, int len), 6527db96d56Sopenharmony_ci ("(N)", (conv_string_len_to_unicode(s,len)))) 6537db96d56Sopenharmony_ci#define my_DefaultHandlerExpand my_DefaultHandlerExpandHandler 6547db96d56Sopenharmony_ci 6557db96d56Sopenharmony_ciINT_HANDLER(NotStandalone, 6567db96d56Sopenharmony_ci (void *userData), 6577db96d56Sopenharmony_ci ("()")) 6587db96d56Sopenharmony_ci 6597db96d56Sopenharmony_ciRC_HANDLER(int, ExternalEntityRef, 6607db96d56Sopenharmony_ci (XML_Parser parser, 6617db96d56Sopenharmony_ci const XML_Char *context, 6627db96d56Sopenharmony_ci const XML_Char *base, 6637db96d56Sopenharmony_ci const XML_Char *systemId, 6647db96d56Sopenharmony_ci const XML_Char *publicId), 6657db96d56Sopenharmony_ci int rc=0;, 6667db96d56Sopenharmony_ci ("(O&NNN)", 6677db96d56Sopenharmony_ci conv_string_to_unicode ,context, string_intern(self, base), 6687db96d56Sopenharmony_ci string_intern(self, systemId), string_intern(self, publicId)), 6697db96d56Sopenharmony_ci rc = PyLong_AsLong(rv);, rc, 6707db96d56Sopenharmony_ci XML_GetUserData(parser)) 6717db96d56Sopenharmony_ci 6727db96d56Sopenharmony_ci/* XXX UnknownEncodingHandler */ 6737db96d56Sopenharmony_ci 6747db96d56Sopenharmony_ciVOID_HANDLER(StartDoctypeDecl, 6757db96d56Sopenharmony_ci (void *userData, const XML_Char *doctypeName, 6767db96d56Sopenharmony_ci const XML_Char *sysid, const XML_Char *pubid, 6777db96d56Sopenharmony_ci int has_internal_subset), 6787db96d56Sopenharmony_ci ("(NNNi)", string_intern(self, doctypeName), 6797db96d56Sopenharmony_ci string_intern(self, sysid), string_intern(self, pubid), 6807db96d56Sopenharmony_ci has_internal_subset)) 6817db96d56Sopenharmony_ci 6827db96d56Sopenharmony_ciVOID_HANDLER(EndDoctypeDecl, (void *userData), ("()")) 6837db96d56Sopenharmony_ci 6847db96d56Sopenharmony_ci/* ---------------------------------------------------------------- */ 6857db96d56Sopenharmony_ci/*[clinic input] 6867db96d56Sopenharmony_ciclass pyexpat.xmlparser "xmlparseobject *" "&Xmlparsetype" 6877db96d56Sopenharmony_ci[clinic start generated code]*/ 6887db96d56Sopenharmony_ci/*[clinic end generated code: output=da39a3ee5e6b4b0d input=2393162385232e1c]*/ 6897db96d56Sopenharmony_ci 6907db96d56Sopenharmony_ci 6917db96d56Sopenharmony_cistatic PyObject * 6927db96d56Sopenharmony_ciget_parse_result(pyexpat_state *state, xmlparseobject *self, int rv) 6937db96d56Sopenharmony_ci{ 6947db96d56Sopenharmony_ci if (PyErr_Occurred()) { 6957db96d56Sopenharmony_ci return NULL; 6967db96d56Sopenharmony_ci } 6977db96d56Sopenharmony_ci if (rv == 0) { 6987db96d56Sopenharmony_ci return set_error(state, self, XML_GetErrorCode(self->itself)); 6997db96d56Sopenharmony_ci } 7007db96d56Sopenharmony_ci if (flush_character_buffer(self) < 0) { 7017db96d56Sopenharmony_ci return NULL; 7027db96d56Sopenharmony_ci } 7037db96d56Sopenharmony_ci return PyLong_FromLong(rv); 7047db96d56Sopenharmony_ci} 7057db96d56Sopenharmony_ci 7067db96d56Sopenharmony_ci#define MAX_CHUNK_SIZE (1 << 20) 7077db96d56Sopenharmony_ci 7087db96d56Sopenharmony_ci/*[clinic input] 7097db96d56Sopenharmony_cipyexpat.xmlparser.Parse 7107db96d56Sopenharmony_ci 7117db96d56Sopenharmony_ci cls: defining_class 7127db96d56Sopenharmony_ci data: object 7137db96d56Sopenharmony_ci isfinal: bool(accept={int}) = False 7147db96d56Sopenharmony_ci / 7157db96d56Sopenharmony_ci 7167db96d56Sopenharmony_ciParse XML data. 7177db96d56Sopenharmony_ci 7187db96d56Sopenharmony_ci`isfinal' should be true at end of input. 7197db96d56Sopenharmony_ci[clinic start generated code]*/ 7207db96d56Sopenharmony_ci 7217db96d56Sopenharmony_cistatic PyObject * 7227db96d56Sopenharmony_cipyexpat_xmlparser_Parse_impl(xmlparseobject *self, PyTypeObject *cls, 7237db96d56Sopenharmony_ci PyObject *data, int isfinal) 7247db96d56Sopenharmony_ci/*[clinic end generated code: output=8faffe07fe1f862a input=fc97f833558ca715]*/ 7257db96d56Sopenharmony_ci{ 7267db96d56Sopenharmony_ci const char *s; 7277db96d56Sopenharmony_ci Py_ssize_t slen; 7287db96d56Sopenharmony_ci Py_buffer view; 7297db96d56Sopenharmony_ci int rc; 7307db96d56Sopenharmony_ci pyexpat_state *state = PyType_GetModuleState(cls); 7317db96d56Sopenharmony_ci 7327db96d56Sopenharmony_ci if (PyUnicode_Check(data)) { 7337db96d56Sopenharmony_ci view.buf = NULL; 7347db96d56Sopenharmony_ci s = PyUnicode_AsUTF8AndSize(data, &slen); 7357db96d56Sopenharmony_ci if (s == NULL) 7367db96d56Sopenharmony_ci return NULL; 7377db96d56Sopenharmony_ci /* Explicitly set UTF-8 encoding. Return code ignored. */ 7387db96d56Sopenharmony_ci (void)XML_SetEncoding(self->itself, "utf-8"); 7397db96d56Sopenharmony_ci } 7407db96d56Sopenharmony_ci else { 7417db96d56Sopenharmony_ci if (PyObject_GetBuffer(data, &view, PyBUF_SIMPLE) < 0) 7427db96d56Sopenharmony_ci return NULL; 7437db96d56Sopenharmony_ci s = view.buf; 7447db96d56Sopenharmony_ci slen = view.len; 7457db96d56Sopenharmony_ci } 7467db96d56Sopenharmony_ci 7477db96d56Sopenharmony_ci static_assert(MAX_CHUNK_SIZE <= INT_MAX, 7487db96d56Sopenharmony_ci "MAX_CHUNK_SIZE is larger than INT_MAX"); 7497db96d56Sopenharmony_ci while (slen > MAX_CHUNK_SIZE) { 7507db96d56Sopenharmony_ci rc = XML_Parse(self->itself, s, MAX_CHUNK_SIZE, 0); 7517db96d56Sopenharmony_ci if (!rc) 7527db96d56Sopenharmony_ci goto done; 7537db96d56Sopenharmony_ci s += MAX_CHUNK_SIZE; 7547db96d56Sopenharmony_ci slen -= MAX_CHUNK_SIZE; 7557db96d56Sopenharmony_ci } 7567db96d56Sopenharmony_ci 7577db96d56Sopenharmony_ci assert(slen <= INT_MAX); 7587db96d56Sopenharmony_ci rc = XML_Parse(self->itself, s, (int)slen, isfinal); 7597db96d56Sopenharmony_ci 7607db96d56Sopenharmony_cidone: 7617db96d56Sopenharmony_ci if (view.buf != NULL) { 7627db96d56Sopenharmony_ci PyBuffer_Release(&view); 7637db96d56Sopenharmony_ci } 7647db96d56Sopenharmony_ci return get_parse_result(state, self, rc); 7657db96d56Sopenharmony_ci} 7667db96d56Sopenharmony_ci 7677db96d56Sopenharmony_ci/* File reading copied from cPickle */ 7687db96d56Sopenharmony_ci 7697db96d56Sopenharmony_ci#define BUF_SIZE 2048 7707db96d56Sopenharmony_ci 7717db96d56Sopenharmony_cistatic int 7727db96d56Sopenharmony_cireadinst(char *buf, int buf_size, PyObject *meth) 7737db96d56Sopenharmony_ci{ 7747db96d56Sopenharmony_ci PyObject *str; 7757db96d56Sopenharmony_ci Py_ssize_t len; 7767db96d56Sopenharmony_ci const char *ptr; 7777db96d56Sopenharmony_ci 7787db96d56Sopenharmony_ci str = PyObject_CallFunction(meth, "i", buf_size); 7797db96d56Sopenharmony_ci if (str == NULL) 7807db96d56Sopenharmony_ci goto error; 7817db96d56Sopenharmony_ci 7827db96d56Sopenharmony_ci if (PyBytes_Check(str)) 7837db96d56Sopenharmony_ci ptr = PyBytes_AS_STRING(str); 7847db96d56Sopenharmony_ci else if (PyByteArray_Check(str)) 7857db96d56Sopenharmony_ci ptr = PyByteArray_AS_STRING(str); 7867db96d56Sopenharmony_ci else { 7877db96d56Sopenharmony_ci PyErr_Format(PyExc_TypeError, 7887db96d56Sopenharmony_ci "read() did not return a bytes object (type=%.400s)", 7897db96d56Sopenharmony_ci Py_TYPE(str)->tp_name); 7907db96d56Sopenharmony_ci goto error; 7917db96d56Sopenharmony_ci } 7927db96d56Sopenharmony_ci len = Py_SIZE(str); 7937db96d56Sopenharmony_ci if (len > buf_size) { 7947db96d56Sopenharmony_ci PyErr_Format(PyExc_ValueError, 7957db96d56Sopenharmony_ci "read() returned too much data: " 7967db96d56Sopenharmony_ci "%i bytes requested, %zd returned", 7977db96d56Sopenharmony_ci buf_size, len); 7987db96d56Sopenharmony_ci goto error; 7997db96d56Sopenharmony_ci } 8007db96d56Sopenharmony_ci memcpy(buf, ptr, len); 8017db96d56Sopenharmony_ci Py_DECREF(str); 8027db96d56Sopenharmony_ci /* len <= buf_size <= INT_MAX */ 8037db96d56Sopenharmony_ci return (int)len; 8047db96d56Sopenharmony_ci 8057db96d56Sopenharmony_cierror: 8067db96d56Sopenharmony_ci Py_XDECREF(str); 8077db96d56Sopenharmony_ci return -1; 8087db96d56Sopenharmony_ci} 8097db96d56Sopenharmony_ci 8107db96d56Sopenharmony_ci/*[clinic input] 8117db96d56Sopenharmony_cipyexpat.xmlparser.ParseFile 8127db96d56Sopenharmony_ci 8137db96d56Sopenharmony_ci cls: defining_class 8147db96d56Sopenharmony_ci file: object 8157db96d56Sopenharmony_ci / 8167db96d56Sopenharmony_ci 8177db96d56Sopenharmony_ciParse XML data from file-like object. 8187db96d56Sopenharmony_ci[clinic start generated code]*/ 8197db96d56Sopenharmony_ci 8207db96d56Sopenharmony_cistatic PyObject * 8217db96d56Sopenharmony_cipyexpat_xmlparser_ParseFile_impl(xmlparseobject *self, PyTypeObject *cls, 8227db96d56Sopenharmony_ci PyObject *file) 8237db96d56Sopenharmony_ci/*[clinic end generated code: output=34780a094c8ca3ae input=ba4bc9c541684793]*/ 8247db96d56Sopenharmony_ci{ 8257db96d56Sopenharmony_ci int rv = 1; 8267db96d56Sopenharmony_ci PyObject *readmethod = NULL; 8277db96d56Sopenharmony_ci 8287db96d56Sopenharmony_ci pyexpat_state *state = PyType_GetModuleState(cls); 8297db96d56Sopenharmony_ci 8307db96d56Sopenharmony_ci if (_PyObject_LookupAttr(file, state->str_read, &readmethod) < 0) { 8317db96d56Sopenharmony_ci return NULL; 8327db96d56Sopenharmony_ci } 8337db96d56Sopenharmony_ci if (readmethod == NULL) { 8347db96d56Sopenharmony_ci PyErr_SetString(PyExc_TypeError, 8357db96d56Sopenharmony_ci "argument must have 'read' attribute"); 8367db96d56Sopenharmony_ci return NULL; 8377db96d56Sopenharmony_ci } 8387db96d56Sopenharmony_ci for (;;) { 8397db96d56Sopenharmony_ci int bytes_read; 8407db96d56Sopenharmony_ci void *buf = XML_GetBuffer(self->itself, BUF_SIZE); 8417db96d56Sopenharmony_ci if (buf == NULL) { 8427db96d56Sopenharmony_ci Py_XDECREF(readmethod); 8437db96d56Sopenharmony_ci return get_parse_result(state, self, 0); 8447db96d56Sopenharmony_ci } 8457db96d56Sopenharmony_ci 8467db96d56Sopenharmony_ci bytes_read = readinst(buf, BUF_SIZE, readmethod); 8477db96d56Sopenharmony_ci if (bytes_read < 0) { 8487db96d56Sopenharmony_ci Py_DECREF(readmethod); 8497db96d56Sopenharmony_ci return NULL; 8507db96d56Sopenharmony_ci } 8517db96d56Sopenharmony_ci rv = XML_ParseBuffer(self->itself, bytes_read, bytes_read == 0); 8527db96d56Sopenharmony_ci if (PyErr_Occurred()) { 8537db96d56Sopenharmony_ci Py_XDECREF(readmethod); 8547db96d56Sopenharmony_ci return NULL; 8557db96d56Sopenharmony_ci } 8567db96d56Sopenharmony_ci 8577db96d56Sopenharmony_ci if (!rv || bytes_read == 0) 8587db96d56Sopenharmony_ci break; 8597db96d56Sopenharmony_ci } 8607db96d56Sopenharmony_ci Py_XDECREF(readmethod); 8617db96d56Sopenharmony_ci return get_parse_result(state, self, rv); 8627db96d56Sopenharmony_ci} 8637db96d56Sopenharmony_ci 8647db96d56Sopenharmony_ci/*[clinic input] 8657db96d56Sopenharmony_cipyexpat.xmlparser.SetBase 8667db96d56Sopenharmony_ci 8677db96d56Sopenharmony_ci base: str 8687db96d56Sopenharmony_ci / 8697db96d56Sopenharmony_ci 8707db96d56Sopenharmony_ciSet the base URL for the parser. 8717db96d56Sopenharmony_ci[clinic start generated code]*/ 8727db96d56Sopenharmony_ci 8737db96d56Sopenharmony_cistatic PyObject * 8747db96d56Sopenharmony_cipyexpat_xmlparser_SetBase_impl(xmlparseobject *self, const char *base) 8757db96d56Sopenharmony_ci/*[clinic end generated code: output=c212ddceb607b539 input=c684e5de895ee1a8]*/ 8767db96d56Sopenharmony_ci{ 8777db96d56Sopenharmony_ci if (!XML_SetBase(self->itself, base)) { 8787db96d56Sopenharmony_ci return PyErr_NoMemory(); 8797db96d56Sopenharmony_ci } 8807db96d56Sopenharmony_ci Py_RETURN_NONE; 8817db96d56Sopenharmony_ci} 8827db96d56Sopenharmony_ci 8837db96d56Sopenharmony_ci/*[clinic input] 8847db96d56Sopenharmony_cipyexpat.xmlparser.GetBase 8857db96d56Sopenharmony_ci 8867db96d56Sopenharmony_ciReturn base URL string for the parser. 8877db96d56Sopenharmony_ci[clinic start generated code]*/ 8887db96d56Sopenharmony_ci 8897db96d56Sopenharmony_cistatic PyObject * 8907db96d56Sopenharmony_cipyexpat_xmlparser_GetBase_impl(xmlparseobject *self) 8917db96d56Sopenharmony_ci/*[clinic end generated code: output=2886cb21f9a8739a input=918d71c38009620e]*/ 8927db96d56Sopenharmony_ci{ 8937db96d56Sopenharmony_ci return Py_BuildValue("z", XML_GetBase(self->itself)); 8947db96d56Sopenharmony_ci} 8957db96d56Sopenharmony_ci 8967db96d56Sopenharmony_ci/*[clinic input] 8977db96d56Sopenharmony_cipyexpat.xmlparser.GetInputContext 8987db96d56Sopenharmony_ci 8997db96d56Sopenharmony_ciReturn the untranslated text of the input that caused the current event. 9007db96d56Sopenharmony_ci 9017db96d56Sopenharmony_ciIf the event was generated by a large amount of text (such as a start tag 9027db96d56Sopenharmony_cifor an element with many attributes), not all of the text may be available. 9037db96d56Sopenharmony_ci[clinic start generated code]*/ 9047db96d56Sopenharmony_ci 9057db96d56Sopenharmony_cistatic PyObject * 9067db96d56Sopenharmony_cipyexpat_xmlparser_GetInputContext_impl(xmlparseobject *self) 9077db96d56Sopenharmony_ci/*[clinic end generated code: output=a88026d683fc22cc input=034df8712db68379]*/ 9087db96d56Sopenharmony_ci{ 9097db96d56Sopenharmony_ci if (self->in_callback) { 9107db96d56Sopenharmony_ci int offset, size; 9117db96d56Sopenharmony_ci const char *buffer 9127db96d56Sopenharmony_ci = XML_GetInputContext(self->itself, &offset, &size); 9137db96d56Sopenharmony_ci 9147db96d56Sopenharmony_ci if (buffer != NULL) 9157db96d56Sopenharmony_ci return PyBytes_FromStringAndSize(buffer + offset, 9167db96d56Sopenharmony_ci size - offset); 9177db96d56Sopenharmony_ci else 9187db96d56Sopenharmony_ci Py_RETURN_NONE; 9197db96d56Sopenharmony_ci } 9207db96d56Sopenharmony_ci else 9217db96d56Sopenharmony_ci Py_RETURN_NONE; 9227db96d56Sopenharmony_ci} 9237db96d56Sopenharmony_ci 9247db96d56Sopenharmony_ci/*[clinic input] 9257db96d56Sopenharmony_cipyexpat.xmlparser.ExternalEntityParserCreate 9267db96d56Sopenharmony_ci 9277db96d56Sopenharmony_ci cls: defining_class 9287db96d56Sopenharmony_ci context: str(accept={str, NoneType}) 9297db96d56Sopenharmony_ci encoding: str = NULL 9307db96d56Sopenharmony_ci / 9317db96d56Sopenharmony_ci 9327db96d56Sopenharmony_ciCreate a parser for parsing an external entity based on the information passed to the ExternalEntityRefHandler. 9337db96d56Sopenharmony_ci[clinic start generated code]*/ 9347db96d56Sopenharmony_ci 9357db96d56Sopenharmony_cistatic PyObject * 9367db96d56Sopenharmony_cipyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self, 9377db96d56Sopenharmony_ci PyTypeObject *cls, 9387db96d56Sopenharmony_ci const char *context, 9397db96d56Sopenharmony_ci const char *encoding) 9407db96d56Sopenharmony_ci/*[clinic end generated code: output=01d4472b49cb3f92 input=ec70c6b9e6e9619a]*/ 9417db96d56Sopenharmony_ci{ 9427db96d56Sopenharmony_ci xmlparseobject *new_parser; 9437db96d56Sopenharmony_ci int i; 9447db96d56Sopenharmony_ci 9457db96d56Sopenharmony_ci pyexpat_state *state = PyType_GetModuleState(cls); 9467db96d56Sopenharmony_ci 9477db96d56Sopenharmony_ci new_parser = PyObject_GC_New(xmlparseobject, state->xml_parse_type); 9487db96d56Sopenharmony_ci if (new_parser == NULL) { 9497db96d56Sopenharmony_ci return NULL; 9507db96d56Sopenharmony_ci } 9517db96d56Sopenharmony_ci 9527db96d56Sopenharmony_ci new_parser->buffer_size = self->buffer_size; 9537db96d56Sopenharmony_ci new_parser->buffer_used = 0; 9547db96d56Sopenharmony_ci new_parser->buffer = NULL; 9557db96d56Sopenharmony_ci new_parser->ordered_attributes = self->ordered_attributes; 9567db96d56Sopenharmony_ci new_parser->specified_attributes = self->specified_attributes; 9577db96d56Sopenharmony_ci new_parser->in_callback = 0; 9587db96d56Sopenharmony_ci new_parser->ns_prefixes = self->ns_prefixes; 9597db96d56Sopenharmony_ci new_parser->itself = XML_ExternalEntityParserCreate(self->itself, context, 9607db96d56Sopenharmony_ci encoding); 9617db96d56Sopenharmony_ci new_parser->handlers = 0; 9627db96d56Sopenharmony_ci new_parser->intern = self->intern; 9637db96d56Sopenharmony_ci Py_XINCREF(new_parser->intern); 9647db96d56Sopenharmony_ci 9657db96d56Sopenharmony_ci if (self->buffer != NULL) { 9667db96d56Sopenharmony_ci new_parser->buffer = PyMem_Malloc(new_parser->buffer_size); 9677db96d56Sopenharmony_ci if (new_parser->buffer == NULL) { 9687db96d56Sopenharmony_ci Py_DECREF(new_parser); 9697db96d56Sopenharmony_ci return PyErr_NoMemory(); 9707db96d56Sopenharmony_ci } 9717db96d56Sopenharmony_ci } 9727db96d56Sopenharmony_ci if (!new_parser->itself) { 9737db96d56Sopenharmony_ci Py_DECREF(new_parser); 9747db96d56Sopenharmony_ci return PyErr_NoMemory(); 9757db96d56Sopenharmony_ci } 9767db96d56Sopenharmony_ci 9777db96d56Sopenharmony_ci XML_SetUserData(new_parser->itself, (void *)new_parser); 9787db96d56Sopenharmony_ci 9797db96d56Sopenharmony_ci /* allocate and clear handlers first */ 9807db96d56Sopenharmony_ci for (i = 0; handler_info[i].name != NULL; i++) 9817db96d56Sopenharmony_ci /* do nothing */; 9827db96d56Sopenharmony_ci 9837db96d56Sopenharmony_ci new_parser->handlers = PyMem_New(PyObject *, i); 9847db96d56Sopenharmony_ci if (!new_parser->handlers) { 9857db96d56Sopenharmony_ci Py_DECREF(new_parser); 9867db96d56Sopenharmony_ci return PyErr_NoMemory(); 9877db96d56Sopenharmony_ci } 9887db96d56Sopenharmony_ci clear_handlers(new_parser, 1); 9897db96d56Sopenharmony_ci 9907db96d56Sopenharmony_ci /* then copy handlers from self */ 9917db96d56Sopenharmony_ci for (i = 0; handler_info[i].name != NULL; i++) { 9927db96d56Sopenharmony_ci PyObject *handler = self->handlers[i]; 9937db96d56Sopenharmony_ci if (handler != NULL) { 9947db96d56Sopenharmony_ci Py_INCREF(handler); 9957db96d56Sopenharmony_ci new_parser->handlers[i] = handler; 9967db96d56Sopenharmony_ci handler_info[i].setter(new_parser->itself, 9977db96d56Sopenharmony_ci handler_info[i].handler); 9987db96d56Sopenharmony_ci } 9997db96d56Sopenharmony_ci } 10007db96d56Sopenharmony_ci 10017db96d56Sopenharmony_ci PyObject_GC_Track(new_parser); 10027db96d56Sopenharmony_ci return (PyObject *)new_parser; 10037db96d56Sopenharmony_ci} 10047db96d56Sopenharmony_ci 10057db96d56Sopenharmony_ci/*[clinic input] 10067db96d56Sopenharmony_cipyexpat.xmlparser.SetParamEntityParsing 10077db96d56Sopenharmony_ci 10087db96d56Sopenharmony_ci flag: int 10097db96d56Sopenharmony_ci / 10107db96d56Sopenharmony_ci 10117db96d56Sopenharmony_ciControls parsing of parameter entities (including the external DTD subset). 10127db96d56Sopenharmony_ci 10137db96d56Sopenharmony_ciPossible flag values are XML_PARAM_ENTITY_PARSING_NEVER, 10147db96d56Sopenharmony_ciXML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE and 10157db96d56Sopenharmony_ciXML_PARAM_ENTITY_PARSING_ALWAYS. Returns true if setting the flag 10167db96d56Sopenharmony_ciwas successful. 10177db96d56Sopenharmony_ci[clinic start generated code]*/ 10187db96d56Sopenharmony_ci 10197db96d56Sopenharmony_cistatic PyObject * 10207db96d56Sopenharmony_cipyexpat_xmlparser_SetParamEntityParsing_impl(xmlparseobject *self, int flag) 10217db96d56Sopenharmony_ci/*[clinic end generated code: output=18668ee8e760d64c input=8aea19b4b15e9af1]*/ 10227db96d56Sopenharmony_ci{ 10237db96d56Sopenharmony_ci flag = XML_SetParamEntityParsing(self->itself, flag); 10247db96d56Sopenharmony_ci return PyLong_FromLong(flag); 10257db96d56Sopenharmony_ci} 10267db96d56Sopenharmony_ci 10277db96d56Sopenharmony_ci 10287db96d56Sopenharmony_ci#if XML_COMBINED_VERSION >= 19505 10297db96d56Sopenharmony_ci/*[clinic input] 10307db96d56Sopenharmony_cipyexpat.xmlparser.UseForeignDTD 10317db96d56Sopenharmony_ci 10327db96d56Sopenharmony_ci cls: defining_class 10337db96d56Sopenharmony_ci flag: bool = True 10347db96d56Sopenharmony_ci / 10357db96d56Sopenharmony_ci 10367db96d56Sopenharmony_ciAllows the application to provide an artificial external subset if one is not specified as part of the document instance. 10377db96d56Sopenharmony_ci 10387db96d56Sopenharmony_ciThis readily allows the use of a 'default' document type controlled by the 10397db96d56Sopenharmony_ciapplication, while still getting the advantage of providing document type 10407db96d56Sopenharmony_ciinformation to the parser. 'flag' defaults to True if not provided. 10417db96d56Sopenharmony_ci[clinic start generated code]*/ 10427db96d56Sopenharmony_ci 10437db96d56Sopenharmony_cistatic PyObject * 10447db96d56Sopenharmony_cipyexpat_xmlparser_UseForeignDTD_impl(xmlparseobject *self, PyTypeObject *cls, 10457db96d56Sopenharmony_ci int flag) 10467db96d56Sopenharmony_ci/*[clinic end generated code: output=d7d98252bd25a20f input=23440ecb0573fb29]*/ 10477db96d56Sopenharmony_ci{ 10487db96d56Sopenharmony_ci pyexpat_state *state = PyType_GetModuleState(cls); 10497db96d56Sopenharmony_ci enum XML_Error rc; 10507db96d56Sopenharmony_ci 10517db96d56Sopenharmony_ci rc = XML_UseForeignDTD(self->itself, flag ? XML_TRUE : XML_FALSE); 10527db96d56Sopenharmony_ci if (rc != XML_ERROR_NONE) { 10537db96d56Sopenharmony_ci return set_error(state, self, rc); 10547db96d56Sopenharmony_ci } 10557db96d56Sopenharmony_ci Py_RETURN_NONE; 10567db96d56Sopenharmony_ci} 10577db96d56Sopenharmony_ci#endif 10587db96d56Sopenharmony_ci 10597db96d56Sopenharmony_cistatic struct PyMethodDef xmlparse_methods[] = { 10607db96d56Sopenharmony_ci PYEXPAT_XMLPARSER_PARSE_METHODDEF 10617db96d56Sopenharmony_ci PYEXPAT_XMLPARSER_PARSEFILE_METHODDEF 10627db96d56Sopenharmony_ci PYEXPAT_XMLPARSER_SETBASE_METHODDEF 10637db96d56Sopenharmony_ci PYEXPAT_XMLPARSER_GETBASE_METHODDEF 10647db96d56Sopenharmony_ci PYEXPAT_XMLPARSER_GETINPUTCONTEXT_METHODDEF 10657db96d56Sopenharmony_ci PYEXPAT_XMLPARSER_EXTERNALENTITYPARSERCREATE_METHODDEF 10667db96d56Sopenharmony_ci PYEXPAT_XMLPARSER_SETPARAMENTITYPARSING_METHODDEF 10677db96d56Sopenharmony_ci#if XML_COMBINED_VERSION >= 19505 10687db96d56Sopenharmony_ci PYEXPAT_XMLPARSER_USEFOREIGNDTD_METHODDEF 10697db96d56Sopenharmony_ci#endif 10707db96d56Sopenharmony_ci {NULL, NULL} /* sentinel */ 10717db96d56Sopenharmony_ci}; 10727db96d56Sopenharmony_ci 10737db96d56Sopenharmony_ci/* ---------- */ 10747db96d56Sopenharmony_ci 10757db96d56Sopenharmony_ci 10767db96d56Sopenharmony_ci 10777db96d56Sopenharmony_ci/* pyexpat international encoding support. 10787db96d56Sopenharmony_ci Make it as simple as possible. 10797db96d56Sopenharmony_ci*/ 10807db96d56Sopenharmony_ci 10817db96d56Sopenharmony_cistatic int 10827db96d56Sopenharmony_ciPyUnknownEncodingHandler(void *encodingHandlerData, 10837db96d56Sopenharmony_ci const XML_Char *name, 10847db96d56Sopenharmony_ci XML_Encoding *info) 10857db96d56Sopenharmony_ci{ 10867db96d56Sopenharmony_ci static unsigned char template_buffer[256] = {0}; 10877db96d56Sopenharmony_ci PyObject* u; 10887db96d56Sopenharmony_ci int i; 10897db96d56Sopenharmony_ci const void *data; 10907db96d56Sopenharmony_ci unsigned int kind; 10917db96d56Sopenharmony_ci 10927db96d56Sopenharmony_ci if (PyErr_Occurred()) 10937db96d56Sopenharmony_ci return XML_STATUS_ERROR; 10947db96d56Sopenharmony_ci 10957db96d56Sopenharmony_ci if (template_buffer[1] == 0) { 10967db96d56Sopenharmony_ci for (i = 0; i < 256; i++) 10977db96d56Sopenharmony_ci template_buffer[i] = i; 10987db96d56Sopenharmony_ci } 10997db96d56Sopenharmony_ci 11007db96d56Sopenharmony_ci u = PyUnicode_Decode((char*) template_buffer, 256, name, "replace"); 11017db96d56Sopenharmony_ci if (u == NULL || PyUnicode_READY(u)) { 11027db96d56Sopenharmony_ci Py_XDECREF(u); 11037db96d56Sopenharmony_ci return XML_STATUS_ERROR; 11047db96d56Sopenharmony_ci } 11057db96d56Sopenharmony_ci 11067db96d56Sopenharmony_ci if (PyUnicode_GET_LENGTH(u) != 256) { 11077db96d56Sopenharmony_ci Py_DECREF(u); 11087db96d56Sopenharmony_ci PyErr_SetString(PyExc_ValueError, 11097db96d56Sopenharmony_ci "multi-byte encodings are not supported"); 11107db96d56Sopenharmony_ci return XML_STATUS_ERROR; 11117db96d56Sopenharmony_ci } 11127db96d56Sopenharmony_ci 11137db96d56Sopenharmony_ci kind = PyUnicode_KIND(u); 11147db96d56Sopenharmony_ci data = PyUnicode_DATA(u); 11157db96d56Sopenharmony_ci for (i = 0; i < 256; i++) { 11167db96d56Sopenharmony_ci Py_UCS4 ch = PyUnicode_READ(kind, data, i); 11177db96d56Sopenharmony_ci if (ch != Py_UNICODE_REPLACEMENT_CHARACTER) 11187db96d56Sopenharmony_ci info->map[i] = ch; 11197db96d56Sopenharmony_ci else 11207db96d56Sopenharmony_ci info->map[i] = -1; 11217db96d56Sopenharmony_ci } 11227db96d56Sopenharmony_ci 11237db96d56Sopenharmony_ci info->data = NULL; 11247db96d56Sopenharmony_ci info->convert = NULL; 11257db96d56Sopenharmony_ci info->release = NULL; 11267db96d56Sopenharmony_ci Py_DECREF(u); 11277db96d56Sopenharmony_ci 11287db96d56Sopenharmony_ci return XML_STATUS_OK; 11297db96d56Sopenharmony_ci} 11307db96d56Sopenharmony_ci 11317db96d56Sopenharmony_ci 11327db96d56Sopenharmony_cistatic PyObject * 11337db96d56Sopenharmony_cinewxmlparseobject(pyexpat_state *state, const char *encoding, 11347db96d56Sopenharmony_ci const char *namespace_separator, PyObject *intern) 11357db96d56Sopenharmony_ci{ 11367db96d56Sopenharmony_ci int i; 11377db96d56Sopenharmony_ci xmlparseobject *self; 11387db96d56Sopenharmony_ci 11397db96d56Sopenharmony_ci self = PyObject_GC_New(xmlparseobject, state->xml_parse_type); 11407db96d56Sopenharmony_ci if (self == NULL) 11417db96d56Sopenharmony_ci return NULL; 11427db96d56Sopenharmony_ci 11437db96d56Sopenharmony_ci self->buffer = NULL; 11447db96d56Sopenharmony_ci self->buffer_size = CHARACTER_DATA_BUFFER_SIZE; 11457db96d56Sopenharmony_ci self->buffer_used = 0; 11467db96d56Sopenharmony_ci self->ordered_attributes = 0; 11477db96d56Sopenharmony_ci self->specified_attributes = 0; 11487db96d56Sopenharmony_ci self->in_callback = 0; 11497db96d56Sopenharmony_ci self->ns_prefixes = 0; 11507db96d56Sopenharmony_ci self->handlers = NULL; 11517db96d56Sopenharmony_ci self->intern = intern; 11527db96d56Sopenharmony_ci Py_XINCREF(self->intern); 11537db96d56Sopenharmony_ci 11547db96d56Sopenharmony_ci /* namespace_separator is either NULL or contains one char + \0 */ 11557db96d56Sopenharmony_ci self->itself = XML_ParserCreate_MM(encoding, &ExpatMemoryHandler, 11567db96d56Sopenharmony_ci namespace_separator); 11577db96d56Sopenharmony_ci if (self->itself == NULL) { 11587db96d56Sopenharmony_ci PyErr_SetString(PyExc_RuntimeError, 11597db96d56Sopenharmony_ci "XML_ParserCreate failed"); 11607db96d56Sopenharmony_ci Py_DECREF(self); 11617db96d56Sopenharmony_ci return NULL; 11627db96d56Sopenharmony_ci } 11637db96d56Sopenharmony_ci#if XML_COMBINED_VERSION >= 20100 11647db96d56Sopenharmony_ci /* This feature was added upstream in libexpat 2.1.0. */ 11657db96d56Sopenharmony_ci XML_SetHashSalt(self->itself, 11667db96d56Sopenharmony_ci (unsigned long)_Py_HashSecret.expat.hashsalt); 11677db96d56Sopenharmony_ci#endif 11687db96d56Sopenharmony_ci XML_SetUserData(self->itself, (void *)self); 11697db96d56Sopenharmony_ci XML_SetUnknownEncodingHandler(self->itself, 11707db96d56Sopenharmony_ci (XML_UnknownEncodingHandler) PyUnknownEncodingHandler, NULL); 11717db96d56Sopenharmony_ci 11727db96d56Sopenharmony_ci for (i = 0; handler_info[i].name != NULL; i++) 11737db96d56Sopenharmony_ci /* do nothing */; 11747db96d56Sopenharmony_ci 11757db96d56Sopenharmony_ci self->handlers = PyMem_New(PyObject *, i); 11767db96d56Sopenharmony_ci if (!self->handlers) { 11777db96d56Sopenharmony_ci Py_DECREF(self); 11787db96d56Sopenharmony_ci return PyErr_NoMemory(); 11797db96d56Sopenharmony_ci } 11807db96d56Sopenharmony_ci clear_handlers(self, 1); 11817db96d56Sopenharmony_ci 11827db96d56Sopenharmony_ci PyObject_GC_Track(self); 11837db96d56Sopenharmony_ci return (PyObject*)self; 11847db96d56Sopenharmony_ci} 11857db96d56Sopenharmony_ci 11867db96d56Sopenharmony_cistatic int 11877db96d56Sopenharmony_cixmlparse_traverse(xmlparseobject *op, visitproc visit, void *arg) 11887db96d56Sopenharmony_ci{ 11897db96d56Sopenharmony_ci for (int i = 0; handler_info[i].name != NULL; i++) { 11907db96d56Sopenharmony_ci Py_VISIT(op->handlers[i]); 11917db96d56Sopenharmony_ci } 11927db96d56Sopenharmony_ci Py_VISIT(Py_TYPE(op)); 11937db96d56Sopenharmony_ci return 0; 11947db96d56Sopenharmony_ci} 11957db96d56Sopenharmony_ci 11967db96d56Sopenharmony_cistatic int 11977db96d56Sopenharmony_cixmlparse_clear(xmlparseobject *op) 11987db96d56Sopenharmony_ci{ 11997db96d56Sopenharmony_ci clear_handlers(op, 0); 12007db96d56Sopenharmony_ci Py_CLEAR(op->intern); 12017db96d56Sopenharmony_ci return 0; 12027db96d56Sopenharmony_ci} 12037db96d56Sopenharmony_ci 12047db96d56Sopenharmony_cistatic void 12057db96d56Sopenharmony_cixmlparse_dealloc(xmlparseobject *self) 12067db96d56Sopenharmony_ci{ 12077db96d56Sopenharmony_ci PyObject_GC_UnTrack(self); 12087db96d56Sopenharmony_ci (void)xmlparse_clear(self); 12097db96d56Sopenharmony_ci if (self->itself != NULL) 12107db96d56Sopenharmony_ci XML_ParserFree(self->itself); 12117db96d56Sopenharmony_ci self->itself = NULL; 12127db96d56Sopenharmony_ci 12137db96d56Sopenharmony_ci if (self->handlers != NULL) { 12147db96d56Sopenharmony_ci PyMem_Free(self->handlers); 12157db96d56Sopenharmony_ci self->handlers = NULL; 12167db96d56Sopenharmony_ci } 12177db96d56Sopenharmony_ci if (self->buffer != NULL) { 12187db96d56Sopenharmony_ci PyMem_Free(self->buffer); 12197db96d56Sopenharmony_ci self->buffer = NULL; 12207db96d56Sopenharmony_ci } 12217db96d56Sopenharmony_ci PyTypeObject *tp = Py_TYPE(self); 12227db96d56Sopenharmony_ci PyObject_GC_Del(self); 12237db96d56Sopenharmony_ci Py_DECREF(tp); 12247db96d56Sopenharmony_ci} 12257db96d56Sopenharmony_ci 12267db96d56Sopenharmony_ci 12277db96d56Sopenharmony_cistatic PyObject * 12287db96d56Sopenharmony_cixmlparse_handler_getter(xmlparseobject *self, struct HandlerInfo *hi) 12297db96d56Sopenharmony_ci{ 12307db96d56Sopenharmony_ci assert((hi - handler_info) < (Py_ssize_t)Py_ARRAY_LENGTH(handler_info)); 12317db96d56Sopenharmony_ci int handlernum = (int)(hi - handler_info); 12327db96d56Sopenharmony_ci PyObject *result = self->handlers[handlernum]; 12337db96d56Sopenharmony_ci if (result == NULL) 12347db96d56Sopenharmony_ci result = Py_None; 12357db96d56Sopenharmony_ci Py_INCREF(result); 12367db96d56Sopenharmony_ci return result; 12377db96d56Sopenharmony_ci} 12387db96d56Sopenharmony_ci 12397db96d56Sopenharmony_cistatic int 12407db96d56Sopenharmony_cixmlparse_handler_setter(xmlparseobject *self, PyObject *v, struct HandlerInfo *hi) 12417db96d56Sopenharmony_ci{ 12427db96d56Sopenharmony_ci assert((hi - handler_info) < (Py_ssize_t)Py_ARRAY_LENGTH(handler_info)); 12437db96d56Sopenharmony_ci int handlernum = (int)(hi - handler_info); 12447db96d56Sopenharmony_ci if (v == NULL) { 12457db96d56Sopenharmony_ci PyErr_SetString(PyExc_RuntimeError, "Cannot delete attribute"); 12467db96d56Sopenharmony_ci return -1; 12477db96d56Sopenharmony_ci } 12487db96d56Sopenharmony_ci if (handlernum == CharacterData) { 12497db96d56Sopenharmony_ci /* If we're changing the character data handler, flush all 12507db96d56Sopenharmony_ci * cached data with the old handler. Not sure there's a 12517db96d56Sopenharmony_ci * "right" thing to do, though, but this probably won't 12527db96d56Sopenharmony_ci * happen. 12537db96d56Sopenharmony_ci */ 12547db96d56Sopenharmony_ci if (flush_character_buffer(self) < 0) 12557db96d56Sopenharmony_ci return -1; 12567db96d56Sopenharmony_ci } 12577db96d56Sopenharmony_ci 12587db96d56Sopenharmony_ci xmlhandler c_handler = NULL; 12597db96d56Sopenharmony_ci if (v == Py_None) { 12607db96d56Sopenharmony_ci /* If this is the character data handler, and a character 12617db96d56Sopenharmony_ci data handler is already active, we need to be more 12627db96d56Sopenharmony_ci careful. What we can safely do is replace the existing 12637db96d56Sopenharmony_ci character data handler callback function with a no-op 12647db96d56Sopenharmony_ci function that will refuse to call Python. The downside 12657db96d56Sopenharmony_ci is that this doesn't completely remove the character 12667db96d56Sopenharmony_ci data handler from the C layer if there's any callback 12677db96d56Sopenharmony_ci active, so Expat does a little more work than it 12687db96d56Sopenharmony_ci otherwise would, but that's really an odd case. A more 12697db96d56Sopenharmony_ci elaborate system of handlers and state could remove the 12707db96d56Sopenharmony_ci C handler more effectively. */ 12717db96d56Sopenharmony_ci if (handlernum == CharacterData && self->in_callback) 12727db96d56Sopenharmony_ci c_handler = noop_character_data_handler; 12737db96d56Sopenharmony_ci v = NULL; 12747db96d56Sopenharmony_ci } 12757db96d56Sopenharmony_ci else if (v != NULL) { 12767db96d56Sopenharmony_ci Py_INCREF(v); 12777db96d56Sopenharmony_ci c_handler = handler_info[handlernum].handler; 12787db96d56Sopenharmony_ci } 12797db96d56Sopenharmony_ci Py_XSETREF(self->handlers[handlernum], v); 12807db96d56Sopenharmony_ci handler_info[handlernum].setter(self->itself, c_handler); 12817db96d56Sopenharmony_ci return 0; 12827db96d56Sopenharmony_ci} 12837db96d56Sopenharmony_ci 12847db96d56Sopenharmony_ci#define INT_GETTER(name) \ 12857db96d56Sopenharmony_ci static PyObject * \ 12867db96d56Sopenharmony_ci xmlparse_##name##_getter(xmlparseobject *self, void *closure) \ 12877db96d56Sopenharmony_ci { \ 12887db96d56Sopenharmony_ci return PyLong_FromLong((long) XML_Get##name(self->itself)); \ 12897db96d56Sopenharmony_ci } 12907db96d56Sopenharmony_ciINT_GETTER(ErrorCode) 12917db96d56Sopenharmony_ciINT_GETTER(ErrorLineNumber) 12927db96d56Sopenharmony_ciINT_GETTER(ErrorColumnNumber) 12937db96d56Sopenharmony_ciINT_GETTER(ErrorByteIndex) 12947db96d56Sopenharmony_ciINT_GETTER(CurrentLineNumber) 12957db96d56Sopenharmony_ciINT_GETTER(CurrentColumnNumber) 12967db96d56Sopenharmony_ciINT_GETTER(CurrentByteIndex) 12977db96d56Sopenharmony_ci 12987db96d56Sopenharmony_ci#undef INT_GETTER 12997db96d56Sopenharmony_ci 13007db96d56Sopenharmony_cistatic PyObject * 13017db96d56Sopenharmony_cixmlparse_buffer_text_getter(xmlparseobject *self, void *closure) 13027db96d56Sopenharmony_ci{ 13037db96d56Sopenharmony_ci return PyBool_FromLong(self->buffer != NULL); 13047db96d56Sopenharmony_ci} 13057db96d56Sopenharmony_ci 13067db96d56Sopenharmony_cistatic int 13077db96d56Sopenharmony_cixmlparse_buffer_text_setter(xmlparseobject *self, PyObject *v, void *closure) 13087db96d56Sopenharmony_ci{ 13097db96d56Sopenharmony_ci if (v == NULL) { 13107db96d56Sopenharmony_ci PyErr_SetString(PyExc_RuntimeError, "Cannot delete attribute"); 13117db96d56Sopenharmony_ci return -1; 13127db96d56Sopenharmony_ci } 13137db96d56Sopenharmony_ci int b = PyObject_IsTrue(v); 13147db96d56Sopenharmony_ci if (b < 0) 13157db96d56Sopenharmony_ci return -1; 13167db96d56Sopenharmony_ci if (b) { 13177db96d56Sopenharmony_ci if (self->buffer == NULL) { 13187db96d56Sopenharmony_ci self->buffer = PyMem_Malloc(self->buffer_size); 13197db96d56Sopenharmony_ci if (self->buffer == NULL) { 13207db96d56Sopenharmony_ci PyErr_NoMemory(); 13217db96d56Sopenharmony_ci return -1; 13227db96d56Sopenharmony_ci } 13237db96d56Sopenharmony_ci self->buffer_used = 0; 13247db96d56Sopenharmony_ci } 13257db96d56Sopenharmony_ci } 13267db96d56Sopenharmony_ci else if (self->buffer != NULL) { 13277db96d56Sopenharmony_ci if (flush_character_buffer(self) < 0) 13287db96d56Sopenharmony_ci return -1; 13297db96d56Sopenharmony_ci PyMem_Free(self->buffer); 13307db96d56Sopenharmony_ci self->buffer = NULL; 13317db96d56Sopenharmony_ci } 13327db96d56Sopenharmony_ci return 0; 13337db96d56Sopenharmony_ci} 13347db96d56Sopenharmony_ci 13357db96d56Sopenharmony_cistatic PyObject * 13367db96d56Sopenharmony_cixmlparse_buffer_size_getter(xmlparseobject *self, void *closure) 13377db96d56Sopenharmony_ci{ 13387db96d56Sopenharmony_ci return PyLong_FromLong((long) self->buffer_size); 13397db96d56Sopenharmony_ci} 13407db96d56Sopenharmony_ci 13417db96d56Sopenharmony_cistatic int 13427db96d56Sopenharmony_cixmlparse_buffer_size_setter(xmlparseobject *self, PyObject *v, void *closure) 13437db96d56Sopenharmony_ci{ 13447db96d56Sopenharmony_ci if (v == NULL) { 13457db96d56Sopenharmony_ci PyErr_SetString(PyExc_RuntimeError, "Cannot delete attribute"); 13467db96d56Sopenharmony_ci return -1; 13477db96d56Sopenharmony_ci } 13487db96d56Sopenharmony_ci long new_buffer_size; 13497db96d56Sopenharmony_ci if (!PyLong_Check(v)) { 13507db96d56Sopenharmony_ci PyErr_SetString(PyExc_TypeError, "buffer_size must be an integer"); 13517db96d56Sopenharmony_ci return -1; 13527db96d56Sopenharmony_ci } 13537db96d56Sopenharmony_ci 13547db96d56Sopenharmony_ci new_buffer_size = PyLong_AsLong(v); 13557db96d56Sopenharmony_ci if (new_buffer_size <= 0) { 13567db96d56Sopenharmony_ci if (!PyErr_Occurred()) 13577db96d56Sopenharmony_ci PyErr_SetString(PyExc_ValueError, "buffer_size must be greater than zero"); 13587db96d56Sopenharmony_ci return -1; 13597db96d56Sopenharmony_ci } 13607db96d56Sopenharmony_ci 13617db96d56Sopenharmony_ci /* trivial case -- no change */ 13627db96d56Sopenharmony_ci if (new_buffer_size == self->buffer_size) { 13637db96d56Sopenharmony_ci return 0; 13647db96d56Sopenharmony_ci } 13657db96d56Sopenharmony_ci 13667db96d56Sopenharmony_ci /* check maximum */ 13677db96d56Sopenharmony_ci if (new_buffer_size > INT_MAX) { 13687db96d56Sopenharmony_ci char errmsg[100]; 13697db96d56Sopenharmony_ci sprintf(errmsg, "buffer_size must not be greater than %i", INT_MAX); 13707db96d56Sopenharmony_ci PyErr_SetString(PyExc_ValueError, errmsg); 13717db96d56Sopenharmony_ci return -1; 13727db96d56Sopenharmony_ci } 13737db96d56Sopenharmony_ci 13747db96d56Sopenharmony_ci if (self->buffer != NULL) { 13757db96d56Sopenharmony_ci /* there is already a buffer */ 13767db96d56Sopenharmony_ci if (self->buffer_used != 0) { 13777db96d56Sopenharmony_ci if (flush_character_buffer(self) < 0) { 13787db96d56Sopenharmony_ci return -1; 13797db96d56Sopenharmony_ci } 13807db96d56Sopenharmony_ci } 13817db96d56Sopenharmony_ci /* free existing buffer */ 13827db96d56Sopenharmony_ci PyMem_Free(self->buffer); 13837db96d56Sopenharmony_ci } 13847db96d56Sopenharmony_ci self->buffer = PyMem_Malloc(new_buffer_size); 13857db96d56Sopenharmony_ci if (self->buffer == NULL) { 13867db96d56Sopenharmony_ci PyErr_NoMemory(); 13877db96d56Sopenharmony_ci return -1; 13887db96d56Sopenharmony_ci } 13897db96d56Sopenharmony_ci self->buffer_size = new_buffer_size; 13907db96d56Sopenharmony_ci return 0; 13917db96d56Sopenharmony_ci} 13927db96d56Sopenharmony_ci 13937db96d56Sopenharmony_cistatic PyObject * 13947db96d56Sopenharmony_cixmlparse_buffer_used_getter(xmlparseobject *self, void *closure) 13957db96d56Sopenharmony_ci{ 13967db96d56Sopenharmony_ci return PyLong_FromLong((long) self->buffer_used); 13977db96d56Sopenharmony_ci} 13987db96d56Sopenharmony_ci 13997db96d56Sopenharmony_cistatic PyObject * 14007db96d56Sopenharmony_cixmlparse_namespace_prefixes_getter(xmlparseobject *self, void *closure) 14017db96d56Sopenharmony_ci{ 14027db96d56Sopenharmony_ci return PyBool_FromLong(self->ns_prefixes); 14037db96d56Sopenharmony_ci} 14047db96d56Sopenharmony_ci 14057db96d56Sopenharmony_cistatic int 14067db96d56Sopenharmony_cixmlparse_namespace_prefixes_setter(xmlparseobject *self, PyObject *v, void *closure) 14077db96d56Sopenharmony_ci{ 14087db96d56Sopenharmony_ci if (v == NULL) { 14097db96d56Sopenharmony_ci PyErr_SetString(PyExc_RuntimeError, "Cannot delete attribute"); 14107db96d56Sopenharmony_ci return -1; 14117db96d56Sopenharmony_ci } 14127db96d56Sopenharmony_ci int b = PyObject_IsTrue(v); 14137db96d56Sopenharmony_ci if (b < 0) 14147db96d56Sopenharmony_ci return -1; 14157db96d56Sopenharmony_ci self->ns_prefixes = b; 14167db96d56Sopenharmony_ci XML_SetReturnNSTriplet(self->itself, self->ns_prefixes); 14177db96d56Sopenharmony_ci return 0; 14187db96d56Sopenharmony_ci} 14197db96d56Sopenharmony_ci 14207db96d56Sopenharmony_cistatic PyObject * 14217db96d56Sopenharmony_cixmlparse_ordered_attributes_getter(xmlparseobject *self, void *closure) 14227db96d56Sopenharmony_ci{ 14237db96d56Sopenharmony_ci return PyBool_FromLong(self->ordered_attributes); 14247db96d56Sopenharmony_ci} 14257db96d56Sopenharmony_ci 14267db96d56Sopenharmony_cistatic int 14277db96d56Sopenharmony_cixmlparse_ordered_attributes_setter(xmlparseobject *self, PyObject *v, void *closure) 14287db96d56Sopenharmony_ci{ 14297db96d56Sopenharmony_ci if (v == NULL) { 14307db96d56Sopenharmony_ci PyErr_SetString(PyExc_RuntimeError, "Cannot delete attribute"); 14317db96d56Sopenharmony_ci return -1; 14327db96d56Sopenharmony_ci } 14337db96d56Sopenharmony_ci int b = PyObject_IsTrue(v); 14347db96d56Sopenharmony_ci if (b < 0) 14357db96d56Sopenharmony_ci return -1; 14367db96d56Sopenharmony_ci self->ordered_attributes = b; 14377db96d56Sopenharmony_ci return 0; 14387db96d56Sopenharmony_ci} 14397db96d56Sopenharmony_ci 14407db96d56Sopenharmony_cistatic PyObject * 14417db96d56Sopenharmony_cixmlparse_specified_attributes_getter(xmlparseobject *self, void *closure) 14427db96d56Sopenharmony_ci{ 14437db96d56Sopenharmony_ci return PyBool_FromLong((long) self->specified_attributes); 14447db96d56Sopenharmony_ci} 14457db96d56Sopenharmony_ci 14467db96d56Sopenharmony_cistatic int 14477db96d56Sopenharmony_cixmlparse_specified_attributes_setter(xmlparseobject *self, PyObject *v, void *closure) 14487db96d56Sopenharmony_ci{ 14497db96d56Sopenharmony_ci if (v == NULL) { 14507db96d56Sopenharmony_ci PyErr_SetString(PyExc_RuntimeError, "Cannot delete attribute"); 14517db96d56Sopenharmony_ci return -1; 14527db96d56Sopenharmony_ci } 14537db96d56Sopenharmony_ci int b = PyObject_IsTrue(v); 14547db96d56Sopenharmony_ci if (b < 0) 14557db96d56Sopenharmony_ci return -1; 14567db96d56Sopenharmony_ci self->specified_attributes = b; 14577db96d56Sopenharmony_ci return 0; 14587db96d56Sopenharmony_ci} 14597db96d56Sopenharmony_ci 14607db96d56Sopenharmony_cistatic PyMemberDef xmlparse_members[] = { 14617db96d56Sopenharmony_ci {"intern", T_OBJECT, offsetof(xmlparseobject, intern), READONLY, NULL}, 14627db96d56Sopenharmony_ci {NULL} 14637db96d56Sopenharmony_ci}; 14647db96d56Sopenharmony_ci 14657db96d56Sopenharmony_ci#define XMLPARSE_GETTER_DEF(name) \ 14667db96d56Sopenharmony_ci {#name, (getter)xmlparse_##name##_getter, NULL, NULL}, 14677db96d56Sopenharmony_ci#define XMLPARSE_GETTER_SETTER_DEF(name) \ 14687db96d56Sopenharmony_ci {#name, (getter)xmlparse_##name##_getter, \ 14697db96d56Sopenharmony_ci (setter)xmlparse_##name##_setter, NULL}, 14707db96d56Sopenharmony_ci 14717db96d56Sopenharmony_cistatic PyGetSetDef xmlparse_getsetlist[] = { 14727db96d56Sopenharmony_ci XMLPARSE_GETTER_DEF(ErrorCode) 14737db96d56Sopenharmony_ci XMLPARSE_GETTER_DEF(ErrorLineNumber) 14747db96d56Sopenharmony_ci XMLPARSE_GETTER_DEF(ErrorColumnNumber) 14757db96d56Sopenharmony_ci XMLPARSE_GETTER_DEF(ErrorByteIndex) 14767db96d56Sopenharmony_ci XMLPARSE_GETTER_DEF(CurrentLineNumber) 14777db96d56Sopenharmony_ci XMLPARSE_GETTER_DEF(CurrentColumnNumber) 14787db96d56Sopenharmony_ci XMLPARSE_GETTER_DEF(CurrentByteIndex) 14797db96d56Sopenharmony_ci XMLPARSE_GETTER_SETTER_DEF(buffer_size) 14807db96d56Sopenharmony_ci XMLPARSE_GETTER_SETTER_DEF(buffer_text) 14817db96d56Sopenharmony_ci XMLPARSE_GETTER_DEF(buffer_used) 14827db96d56Sopenharmony_ci XMLPARSE_GETTER_SETTER_DEF(namespace_prefixes) 14837db96d56Sopenharmony_ci XMLPARSE_GETTER_SETTER_DEF(ordered_attributes) 14847db96d56Sopenharmony_ci XMLPARSE_GETTER_SETTER_DEF(specified_attributes) 14857db96d56Sopenharmony_ci {NULL}, 14867db96d56Sopenharmony_ci}; 14877db96d56Sopenharmony_ci 14887db96d56Sopenharmony_ci#undef XMLPARSE_GETTER_DEF 14897db96d56Sopenharmony_ci#undef XMLPARSE_GETTER_SETTER_DEF 14907db96d56Sopenharmony_ci 14917db96d56Sopenharmony_ciPyDoc_STRVAR(Xmlparsetype__doc__, "XML parser"); 14927db96d56Sopenharmony_ci 14937db96d56Sopenharmony_cistatic PyType_Slot _xml_parse_type_spec_slots[] = { 14947db96d56Sopenharmony_ci {Py_tp_dealloc, xmlparse_dealloc}, 14957db96d56Sopenharmony_ci {Py_tp_doc, (void *)Xmlparsetype__doc__}, 14967db96d56Sopenharmony_ci {Py_tp_traverse, xmlparse_traverse}, 14977db96d56Sopenharmony_ci {Py_tp_clear, xmlparse_clear}, 14987db96d56Sopenharmony_ci {Py_tp_methods, xmlparse_methods}, 14997db96d56Sopenharmony_ci {Py_tp_members, xmlparse_members}, 15007db96d56Sopenharmony_ci {Py_tp_getset, xmlparse_getsetlist}, 15017db96d56Sopenharmony_ci {0, 0} 15027db96d56Sopenharmony_ci}; 15037db96d56Sopenharmony_ci 15047db96d56Sopenharmony_cistatic PyType_Spec _xml_parse_type_spec = { 15057db96d56Sopenharmony_ci .name = "pyexpat.xmlparser", 15067db96d56Sopenharmony_ci .basicsize = sizeof(xmlparseobject), 15077db96d56Sopenharmony_ci .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | 15087db96d56Sopenharmony_ci Py_TPFLAGS_DISALLOW_INSTANTIATION | Py_TPFLAGS_IMMUTABLETYPE), 15097db96d56Sopenharmony_ci .slots = _xml_parse_type_spec_slots, 15107db96d56Sopenharmony_ci}; 15117db96d56Sopenharmony_ci 15127db96d56Sopenharmony_ci/* End of code for xmlparser objects */ 15137db96d56Sopenharmony_ci/* -------------------------------------------------------- */ 15147db96d56Sopenharmony_ci 15157db96d56Sopenharmony_ci/*[clinic input] 15167db96d56Sopenharmony_cipyexpat.ParserCreate 15177db96d56Sopenharmony_ci 15187db96d56Sopenharmony_ci encoding: str(accept={str, NoneType}) = None 15197db96d56Sopenharmony_ci namespace_separator: str(accept={str, NoneType}) = None 15207db96d56Sopenharmony_ci intern: object = NULL 15217db96d56Sopenharmony_ci 15227db96d56Sopenharmony_ciReturn a new XML parser object. 15237db96d56Sopenharmony_ci[clinic start generated code]*/ 15247db96d56Sopenharmony_ci 15257db96d56Sopenharmony_cistatic PyObject * 15267db96d56Sopenharmony_cipyexpat_ParserCreate_impl(PyObject *module, const char *encoding, 15277db96d56Sopenharmony_ci const char *namespace_separator, PyObject *intern) 15287db96d56Sopenharmony_ci/*[clinic end generated code: output=295c0cf01ab1146c input=e8da8e8d7122cb5d]*/ 15297db96d56Sopenharmony_ci{ 15307db96d56Sopenharmony_ci PyObject *result; 15317db96d56Sopenharmony_ci int intern_decref = 0; 15327db96d56Sopenharmony_ci 15337db96d56Sopenharmony_ci if (namespace_separator != NULL 15347db96d56Sopenharmony_ci && strlen(namespace_separator) > 1) { 15357db96d56Sopenharmony_ci PyErr_SetString(PyExc_ValueError, 15367db96d56Sopenharmony_ci "namespace_separator must be at most one" 15377db96d56Sopenharmony_ci " character, omitted, or None"); 15387db96d56Sopenharmony_ci return NULL; 15397db96d56Sopenharmony_ci } 15407db96d56Sopenharmony_ci /* Explicitly passing None means no interning is desired. 15417db96d56Sopenharmony_ci Not passing anything means that a new dictionary is used. */ 15427db96d56Sopenharmony_ci if (intern == Py_None) 15437db96d56Sopenharmony_ci intern = NULL; 15447db96d56Sopenharmony_ci else if (intern == NULL) { 15457db96d56Sopenharmony_ci intern = PyDict_New(); 15467db96d56Sopenharmony_ci if (!intern) 15477db96d56Sopenharmony_ci return NULL; 15487db96d56Sopenharmony_ci intern_decref = 1; 15497db96d56Sopenharmony_ci } 15507db96d56Sopenharmony_ci else if (!PyDict_Check(intern)) { 15517db96d56Sopenharmony_ci PyErr_SetString(PyExc_TypeError, "intern must be a dictionary"); 15527db96d56Sopenharmony_ci return NULL; 15537db96d56Sopenharmony_ci } 15547db96d56Sopenharmony_ci 15557db96d56Sopenharmony_ci pyexpat_state *state = pyexpat_get_state(module); 15567db96d56Sopenharmony_ci result = newxmlparseobject(state, encoding, namespace_separator, intern); 15577db96d56Sopenharmony_ci if (intern_decref) { 15587db96d56Sopenharmony_ci Py_DECREF(intern); 15597db96d56Sopenharmony_ci } 15607db96d56Sopenharmony_ci return result; 15617db96d56Sopenharmony_ci} 15627db96d56Sopenharmony_ci 15637db96d56Sopenharmony_ci/*[clinic input] 15647db96d56Sopenharmony_cipyexpat.ErrorString 15657db96d56Sopenharmony_ci 15667db96d56Sopenharmony_ci code: long 15677db96d56Sopenharmony_ci / 15687db96d56Sopenharmony_ci 15697db96d56Sopenharmony_ciReturns string error for given number. 15707db96d56Sopenharmony_ci[clinic start generated code]*/ 15717db96d56Sopenharmony_ci 15727db96d56Sopenharmony_cistatic PyObject * 15737db96d56Sopenharmony_cipyexpat_ErrorString_impl(PyObject *module, long code) 15747db96d56Sopenharmony_ci/*[clinic end generated code: output=2feae50d166f2174 input=cc67de010d9e62b3]*/ 15757db96d56Sopenharmony_ci{ 15767db96d56Sopenharmony_ci return Py_BuildValue("z", XML_ErrorString((int)code)); 15777db96d56Sopenharmony_ci} 15787db96d56Sopenharmony_ci 15797db96d56Sopenharmony_ci/* List of methods defined in the module */ 15807db96d56Sopenharmony_ci 15817db96d56Sopenharmony_cistatic struct PyMethodDef pyexpat_methods[] = { 15827db96d56Sopenharmony_ci PYEXPAT_PARSERCREATE_METHODDEF 15837db96d56Sopenharmony_ci PYEXPAT_ERRORSTRING_METHODDEF 15847db96d56Sopenharmony_ci {NULL, NULL} /* sentinel */ 15857db96d56Sopenharmony_ci}; 15867db96d56Sopenharmony_ci 15877db96d56Sopenharmony_ci/* Module docstring */ 15887db96d56Sopenharmony_ci 15897db96d56Sopenharmony_ciPyDoc_STRVAR(pyexpat_module_documentation, 15907db96d56Sopenharmony_ci"Python wrapper for Expat parser."); 15917db96d56Sopenharmony_ci 15927db96d56Sopenharmony_ci/* Initialization function for the module */ 15937db96d56Sopenharmony_ci 15947db96d56Sopenharmony_ci#ifndef MODULE_NAME 15957db96d56Sopenharmony_ci#define MODULE_NAME "pyexpat" 15967db96d56Sopenharmony_ci#endif 15977db96d56Sopenharmony_ci 15987db96d56Sopenharmony_cistatic int init_handler_descrs(pyexpat_state *state) 15997db96d56Sopenharmony_ci{ 16007db96d56Sopenharmony_ci int i; 16017db96d56Sopenharmony_ci assert(!PyType_HasFeature(state->xml_parse_type, Py_TPFLAGS_VALID_VERSION_TAG)); 16027db96d56Sopenharmony_ci for (i = 0; handler_info[i].name != NULL; i++) { 16037db96d56Sopenharmony_ci struct HandlerInfo *hi = &handler_info[i]; 16047db96d56Sopenharmony_ci hi->getset.name = hi->name; 16057db96d56Sopenharmony_ci hi->getset.get = (getter)xmlparse_handler_getter; 16067db96d56Sopenharmony_ci hi->getset.set = (setter)xmlparse_handler_setter; 16077db96d56Sopenharmony_ci hi->getset.closure = &handler_info[i]; 16087db96d56Sopenharmony_ci 16097db96d56Sopenharmony_ci PyObject *descr = PyDescr_NewGetSet(state->xml_parse_type, &hi->getset); 16107db96d56Sopenharmony_ci if (descr == NULL) 16117db96d56Sopenharmony_ci return -1; 16127db96d56Sopenharmony_ci 16137db96d56Sopenharmony_ci if (PyDict_SetDefault(state->xml_parse_type->tp_dict, PyDescr_NAME(descr), descr) == NULL) { 16147db96d56Sopenharmony_ci Py_DECREF(descr); 16157db96d56Sopenharmony_ci return -1; 16167db96d56Sopenharmony_ci } 16177db96d56Sopenharmony_ci Py_DECREF(descr); 16187db96d56Sopenharmony_ci } 16197db96d56Sopenharmony_ci return 0; 16207db96d56Sopenharmony_ci} 16217db96d56Sopenharmony_ci 16227db96d56Sopenharmony_cistatic PyObject * 16237db96d56Sopenharmony_ciadd_submodule(PyObject *mod, const char *fullname) 16247db96d56Sopenharmony_ci{ 16257db96d56Sopenharmony_ci const char *name = strrchr(fullname, '.') + 1; 16267db96d56Sopenharmony_ci 16277db96d56Sopenharmony_ci PyObject *submodule = PyModule_New(fullname); 16287db96d56Sopenharmony_ci if (submodule == NULL) { 16297db96d56Sopenharmony_ci return NULL; 16307db96d56Sopenharmony_ci } 16317db96d56Sopenharmony_ci 16327db96d56Sopenharmony_ci PyObject *mod_name = PyUnicode_FromString(fullname); 16337db96d56Sopenharmony_ci if (mod_name == NULL) { 16347db96d56Sopenharmony_ci Py_DECREF(submodule); 16357db96d56Sopenharmony_ci return NULL; 16367db96d56Sopenharmony_ci } 16377db96d56Sopenharmony_ci 16387db96d56Sopenharmony_ci if (_PyImport_SetModule(mod_name, submodule) < 0) { 16397db96d56Sopenharmony_ci Py_DECREF(submodule); 16407db96d56Sopenharmony_ci Py_DECREF(mod_name); 16417db96d56Sopenharmony_ci return NULL; 16427db96d56Sopenharmony_ci } 16437db96d56Sopenharmony_ci Py_DECREF(mod_name); 16447db96d56Sopenharmony_ci 16457db96d56Sopenharmony_ci /* gives away the reference to the submodule */ 16467db96d56Sopenharmony_ci if (PyModule_AddObject(mod, name, submodule) < 0) { 16477db96d56Sopenharmony_ci Py_DECREF(submodule); 16487db96d56Sopenharmony_ci return NULL; 16497db96d56Sopenharmony_ci } 16507db96d56Sopenharmony_ci 16517db96d56Sopenharmony_ci return submodule; 16527db96d56Sopenharmony_ci} 16537db96d56Sopenharmony_ci 16547db96d56Sopenharmony_cistruct ErrorInfo { 16557db96d56Sopenharmony_ci const char * name; /* Error constant name, e.g. "XML_ERROR_NO_MEMORY" */ 16567db96d56Sopenharmony_ci const char * description; /* Error description as returned by XML_ErrorString(<int>) */ 16577db96d56Sopenharmony_ci}; 16587db96d56Sopenharmony_ci 16597db96d56Sopenharmony_cistatic 16607db96d56Sopenharmony_cistruct ErrorInfo error_info_of[] = { 16617db96d56Sopenharmony_ci {NULL, NULL}, /* XML_ERROR_NONE (value 0) is not exposed */ 16627db96d56Sopenharmony_ci 16637db96d56Sopenharmony_ci {"XML_ERROR_NO_MEMORY", "out of memory"}, 16647db96d56Sopenharmony_ci {"XML_ERROR_SYNTAX", "syntax error"}, 16657db96d56Sopenharmony_ci {"XML_ERROR_NO_ELEMENTS", "no element found"}, 16667db96d56Sopenharmony_ci {"XML_ERROR_INVALID_TOKEN", "not well-formed (invalid token)"}, 16677db96d56Sopenharmony_ci {"XML_ERROR_UNCLOSED_TOKEN", "unclosed token"}, 16687db96d56Sopenharmony_ci {"XML_ERROR_PARTIAL_CHAR", "partial character"}, 16697db96d56Sopenharmony_ci {"XML_ERROR_TAG_MISMATCH", "mismatched tag"}, 16707db96d56Sopenharmony_ci {"XML_ERROR_DUPLICATE_ATTRIBUTE", "duplicate attribute"}, 16717db96d56Sopenharmony_ci {"XML_ERROR_JUNK_AFTER_DOC_ELEMENT", "junk after document element"}, 16727db96d56Sopenharmony_ci {"XML_ERROR_PARAM_ENTITY_REF", "illegal parameter entity reference"}, 16737db96d56Sopenharmony_ci {"XML_ERROR_UNDEFINED_ENTITY", "undefined entity"}, 16747db96d56Sopenharmony_ci {"XML_ERROR_RECURSIVE_ENTITY_REF", "recursive entity reference"}, 16757db96d56Sopenharmony_ci {"XML_ERROR_ASYNC_ENTITY", "asynchronous entity"}, 16767db96d56Sopenharmony_ci {"XML_ERROR_BAD_CHAR_REF", "reference to invalid character number"}, 16777db96d56Sopenharmony_ci {"XML_ERROR_BINARY_ENTITY_REF", "reference to binary entity"}, 16787db96d56Sopenharmony_ci {"XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF", "reference to external entity in attribute"}, 16797db96d56Sopenharmony_ci {"XML_ERROR_MISPLACED_XML_PI", "XML or text declaration not at start of entity"}, 16807db96d56Sopenharmony_ci {"XML_ERROR_UNKNOWN_ENCODING", "unknown encoding"}, 16817db96d56Sopenharmony_ci {"XML_ERROR_INCORRECT_ENCODING", "encoding specified in XML declaration is incorrect"}, 16827db96d56Sopenharmony_ci {"XML_ERROR_UNCLOSED_CDATA_SECTION", "unclosed CDATA section"}, 16837db96d56Sopenharmony_ci {"XML_ERROR_EXTERNAL_ENTITY_HANDLING", "error in processing external entity reference"}, 16847db96d56Sopenharmony_ci {"XML_ERROR_NOT_STANDALONE", "document is not standalone"}, 16857db96d56Sopenharmony_ci {"XML_ERROR_UNEXPECTED_STATE", "unexpected parser state - please send a bug report"}, 16867db96d56Sopenharmony_ci {"XML_ERROR_ENTITY_DECLARED_IN_PE", "entity declared in parameter entity"}, 16877db96d56Sopenharmony_ci {"XML_ERROR_FEATURE_REQUIRES_XML_DTD", "requested feature requires XML_DTD support in Expat"}, 16887db96d56Sopenharmony_ci {"XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING", "cannot change setting once parsing has begun"}, 16897db96d56Sopenharmony_ci 16907db96d56Sopenharmony_ci /* Added in Expat 1.95.7. */ 16917db96d56Sopenharmony_ci {"XML_ERROR_UNBOUND_PREFIX", "unbound prefix"}, 16927db96d56Sopenharmony_ci 16937db96d56Sopenharmony_ci /* Added in Expat 1.95.8. */ 16947db96d56Sopenharmony_ci {"XML_ERROR_UNDECLARING_PREFIX", "must not undeclare prefix"}, 16957db96d56Sopenharmony_ci {"XML_ERROR_INCOMPLETE_PE", "incomplete markup in parameter entity"}, 16967db96d56Sopenharmony_ci {"XML_ERROR_XML_DECL", "XML declaration not well-formed"}, 16977db96d56Sopenharmony_ci {"XML_ERROR_TEXT_DECL", "text declaration not well-formed"}, 16987db96d56Sopenharmony_ci {"XML_ERROR_PUBLICID", "illegal character(s) in public id"}, 16997db96d56Sopenharmony_ci {"XML_ERROR_SUSPENDED", "parser suspended"}, 17007db96d56Sopenharmony_ci {"XML_ERROR_NOT_SUSPENDED", "parser not suspended"}, 17017db96d56Sopenharmony_ci {"XML_ERROR_ABORTED", "parsing aborted"}, 17027db96d56Sopenharmony_ci {"XML_ERROR_FINISHED", "parsing finished"}, 17037db96d56Sopenharmony_ci {"XML_ERROR_SUSPEND_PE", "cannot suspend in external parameter entity"}, 17047db96d56Sopenharmony_ci 17057db96d56Sopenharmony_ci /* Added in 2.0.0. */ 17067db96d56Sopenharmony_ci {"XML_ERROR_RESERVED_PREFIX_XML", "reserved prefix (xml) must not be undeclared or bound to another namespace name"}, 17077db96d56Sopenharmony_ci {"XML_ERROR_RESERVED_PREFIX_XMLNS", "reserved prefix (xmlns) must not be declared or undeclared"}, 17087db96d56Sopenharmony_ci {"XML_ERROR_RESERVED_NAMESPACE_URI", "prefix must not be bound to one of the reserved namespace names"}, 17097db96d56Sopenharmony_ci 17107db96d56Sopenharmony_ci /* Added in 2.2.1. */ 17117db96d56Sopenharmony_ci {"XML_ERROR_INVALID_ARGUMENT", "invalid argument"}, 17127db96d56Sopenharmony_ci 17137db96d56Sopenharmony_ci /* Added in 2.3.0. */ 17147db96d56Sopenharmony_ci {"XML_ERROR_NO_BUFFER", "a successful prior call to function XML_GetBuffer is required"}, 17157db96d56Sopenharmony_ci 17167db96d56Sopenharmony_ci /* Added in 2.4.0. */ 17177db96d56Sopenharmony_ci {"XML_ERROR_AMPLIFICATION_LIMIT_BREACH", "limit on input amplification factor (from DTD and entities) breached"} 17187db96d56Sopenharmony_ci}; 17197db96d56Sopenharmony_ci 17207db96d56Sopenharmony_cistatic int 17217db96d56Sopenharmony_ciadd_error(PyObject *errors_module, PyObject *codes_dict, 17227db96d56Sopenharmony_ci PyObject *rev_codes_dict, size_t error_index) 17237db96d56Sopenharmony_ci{ 17247db96d56Sopenharmony_ci const char * const name = error_info_of[error_index].name; 17257db96d56Sopenharmony_ci const int error_code = (int)error_index; 17267db96d56Sopenharmony_ci 17277db96d56Sopenharmony_ci /* NOTE: This keeps the source of truth regarding error 17287db96d56Sopenharmony_ci * messages with libexpat and (by definiton) in bulletproof sync 17297db96d56Sopenharmony_ci * with the other uses of the XML_ErrorString function 17307db96d56Sopenharmony_ci * elsewhere within this file. pyexpat's copy of the messages 17317db96d56Sopenharmony_ci * only acts as a fallback in case of outdated runtime libexpat, 17327db96d56Sopenharmony_ci * where it returns NULL. */ 17337db96d56Sopenharmony_ci const char *error_string = XML_ErrorString(error_code); 17347db96d56Sopenharmony_ci if (error_string == NULL) { 17357db96d56Sopenharmony_ci error_string = error_info_of[error_index].description; 17367db96d56Sopenharmony_ci } 17377db96d56Sopenharmony_ci 17387db96d56Sopenharmony_ci if (PyModule_AddStringConstant(errors_module, name, error_string) < 0) { 17397db96d56Sopenharmony_ci return -1; 17407db96d56Sopenharmony_ci } 17417db96d56Sopenharmony_ci 17427db96d56Sopenharmony_ci PyObject *num = PyLong_FromLong(error_code); 17437db96d56Sopenharmony_ci if (num == NULL) { 17447db96d56Sopenharmony_ci return -1; 17457db96d56Sopenharmony_ci } 17467db96d56Sopenharmony_ci 17477db96d56Sopenharmony_ci if (PyDict_SetItemString(codes_dict, error_string, num) < 0) { 17487db96d56Sopenharmony_ci Py_DECREF(num); 17497db96d56Sopenharmony_ci return -1; 17507db96d56Sopenharmony_ci } 17517db96d56Sopenharmony_ci 17527db96d56Sopenharmony_ci PyObject *str = PyUnicode_FromString(error_string); 17537db96d56Sopenharmony_ci if (str == NULL) { 17547db96d56Sopenharmony_ci Py_DECREF(num); 17557db96d56Sopenharmony_ci return -1; 17567db96d56Sopenharmony_ci } 17577db96d56Sopenharmony_ci 17587db96d56Sopenharmony_ci int res = PyDict_SetItem(rev_codes_dict, num, str); 17597db96d56Sopenharmony_ci Py_DECREF(str); 17607db96d56Sopenharmony_ci Py_DECREF(num); 17617db96d56Sopenharmony_ci if (res < 0) { 17627db96d56Sopenharmony_ci return -1; 17637db96d56Sopenharmony_ci } 17647db96d56Sopenharmony_ci 17657db96d56Sopenharmony_ci return 0; 17667db96d56Sopenharmony_ci} 17677db96d56Sopenharmony_ci 17687db96d56Sopenharmony_cistatic int 17697db96d56Sopenharmony_ciadd_errors_module(PyObject *mod) 17707db96d56Sopenharmony_ci{ 17717db96d56Sopenharmony_ci PyObject *errors_module = add_submodule(mod, MODULE_NAME ".errors"); 17727db96d56Sopenharmony_ci if (errors_module == NULL) { 17737db96d56Sopenharmony_ci return -1; 17747db96d56Sopenharmony_ci } 17757db96d56Sopenharmony_ci 17767db96d56Sopenharmony_ci PyObject *codes_dict = PyDict_New(); 17777db96d56Sopenharmony_ci PyObject *rev_codes_dict = PyDict_New(); 17787db96d56Sopenharmony_ci if (codes_dict == NULL || rev_codes_dict == NULL) { 17797db96d56Sopenharmony_ci goto error; 17807db96d56Sopenharmony_ci } 17817db96d56Sopenharmony_ci 17827db96d56Sopenharmony_ci size_t error_index = 0; 17837db96d56Sopenharmony_ci for (; error_index < sizeof(error_info_of) / sizeof(struct ErrorInfo); error_index++) { 17847db96d56Sopenharmony_ci if (error_info_of[error_index].name == NULL) { 17857db96d56Sopenharmony_ci continue; 17867db96d56Sopenharmony_ci } 17877db96d56Sopenharmony_ci 17887db96d56Sopenharmony_ci if (add_error(errors_module, codes_dict, rev_codes_dict, error_index) < 0) { 17897db96d56Sopenharmony_ci goto error; 17907db96d56Sopenharmony_ci } 17917db96d56Sopenharmony_ci } 17927db96d56Sopenharmony_ci 17937db96d56Sopenharmony_ci if (PyModule_AddStringConstant(errors_module, "__doc__", 17947db96d56Sopenharmony_ci "Constants used to describe " 17957db96d56Sopenharmony_ci "error conditions.") < 0) { 17967db96d56Sopenharmony_ci goto error; 17977db96d56Sopenharmony_ci } 17987db96d56Sopenharmony_ci 17997db96d56Sopenharmony_ci Py_INCREF(codes_dict); 18007db96d56Sopenharmony_ci if (PyModule_AddObject(errors_module, "codes", codes_dict) < 0) { 18017db96d56Sopenharmony_ci Py_DECREF(codes_dict); 18027db96d56Sopenharmony_ci goto error; 18037db96d56Sopenharmony_ci } 18047db96d56Sopenharmony_ci Py_CLEAR(codes_dict); 18057db96d56Sopenharmony_ci 18067db96d56Sopenharmony_ci Py_INCREF(rev_codes_dict); 18077db96d56Sopenharmony_ci if (PyModule_AddObject(errors_module, "messages", rev_codes_dict) < 0) { 18087db96d56Sopenharmony_ci Py_DECREF(rev_codes_dict); 18097db96d56Sopenharmony_ci goto error; 18107db96d56Sopenharmony_ci } 18117db96d56Sopenharmony_ci Py_CLEAR(rev_codes_dict); 18127db96d56Sopenharmony_ci 18137db96d56Sopenharmony_ci return 0; 18147db96d56Sopenharmony_ci 18157db96d56Sopenharmony_cierror: 18167db96d56Sopenharmony_ci Py_XDECREF(codes_dict); 18177db96d56Sopenharmony_ci Py_XDECREF(rev_codes_dict); 18187db96d56Sopenharmony_ci return -1; 18197db96d56Sopenharmony_ci} 18207db96d56Sopenharmony_ci 18217db96d56Sopenharmony_cistatic int 18227db96d56Sopenharmony_ciadd_model_module(PyObject *mod) 18237db96d56Sopenharmony_ci{ 18247db96d56Sopenharmony_ci PyObject *model_module = add_submodule(mod, MODULE_NAME ".model"); 18257db96d56Sopenharmony_ci if (model_module == NULL) { 18267db96d56Sopenharmony_ci return -1; 18277db96d56Sopenharmony_ci } 18287db96d56Sopenharmony_ci 18297db96d56Sopenharmony_ci#define MYCONST(c) do { \ 18307db96d56Sopenharmony_ci if (PyModule_AddIntConstant(model_module, #c, c) < 0) { \ 18317db96d56Sopenharmony_ci return -1; \ 18327db96d56Sopenharmony_ci } \ 18337db96d56Sopenharmony_ci } while(0) 18347db96d56Sopenharmony_ci 18357db96d56Sopenharmony_ci if (PyModule_AddStringConstant( 18367db96d56Sopenharmony_ci model_module, "__doc__", 18377db96d56Sopenharmony_ci "Constants used to interpret content model information.") < 0) { 18387db96d56Sopenharmony_ci return -1; 18397db96d56Sopenharmony_ci } 18407db96d56Sopenharmony_ci 18417db96d56Sopenharmony_ci MYCONST(XML_CTYPE_EMPTY); 18427db96d56Sopenharmony_ci MYCONST(XML_CTYPE_ANY); 18437db96d56Sopenharmony_ci MYCONST(XML_CTYPE_MIXED); 18447db96d56Sopenharmony_ci MYCONST(XML_CTYPE_NAME); 18457db96d56Sopenharmony_ci MYCONST(XML_CTYPE_CHOICE); 18467db96d56Sopenharmony_ci MYCONST(XML_CTYPE_SEQ); 18477db96d56Sopenharmony_ci 18487db96d56Sopenharmony_ci MYCONST(XML_CQUANT_NONE); 18497db96d56Sopenharmony_ci MYCONST(XML_CQUANT_OPT); 18507db96d56Sopenharmony_ci MYCONST(XML_CQUANT_REP); 18517db96d56Sopenharmony_ci MYCONST(XML_CQUANT_PLUS); 18527db96d56Sopenharmony_ci#undef MYCONST 18537db96d56Sopenharmony_ci return 0; 18547db96d56Sopenharmony_ci} 18557db96d56Sopenharmony_ci 18567db96d56Sopenharmony_ci#if XML_COMBINED_VERSION > 19505 18577db96d56Sopenharmony_cistatic int 18587db96d56Sopenharmony_ciadd_features(PyObject *mod) 18597db96d56Sopenharmony_ci{ 18607db96d56Sopenharmony_ci PyObject *list = PyList_New(0); 18617db96d56Sopenharmony_ci if (list == NULL) { 18627db96d56Sopenharmony_ci return -1; 18637db96d56Sopenharmony_ci } 18647db96d56Sopenharmony_ci 18657db96d56Sopenharmony_ci const XML_Feature *features = XML_GetFeatureList(); 18667db96d56Sopenharmony_ci for (size_t i = 0; features[i].feature != XML_FEATURE_END; ++i) { 18677db96d56Sopenharmony_ci PyObject *item = Py_BuildValue("si", features[i].name, 18687db96d56Sopenharmony_ci features[i].value); 18697db96d56Sopenharmony_ci if (item == NULL) { 18707db96d56Sopenharmony_ci goto error; 18717db96d56Sopenharmony_ci } 18727db96d56Sopenharmony_ci int ok = PyList_Append(list, item); 18737db96d56Sopenharmony_ci Py_DECREF(item); 18747db96d56Sopenharmony_ci if (ok < 0) { 18757db96d56Sopenharmony_ci goto error; 18767db96d56Sopenharmony_ci } 18777db96d56Sopenharmony_ci } 18787db96d56Sopenharmony_ci if (PyModule_AddObject(mod, "features", list) < 0) { 18797db96d56Sopenharmony_ci goto error; 18807db96d56Sopenharmony_ci } 18817db96d56Sopenharmony_ci return 0; 18827db96d56Sopenharmony_ci 18837db96d56Sopenharmony_cierror: 18847db96d56Sopenharmony_ci Py_DECREF(list); 18857db96d56Sopenharmony_ci return -1; 18867db96d56Sopenharmony_ci} 18877db96d56Sopenharmony_ci#endif 18887db96d56Sopenharmony_ci 18897db96d56Sopenharmony_cistatic int 18907db96d56Sopenharmony_cipyexpat_exec(PyObject *mod) 18917db96d56Sopenharmony_ci{ 18927db96d56Sopenharmony_ci pyexpat_state *state = pyexpat_get_state(mod); 18937db96d56Sopenharmony_ci state->str_read = PyUnicode_InternFromString("read"); 18947db96d56Sopenharmony_ci if (state->str_read == NULL) { 18957db96d56Sopenharmony_ci return -1; 18967db96d56Sopenharmony_ci } 18977db96d56Sopenharmony_ci state->xml_parse_type = (PyTypeObject *)PyType_FromModuleAndSpec( 18987db96d56Sopenharmony_ci mod, &_xml_parse_type_spec, NULL); 18997db96d56Sopenharmony_ci 19007db96d56Sopenharmony_ci if (state->xml_parse_type == NULL) { 19017db96d56Sopenharmony_ci return -1; 19027db96d56Sopenharmony_ci } 19037db96d56Sopenharmony_ci 19047db96d56Sopenharmony_ci if (init_handler_descrs(state) < 0) { 19057db96d56Sopenharmony_ci return -1; 19067db96d56Sopenharmony_ci } 19077db96d56Sopenharmony_ci state->error = PyErr_NewException("xml.parsers.expat.ExpatError", 19087db96d56Sopenharmony_ci NULL, NULL); 19097db96d56Sopenharmony_ci if (state->error == NULL) { 19107db96d56Sopenharmony_ci return -1; 19117db96d56Sopenharmony_ci } 19127db96d56Sopenharmony_ci 19137db96d56Sopenharmony_ci /* Add some symbolic constants to the module */ 19147db96d56Sopenharmony_ci 19157db96d56Sopenharmony_ci if (PyModule_AddObjectRef(mod, "error", state->error) < 0) { 19167db96d56Sopenharmony_ci return -1; 19177db96d56Sopenharmony_ci } 19187db96d56Sopenharmony_ci 19197db96d56Sopenharmony_ci if (PyModule_AddObjectRef(mod, "ExpatError", state->error) < 0) { 19207db96d56Sopenharmony_ci return -1; 19217db96d56Sopenharmony_ci } 19227db96d56Sopenharmony_ci 19237db96d56Sopenharmony_ci if (PyModule_AddObjectRef(mod, "XMLParserType", 19247db96d56Sopenharmony_ci (PyObject *) state->xml_parse_type) < 0) { 19257db96d56Sopenharmony_ci return -1; 19267db96d56Sopenharmony_ci } 19277db96d56Sopenharmony_ci 19287db96d56Sopenharmony_ci if (PyModule_AddStringConstant(mod, "EXPAT_VERSION", 19297db96d56Sopenharmony_ci XML_ExpatVersion()) < 0) { 19307db96d56Sopenharmony_ci return -1; 19317db96d56Sopenharmony_ci } 19327db96d56Sopenharmony_ci { 19337db96d56Sopenharmony_ci XML_Expat_Version info = XML_ExpatVersionInfo(); 19347db96d56Sopenharmony_ci PyObject *versionInfo = Py_BuildValue("(iii)", 19357db96d56Sopenharmony_ci info.major, 19367db96d56Sopenharmony_ci info.minor, 19377db96d56Sopenharmony_ci info.micro); 19387db96d56Sopenharmony_ci if (PyModule_AddObject(mod, "version_info", versionInfo) < 0) { 19397db96d56Sopenharmony_ci Py_DECREF(versionInfo); 19407db96d56Sopenharmony_ci return -1; 19417db96d56Sopenharmony_ci } 19427db96d56Sopenharmony_ci } 19437db96d56Sopenharmony_ci /* XXX When Expat supports some way of figuring out how it was 19447db96d56Sopenharmony_ci compiled, this should check and set native_encoding 19457db96d56Sopenharmony_ci appropriately. 19467db96d56Sopenharmony_ci */ 19477db96d56Sopenharmony_ci if (PyModule_AddStringConstant(mod, "native_encoding", "UTF-8") < 0) { 19487db96d56Sopenharmony_ci return -1; 19497db96d56Sopenharmony_ci } 19507db96d56Sopenharmony_ci 19517db96d56Sopenharmony_ci if (add_errors_module(mod) < 0) { 19527db96d56Sopenharmony_ci return -1; 19537db96d56Sopenharmony_ci } 19547db96d56Sopenharmony_ci 19557db96d56Sopenharmony_ci if (add_model_module(mod) < 0) { 19567db96d56Sopenharmony_ci return -1; 19577db96d56Sopenharmony_ci } 19587db96d56Sopenharmony_ci 19597db96d56Sopenharmony_ci#if XML_COMBINED_VERSION > 19505 19607db96d56Sopenharmony_ci if (add_features(mod) < 0) { 19617db96d56Sopenharmony_ci return -1; 19627db96d56Sopenharmony_ci } 19637db96d56Sopenharmony_ci#endif 19647db96d56Sopenharmony_ci 19657db96d56Sopenharmony_ci#define MYCONST(c) do { \ 19667db96d56Sopenharmony_ci if (PyModule_AddIntConstant(mod, #c, c) < 0) { \ 19677db96d56Sopenharmony_ci return -1; \ 19687db96d56Sopenharmony_ci } \ 19697db96d56Sopenharmony_ci } while(0) 19707db96d56Sopenharmony_ci 19717db96d56Sopenharmony_ci MYCONST(XML_PARAM_ENTITY_PARSING_NEVER); 19727db96d56Sopenharmony_ci MYCONST(XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE); 19737db96d56Sopenharmony_ci MYCONST(XML_PARAM_ENTITY_PARSING_ALWAYS); 19747db96d56Sopenharmony_ci#undef MYCONST 19757db96d56Sopenharmony_ci 19767db96d56Sopenharmony_ci static struct PyExpat_CAPI capi; 19777db96d56Sopenharmony_ci /* initialize pyexpat dispatch table */ 19787db96d56Sopenharmony_ci capi.size = sizeof(capi); 19797db96d56Sopenharmony_ci capi.magic = PyExpat_CAPI_MAGIC; 19807db96d56Sopenharmony_ci capi.MAJOR_VERSION = XML_MAJOR_VERSION; 19817db96d56Sopenharmony_ci capi.MINOR_VERSION = XML_MINOR_VERSION; 19827db96d56Sopenharmony_ci capi.MICRO_VERSION = XML_MICRO_VERSION; 19837db96d56Sopenharmony_ci capi.ErrorString = XML_ErrorString; 19847db96d56Sopenharmony_ci capi.GetErrorCode = XML_GetErrorCode; 19857db96d56Sopenharmony_ci capi.GetErrorColumnNumber = XML_GetErrorColumnNumber; 19867db96d56Sopenharmony_ci capi.GetErrorLineNumber = XML_GetErrorLineNumber; 19877db96d56Sopenharmony_ci capi.Parse = XML_Parse; 19887db96d56Sopenharmony_ci capi.ParserCreate_MM = XML_ParserCreate_MM; 19897db96d56Sopenharmony_ci capi.ParserFree = XML_ParserFree; 19907db96d56Sopenharmony_ci capi.SetCharacterDataHandler = XML_SetCharacterDataHandler; 19917db96d56Sopenharmony_ci capi.SetCommentHandler = XML_SetCommentHandler; 19927db96d56Sopenharmony_ci capi.SetDefaultHandlerExpand = XML_SetDefaultHandlerExpand; 19937db96d56Sopenharmony_ci capi.SetElementHandler = XML_SetElementHandler; 19947db96d56Sopenharmony_ci capi.SetNamespaceDeclHandler = XML_SetNamespaceDeclHandler; 19957db96d56Sopenharmony_ci capi.SetProcessingInstructionHandler = XML_SetProcessingInstructionHandler; 19967db96d56Sopenharmony_ci capi.SetUnknownEncodingHandler = XML_SetUnknownEncodingHandler; 19977db96d56Sopenharmony_ci capi.SetUserData = XML_SetUserData; 19987db96d56Sopenharmony_ci capi.SetStartDoctypeDeclHandler = XML_SetStartDoctypeDeclHandler; 19997db96d56Sopenharmony_ci capi.SetEncoding = XML_SetEncoding; 20007db96d56Sopenharmony_ci capi.DefaultUnknownEncodingHandler = PyUnknownEncodingHandler; 20017db96d56Sopenharmony_ci#if XML_COMBINED_VERSION >= 20100 20027db96d56Sopenharmony_ci capi.SetHashSalt = XML_SetHashSalt; 20037db96d56Sopenharmony_ci#else 20047db96d56Sopenharmony_ci capi.SetHashSalt = NULL; 20057db96d56Sopenharmony_ci#endif 20067db96d56Sopenharmony_ci 20077db96d56Sopenharmony_ci /* export using capsule */ 20087db96d56Sopenharmony_ci PyObject *capi_object = PyCapsule_New(&capi, PyExpat_CAPSULE_NAME, NULL); 20097db96d56Sopenharmony_ci if (capi_object == NULL) { 20107db96d56Sopenharmony_ci return -1; 20117db96d56Sopenharmony_ci } 20127db96d56Sopenharmony_ci 20137db96d56Sopenharmony_ci if (PyModule_AddObject(mod, "expat_CAPI", capi_object) < 0) { 20147db96d56Sopenharmony_ci Py_DECREF(capi_object); 20157db96d56Sopenharmony_ci return -1; 20167db96d56Sopenharmony_ci } 20177db96d56Sopenharmony_ci 20187db96d56Sopenharmony_ci return 0; 20197db96d56Sopenharmony_ci} 20207db96d56Sopenharmony_ci 20217db96d56Sopenharmony_cistatic int 20227db96d56Sopenharmony_cipyexpat_traverse(PyObject *module, visitproc visit, void *arg) 20237db96d56Sopenharmony_ci{ 20247db96d56Sopenharmony_ci pyexpat_state *state = pyexpat_get_state(module); 20257db96d56Sopenharmony_ci Py_VISIT(state->xml_parse_type); 20267db96d56Sopenharmony_ci Py_VISIT(state->error); 20277db96d56Sopenharmony_ci Py_VISIT(state->str_read); 20287db96d56Sopenharmony_ci return 0; 20297db96d56Sopenharmony_ci} 20307db96d56Sopenharmony_ci 20317db96d56Sopenharmony_cistatic int 20327db96d56Sopenharmony_cipyexpat_clear(PyObject *module) 20337db96d56Sopenharmony_ci{ 20347db96d56Sopenharmony_ci pyexpat_state *state = pyexpat_get_state(module); 20357db96d56Sopenharmony_ci Py_CLEAR(state->xml_parse_type); 20367db96d56Sopenharmony_ci Py_CLEAR(state->error); 20377db96d56Sopenharmony_ci Py_CLEAR(state->str_read); 20387db96d56Sopenharmony_ci return 0; 20397db96d56Sopenharmony_ci} 20407db96d56Sopenharmony_ci 20417db96d56Sopenharmony_cistatic void 20427db96d56Sopenharmony_cipyexpat_free(void *module) 20437db96d56Sopenharmony_ci{ 20447db96d56Sopenharmony_ci pyexpat_clear((PyObject *)module); 20457db96d56Sopenharmony_ci} 20467db96d56Sopenharmony_ci 20477db96d56Sopenharmony_cistatic PyModuleDef_Slot pyexpat_slots[] = { 20487db96d56Sopenharmony_ci {Py_mod_exec, pyexpat_exec}, 20497db96d56Sopenharmony_ci {0, NULL} 20507db96d56Sopenharmony_ci}; 20517db96d56Sopenharmony_ci 20527db96d56Sopenharmony_cistatic struct PyModuleDef pyexpatmodule = { 20537db96d56Sopenharmony_ci PyModuleDef_HEAD_INIT, 20547db96d56Sopenharmony_ci .m_name = MODULE_NAME, 20557db96d56Sopenharmony_ci .m_doc = pyexpat_module_documentation, 20567db96d56Sopenharmony_ci .m_size = sizeof(pyexpat_state), 20577db96d56Sopenharmony_ci .m_methods = pyexpat_methods, 20587db96d56Sopenharmony_ci .m_slots = pyexpat_slots, 20597db96d56Sopenharmony_ci .m_traverse = pyexpat_traverse, 20607db96d56Sopenharmony_ci .m_clear = pyexpat_clear, 20617db96d56Sopenharmony_ci .m_free = pyexpat_free 20627db96d56Sopenharmony_ci}; 20637db96d56Sopenharmony_ci 20647db96d56Sopenharmony_ciPyMODINIT_FUNC 20657db96d56Sopenharmony_ciPyInit_pyexpat(void) 20667db96d56Sopenharmony_ci{ 20677db96d56Sopenharmony_ci return PyModuleDef_Init(&pyexpatmodule); 20687db96d56Sopenharmony_ci} 20697db96d56Sopenharmony_ci 20707db96d56Sopenharmony_cistatic void 20717db96d56Sopenharmony_ciclear_handlers(xmlparseobject *self, int initial) 20727db96d56Sopenharmony_ci{ 20737db96d56Sopenharmony_ci int i = 0; 20747db96d56Sopenharmony_ci 20757db96d56Sopenharmony_ci for (; handler_info[i].name != NULL; i++) { 20767db96d56Sopenharmony_ci if (initial) 20777db96d56Sopenharmony_ci self->handlers[i] = NULL; 20787db96d56Sopenharmony_ci else { 20797db96d56Sopenharmony_ci Py_CLEAR(self->handlers[i]); 20807db96d56Sopenharmony_ci handler_info[i].setter(self->itself, NULL); 20817db96d56Sopenharmony_ci } 20827db96d56Sopenharmony_ci } 20837db96d56Sopenharmony_ci} 20847db96d56Sopenharmony_ci 20857db96d56Sopenharmony_cistatic struct HandlerInfo handler_info[] = { 20867db96d56Sopenharmony_ci 20877db96d56Sopenharmony_ci#define HANDLER_INFO(name) \ 20887db96d56Sopenharmony_ci {#name, (xmlhandlersetter)XML_Set##name, (xmlhandler)my_##name}, 20897db96d56Sopenharmony_ci 20907db96d56Sopenharmony_ci HANDLER_INFO(StartElementHandler) 20917db96d56Sopenharmony_ci HANDLER_INFO(EndElementHandler) 20927db96d56Sopenharmony_ci HANDLER_INFO(ProcessingInstructionHandler) 20937db96d56Sopenharmony_ci HANDLER_INFO(CharacterDataHandler) 20947db96d56Sopenharmony_ci HANDLER_INFO(UnparsedEntityDeclHandler) 20957db96d56Sopenharmony_ci HANDLER_INFO(NotationDeclHandler) 20967db96d56Sopenharmony_ci HANDLER_INFO(StartNamespaceDeclHandler) 20977db96d56Sopenharmony_ci HANDLER_INFO(EndNamespaceDeclHandler) 20987db96d56Sopenharmony_ci HANDLER_INFO(CommentHandler) 20997db96d56Sopenharmony_ci HANDLER_INFO(StartCdataSectionHandler) 21007db96d56Sopenharmony_ci HANDLER_INFO(EndCdataSectionHandler) 21017db96d56Sopenharmony_ci HANDLER_INFO(DefaultHandler) 21027db96d56Sopenharmony_ci HANDLER_INFO(DefaultHandlerExpand) 21037db96d56Sopenharmony_ci HANDLER_INFO(NotStandaloneHandler) 21047db96d56Sopenharmony_ci HANDLER_INFO(ExternalEntityRefHandler) 21057db96d56Sopenharmony_ci HANDLER_INFO(StartDoctypeDeclHandler) 21067db96d56Sopenharmony_ci HANDLER_INFO(EndDoctypeDeclHandler) 21077db96d56Sopenharmony_ci HANDLER_INFO(EntityDeclHandler) 21087db96d56Sopenharmony_ci HANDLER_INFO(XmlDeclHandler) 21097db96d56Sopenharmony_ci HANDLER_INFO(ElementDeclHandler) 21107db96d56Sopenharmony_ci HANDLER_INFO(AttlistDeclHandler) 21117db96d56Sopenharmony_ci#if XML_COMBINED_VERSION >= 19504 21127db96d56Sopenharmony_ci HANDLER_INFO(SkippedEntityHandler) 21137db96d56Sopenharmony_ci#endif 21147db96d56Sopenharmony_ci 21157db96d56Sopenharmony_ci#undef HANDLER_INFO 21167db96d56Sopenharmony_ci 21177db96d56Sopenharmony_ci {NULL, NULL, NULL} /* sentinel */ 21187db96d56Sopenharmony_ci}; 2119