blob: 470c5b04edb910fb5c14e9972997f6d7f9017801 [file] [edit]
.. highlight:: c
Expat C API
===========
The :mod:`xml.parsers.expat` module exposes selected Expat functions
through its ``expat_CAPI`` capsule. This allows extension modules to use the
same Expat library as Python. The interface is declared in :file:`pyexpat.h`,
which is not included by :file:`Python.h` and must be included after Expat's
:file:`expat.h` header.
To use the C API, add the following code to the extension module
initialization function and store the pointer to the C API in the module
state:
.. code-block::
struct PyExpat_CAPI *capi = NULL;
capi = (struct PyExpat_CAPI *)PyCapsule_Import(PyExpat_CAPSULE_NAME, 0);
if (capi == NULL) {
goto error;
}
if (!(
strcmp(capi->magic, PyExpat_CAPI_MAGIC) == 0
&& (size_t)capi->size >= sizeof(struct PyExpat_CAPI)
)) {
PyErr_SetString(PyExc_ImportError, "pyexpat version is incompatible");
goto error;
}
.. c:macro:: PyExpat_CAPSULE_NAME
The name of the capsule containing the Expat C API:
``"pyexpat.expat_CAPI"``. Pass this to :c:func:`PyCapsule_Import` to obtain
a pointer to a :c:struct:`PyExpat_CAPI`.
.. c:macro:: PyExpat_CAPI_MAGIC
The string identifying the layout of :c:struct:`PyExpat_CAPI`.
Before using the function pointers in the structure, check that
its ``magic`` member compares equal to this string using ``strcmp()``
and its ``size`` member is at least :c:expr:`sizeof(struct PyExpat_CAPI)`.
.. c:struct:: PyExpat_CAPI
Table of function pointers exported by :mod:`xml.parsers.expat`.
The capsule owns this structure: treat it as read-only and do not free it.
Keep a strong reference to the capsule while using the table.
Check the compatibility fields as described under
:c:macro:`PyExpat_CAPI_MAGIC` before using the function pointers.
.. c:member:: char *magic
Interface identifier, set to :c:macro:`PyExpat_CAPI_MAGIC`.
.. c:member:: int size
Size of the structure in bytes, set to ``sizeof(struct PyExpat_CAPI)``
by the :mod:`xml.parsers.expat` module that created the capsule.
.. c:member:: int MAJOR_VERSION
int MINOR_VERSION
int MICRO_VERSION
Major, minor, and micro version numbers of the Expat library used by
:mod:`xml.parsers.expat`, set to ``XML_MAJOR_VERSION``,
``XML_MINOR_VERSION``, and ``XML_MICRO_VERSION`` respectively.
.. c:member:: void (*SetUnknownEncodingHandler)(XML_Parser parser, XML_UnknownEncodingHandler handler, void *encodingHandlerData)
Pointer to `XML_SetUnknownEncodingHandler
<https://libexpat.github.io/doc/api/latest/#XML_SetUnknownEncodingHandler>`_.
The handler may set a Python exception on failure. The caller must
check for a Python exception after parsing.
.. c:member:: int (*DefaultUnknownEncodingHandler)(void *encodingHandlerData, const XML_Char *name, XML_Encoding *info)
Python's unknown-encoding handler for Expat, used with
``XML_SetUnknownEncodingHandler``. It uses Python's codec
registry to fill *info*.
The *encodingHandlerData* argument is unused.
Calling this handler requires an :term:`attached thread state`.
.. versionadded:: 3.3
Pointers to the corresponding Expat functions, or ``NULL`` if not
available in the Expat version used by :mod:`xml.parsers.expat`, are
listed below.
Member names omit the ``XML_`` prefix; for example, ``SetHashSalt``
exposes Expat's ``XML_SetHashSalt`` function. See the `Expat API reference
<https://libexpat.github.io/doc/api/latest/>`_ for their behavior.
.. c:member:: const XML_LChar *(*ErrorString)(enum XML_Error code)
enum XML_Error (*GetErrorCode)(XML_Parser parser)
XML_Size (*GetErrorColumnNumber)(XML_Parser parser)
XML_Size (*GetErrorLineNumber)(XML_Parser parser)
enum XML_Status (*Parse)(XML_Parser parser, const char *s, int len, int isFinal)
XML_Parser (*ParserCreate_MM)(const XML_Char *encoding, const XML_Memory_Handling_Suite *memsuite, const XML_Char *namespaceSeparator)
void (*ParserFree)(XML_Parser parser)
void (*SetCharacterDataHandler)(XML_Parser parser, XML_CharacterDataHandler handler)
void (*SetCommentHandler)(XML_Parser parser, XML_CommentHandler handler)
void (*SetDefaultHandlerExpand)(XML_Parser parser, XML_DefaultHandler handler)
void (*SetElementHandler)(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end)
void (*SetNamespaceDeclHandler)(XML_Parser parser, XML_StartNamespaceDeclHandler start, XML_EndNamespaceDeclHandler end)
void (*SetProcessingInstructionHandler)(XML_Parser parser, XML_ProcessingInstructionHandler handler)
void (*SetUserData)(XML_Parser parser, void *userData)
.. c:member:: void (*SetStartDoctypeDeclHandler)(XML_Parser parser, XML_StartDoctypeDeclHandler start)
.. versionadded:: 3.2
.. c:member:: enum XML_Status (*SetEncoding)(XML_Parser parser, const XML_Char *encoding)
.. versionadded:: 3.3
.. c:member:: int (*SetHashSalt)(XML_Parser parser, unsigned long hash_salt)
Might be ``NULL`` for Expat versions prior to 2.1.0.
.. versionadded:: 3.4
.. c:member:: XML_Bool (*SetReparseDeferralEnabled)(XML_Parser parser, XML_Bool enabled)
Might be ``NULL`` for Expat versions prior to 2.6.0.
.. versionadded:: 3.8
.. c:member:: XML_Bool (*SetAllocTrackerActivationThreshold)(XML_Parser parser, unsigned long long activationThresholdBytes)
Might be ``NULL`` for Expat versions prior to 2.7.2.
.. versionadded:: 3.10
.. c:member:: XML_Bool (*SetAllocTrackerMaximumAmplification)(XML_Parser parser, float maxAmplificationFactor)
Might be ``NULL`` for Expat versions prior to 2.7.2.
.. versionadded:: 3.10
.. c:member:: XML_Bool (*SetBillionLaughsAttackProtectionActivationThreshold)(XML_Parser parser, unsigned long long activationThresholdBytes)
Might be ``NULL`` for Expat versions prior to 2.4.0.
.. versionadded:: 3.10
.. c:member:: XML_Bool (*SetBillionLaughsAttackProtectionMaximumAmplification)(XML_Parser parser, float maxAmplificationFactor)
Might be ``NULL`` for Expat versions prior to 2.4.0.
.. versionadded:: 3.10
.. c:member:: XML_Bool (*SetHashSalt16Bytes)(XML_Parser parser, const uint8_t entropy[16])
Might be ``NULL`` for Expat versions prior to 2.8.0.
.. versionadded:: 3.16