Skip to content

Commit dc77ab0

Browse files
committed
document Expat C API
1 parent 87942d9 commit dc77ab0

File tree

2 files changed

+201
-1
lines changed

2 files changed

+201
-1
lines changed

Doc/c-api/concrete.rst

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,5 +115,13 @@ Other Objects
115115
gen.rst
116116
coro.rst
117117
contextvars.rst
118-
datetime.rst
119118
typehints.rst
119+
120+
121+
C API for extension modules
122+
===========================
123+
124+
.. toctree::
125+
126+
datetime.rst
127+
expat.rst

Doc/c-api/expat.rst

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
.. highlight:: c
2+
3+
Expat C API
4+
-----------
5+
6+
:mod:`pyexpat` exposes a C interface for extension modules.
7+
Consumers must include the header file :file:`pyexpat.h` (which is not
8+
included by default by :file:`Python.h`) and ``expat.h`` for Expat.
9+
10+
To use the C API, consider adding the following code in your extension
11+
module initilisation function and store the pointer to the C API in
12+
the module state:
13+
14+
.. code-block::
15+
16+
struct PyExpat_CAPI *capi = NULL;
17+
capi = (struct PyExpat_CAPI *)PyCapsule_Import(PyExpat_CAPSULE_NAME, 0);
18+
if (capi == NULL) { goto error; }
19+
20+
/* check if the C API is compatible with the version of Expat version */
21+
if (strcmp(capi->magic, PyExpat_CAPI_MAGIC) != 0
22+
|| (size_t)capi->size < sizeof(struct PyExpat_CAPI)
23+
|| capi->MAJOR_VERSION != XML_MAJOR_VERSION
24+
|| capi->MINOR_VERSION != XML_MINOR_VERSION
25+
|| capi->MICRO_VERSION != XML_MICRO_VERSION
26+
) {
27+
PyErr_SetString(PyExc_ImportError, "pyexpat version is incompatible");
28+
goto error;
29+
}
30+
31+
32+
.. c:macro:: PyExpat_CAPI_MAGIC
33+
34+
The Expat C API magic number.
35+
36+
37+
.. c:macro:: PyExpat_CAPSULE_NAME
38+
39+
The Expat C API capsule name to import via :c:func:`PyCapsule_Import`.
40+
41+
42+
.. c:struct:: PyExpat_CAPI
43+
44+
The Expat C API structure.
45+
46+
.. below are members that were added in Python 2.x
47+
48+
.. c:member:: char *magic
49+
50+
Set to :c:macro:`PyExpat_CAPI_MAGIC`.
51+
52+
.. c:member:: int size
53+
54+
Set to ``sizeof(struct PyExpat_CAPI)``.
55+
56+
.. c:member:: MAJOR_VERSION
57+
MINOR_VERSION
58+
MICRO_VERSION
59+
60+
Set to ``XML_MAJOR_VERSION``, ``XML_MINOR_VERSION``,
61+
and ``XML_MICRO_VERSION`` respectively of the linked
62+
Expat library.
63+
64+
The following members expose the C API as provided by Expat.
65+
See the `official documentation <https://libexpat.github.io/doc/api/latest>`_
66+
for details (some names may slightly differ but the signature and intent
67+
will not).
68+
69+
.. c:member:: const XML_LChar *(*ErrorString)(enum XML_Error errno)
70+
.. c:member:: enum XML_Error (*GetErrorCode)(XML_Parser parser)
71+
72+
.. c:member:: XML_Size (*GetErrorColumnNumber)(XML_Parser parser)
73+
.. c:member:: XML_Size (*GetErrorLineNumber)(XML_Parser parser)
74+
75+
.. c:member:: enum XML_Status (*Parse)(\
76+
XML_Parser parser,\
77+
const char *s, int len, int isFinal)
78+
79+
.. c:member:: XML_Parser (*ParserCreate_MM)(\
80+
const XML_Char *encoding,\
81+
const XML_Memory_Handling_Suite *memsuite,\
82+
const XML_Char *sep)
83+
84+
.. c:member:: void (*ParserFree)(XML_Parser parser)
85+
86+
.. c:member:: void (*SetCharacterDataHandler)(\
87+
XML_Parser parser,\
88+
XML_CharacterDataHandler handler)
89+
90+
.. c:member:: void (*SetCommentHandler)(\
91+
XML_Parser parser,\
92+
XML_CommentHandler handler)
93+
94+
.. c:member:: void (*SetDefaultHandlerExpand)(\
95+
XML_Parser parser,\
96+
XML_DefaultHandler handler)
97+
98+
.. c:member:: void (*SetElementHandler)(\
99+
XML_Parser parser,\
100+
XML_StartElementHandler start,\
101+
XML_EndElementHandler end)
102+
103+
.. c:member:: void (*SetNamespaceDeclHandler)(\
104+
XML_Parser parser,\
105+
XML_StartNamespaceDeclHandler start,\
106+
XML_EndNamespaceDeclHandler end)
107+
108+
.. c:member:: void (*SetProcessingInstructionHandler)(\
109+
XML_Parser parser,\
110+
XML_ProcessingInstructionHandler handler)
111+
112+
.. c:member:: void (*SetUnknownEncodingHandler)(\
113+
XML_Parser parser,\
114+
XML_UnknownEncodingHandler handler,\
115+
void *encodingHandlerData)
116+
117+
.. c:member:: void (*SetUserData)(\
118+
XML_Parser parser,\
119+
void *userData)
120+
121+
.. below are members that were added after Python 3.0
122+
123+
.. c:member:: void (*SetStartDoctypeDeclHandler)(\
124+
XML_Parser parser,\
125+
XML_StartDoctypeDeclHandler start)
126+
127+
.. versionadded:: 3.2
128+
129+
.. c:member:: enum XML_Status (*SetEncoding)(\
130+
XML_Parser parser,\
131+
const XML_Char *encoding)
132+
133+
.. versionadded:: 3.3
134+
135+
.. c:member:: int (*DefaultUnknownEncodingHandler)(\
136+
void *encodingHandlerData,\
137+
const XML_Char *name,\
138+
XML_Encoding *info)
139+
140+
.. versionadded:: 3.3
141+
142+
.. c:member:: int (*SetHashSalt)(\
143+
XML_Parser parser,\
144+
unsigned long hash_salt)
145+
146+
Might be NULL for Expat versions prior to 2.1.0.
147+
148+
.. versionadded:: 3.4
149+
150+
.. c:member:: XML_Bool (*SetReparseDeferralEnabled)(\
151+
XML_Parser parser,\
152+
XML_Bool enabled)
153+
154+
Might be NULL for Expat versions prior to 2.6.0.
155+
156+
.. versionadded:: 3.8
157+
158+
.. c:member:: XML_Bool (*SetAllocTrackerActivationThreshold)(\
159+
XML_Parser parser,\
160+
unsigned long long activationThresholdBytes)
161+
162+
Might be NULL for Expat versions prior to 2.7.2.
163+
164+
.. uncomment this when the backport is done
165+
.. versionadded:: 3.10
166+
167+
.. c:member:: XML_Bool (*SetAllocTrackerMaximumAmplification)(\
168+
XML_Parser parser,\
169+
float maxAmplificationFactor)
170+
171+
Might be NULL for Expat versions prior to 2.7.2.
172+
173+
.. uncomment this when the backport is done
174+
.. versionadded:: 3.10
175+
176+
.. c:member:: XML_Bool (*SetBillionLaughsAttackProtectionActivationThreshold)(\
177+
XML_Parser parser,\
178+
unsigned long long activationThresholdBytes)
179+
180+
Might be NULL for Expat versions prior to 2.4.0.
181+
182+
.. uncomment this when the backport is done
183+
.. versionadded:: 3.10
184+
185+
.. c:member:: XML_Bool (*SetBillionLaughsAttackProtectionMaximumAmplification)(\
186+
XML_Parser parser,\
187+
float maxAmplificationFactor)
188+
189+
Might be NULL for Expat versions prior to 2.4.0.
190+
191+
.. uncomment this when the backport is done
192+
.. versionadded:: 3.10

0 commit comments

Comments
 (0)