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