@@ -6,7 +6,27 @@ Expat C API
66The :mod: `xml.parsers.expat ` module exposes selected Expat functions
77through its ``expat_CAPI `` capsule. This allows extension modules to use the
88same 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