Skip to content

Commit e9445f6

Browse files
authored
gh-141004: document the Python version adding each PyExpat_CAPI member (GH-160471)
1 parent 3a440b6 commit e9445f6

1 file changed

Lines changed: 77 additions & 16 deletions

File tree

‎Doc/c-api/pyexpat.rst‎

Lines changed: 77 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,27 @@ Expat C API
66
The :mod:`xml.parsers.expat` module exposes selected Expat functions
77
through its ``expat_CAPI`` capsule. This allows extension modules to use the
88
same Expat library as Python. The interface is declared in :file:`pyexpat.h`,
9-
which must be included after Expat's :file:`expat.h` header.
9+
which is not included by :file:`Python.h` and must be included after Expat's
10+
:file:`expat.h` header.
11+
12+
To use the C API, add the following code to the extension module
13+
initialization function and store the pointer to the C API in the module
14+
state:
15+
16+
.. code-block::
17+
18+
struct PyExpat_CAPI *capi = NULL;
19+
capi = (struct PyExpat_CAPI *)PyCapsule_Import(PyExpat_CAPSULE_NAME, 0);
20+
if (capi == NULL) {
21+
goto error;
22+
}
23+
if (!(
24+
strcmp(capi->magic, PyExpat_CAPI_MAGIC) == 0
25+
&& (size_t)capi->size >= sizeof(struct PyExpat_CAPI)
26+
)) {
27+
PyErr_SetString(PyExc_ImportError, "pyexpat version is incompatible");
28+
goto error;
29+
}
1030
1131
.. c:macro:: PyExpat_CAPSULE_NAME
1232
@@ -20,7 +40,7 @@ which must be included after Expat's :file:`expat.h` header.
2040
The string identifying the layout of :c:struct:`PyExpat_CAPI`.
2141
Before using the function pointers in the structure, check that
2242
its ``magic`` member compares equal to this string using ``strcmp()``
23-
and its ``size`` member is at least :c:expr:`sizeof(struct PyExpat_CAPI)`.
43+
and its ``size`` member is at least :c:expr:`sizeof(struct PyExpat_CAPI)`.
2444

2545

2646
.. c:struct:: PyExpat_CAPI
@@ -46,7 +66,8 @@ which must be included after Expat's :file:`expat.h` header.
4666
int MICRO_VERSION
4767
4868
Major, minor, and micro version numbers of the Expat library used by
49-
:mod:`xml.parsers.expat`.
69+
:mod:`xml.parsers.expat`, set to ``XML_MAJOR_VERSION``,
70+
``XML_MINOR_VERSION``, and ``XML_MICRO_VERSION`` respectively.
5071

5172
.. c:member:: void (*SetUnknownEncodingHandler)(XML_Parser parser, XML_UnknownEncodingHandler handler, void *encodingHandlerData)
5273
@@ -63,14 +84,15 @@ which must be included after Expat's :file:`expat.h` header.
6384
The *encodingHandlerData* argument is unused.
6485
Calling this handler requires an :term:`attached thread state`.
6586

87+
.. versionadded:: 3.3
88+
6689
Pointers to the corresponding Expat functions, or ``NULL`` if not
6790
available in the Expat version used by :mod:`xml.parsers.expat`, are
6891
listed below.
6992

7093
Member names omit the ``XML_`` prefix; for example, ``SetHashSalt``
7194
exposes Expat's ``XML_SetHashSalt`` function. See the `Expat API reference
72-
<https://libexpat.github.io/doc/api/latest/>`_ for their behavior
73-
and the minimum Expat version they appear in.
95+
<https://libexpat.github.io/doc/api/latest/>`_ for their behavior.
7496

7597
.. c:member:: const XML_LChar *(*ErrorString)(enum XML_Error code)
7698
enum XML_Error (*GetErrorCode)(XML_Parser parser)
@@ -86,14 +108,53 @@ which must be included after Expat's :file:`expat.h` header.
86108
void (*SetNamespaceDeclHandler)(XML_Parser parser, XML_StartNamespaceDeclHandler start, XML_EndNamespaceDeclHandler end)
87109
void (*SetProcessingInstructionHandler)(XML_Parser parser, XML_ProcessingInstructionHandler handler)
88110
void (*SetUserData)(XML_Parser parser, void *userData)
89-
void (*SetStartDoctypeDeclHandler)(XML_Parser parser, XML_StartDoctypeDeclHandler start)
90-
enum XML_Status (*SetEncoding)(XML_Parser parser, const XML_Char *encoding)
91-
int (*SetHashSalt)(XML_Parser parser, unsigned long hash_salt)
92-
XML_Bool (*SetReparseDeferralEnabled)(XML_Parser parser, XML_Bool enabled)
93-
XML_Bool (*SetAllocTrackerActivationThreshold)(XML_Parser parser, unsigned long long activationThresholdBytes)
94-
XML_Bool (*SetAllocTrackerMaximumAmplification)(XML_Parser parser, float maxAmplificationFactor)
95-
XML_Bool (*SetBillionLaughsAttackProtectionActivationThreshold)(XML_Parser parser, unsigned long long activationThresholdBytes)
96-
XML_Bool (*SetBillionLaughsAttackProtectionMaximumAmplification)(XML_Parser parser, float maxAmplificationFactor)
97-
XML_Bool (*SetHashSalt16Bytes)(XML_Parser parser, const uint8_t entropy[16])
98-
99-
See the `Expat API reference <https://libexpat.github.io/doc/api/latest/>`_.
111+
112+
.. c:member:: void (*SetStartDoctypeDeclHandler)(XML_Parser parser, XML_StartDoctypeDeclHandler start)
113+
114+
.. versionadded:: 3.2
115+
116+
.. c:member:: enum XML_Status (*SetEncoding)(XML_Parser parser, const XML_Char *encoding)
117+
118+
.. versionadded:: 3.3
119+
120+
.. c:member:: int (*SetHashSalt)(XML_Parser parser, unsigned long hash_salt)
121+
122+
Might be ``NULL`` for Expat versions prior to 2.1.0.
123+
124+
.. versionadded:: 3.4
125+
126+
.. c:member:: XML_Bool (*SetReparseDeferralEnabled)(XML_Parser parser, XML_Bool enabled)
127+
128+
Might be ``NULL`` for Expat versions prior to 2.6.0.
129+
130+
.. versionadded:: 3.8
131+
132+
.. c:member:: XML_Bool (*SetAllocTrackerActivationThreshold)(XML_Parser parser, unsigned long long activationThresholdBytes)
133+
134+
Might be ``NULL`` for Expat versions prior to 2.7.2.
135+
136+
.. versionadded:: 3.10
137+
138+
.. c:member:: XML_Bool (*SetAllocTrackerMaximumAmplification)(XML_Parser parser, float maxAmplificationFactor)
139+
140+
Might be ``NULL`` for Expat versions prior to 2.7.2.
141+
142+
.. versionadded:: 3.10
143+
144+
.. c:member:: XML_Bool (*SetBillionLaughsAttackProtectionActivationThreshold)(XML_Parser parser, unsigned long long activationThresholdBytes)
145+
146+
Might be ``NULL`` for Expat versions prior to 2.4.0.
147+
148+
.. versionadded:: 3.10
149+
150+
.. c:member:: XML_Bool (*SetBillionLaughsAttackProtectionMaximumAmplification)(XML_Parser parser, float maxAmplificationFactor)
151+
152+
Might be ``NULL`` for Expat versions prior to 2.4.0.
153+
154+
.. versionadded:: 3.10
155+
156+
.. c:member:: XML_Bool (*SetHashSalt16Bytes)(XML_Parser parser, const uint8_t entropy[16])
157+
158+
Might be ``NULL`` for Expat versions prior to 2.8.0.
159+
160+
.. versionadded:: 3.16

0 commit comments

Comments
 (0)