blob: 91f261cb300cb20e21dc5c6a75e0aea2d103f8c3 [file] [log] [blame]
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02001/*[clinic input]
2preserve
3[clinic start generated code]*/
4
5PyDoc_STRVAR(binascii_a2b_uu__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -08006"a2b_uu($module, data, /)\n"
7"--\n"
8"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +02009"Decode a line of uuencoded data.");
10
11#define BINASCII_A2B_UU_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +030012 {"a2b_uu", (PyCFunction)binascii_a2b_uu, METH_O, binascii_a2b_uu__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020013
14static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030015binascii_a2b_uu_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020016
17static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030018binascii_a2b_uu(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020019{
20 PyObject *return_value = NULL;
Benjamin Petersonb62deac2014-01-26 10:41:58 -050021 Py_buffer data = {NULL, NULL};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020022
Serhiy Storchaka32d96a22018-12-25 13:23:47 +020023 if (!ascii_buffer_converter(arg, &data)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020024 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030025 }
Serhiy Storchaka12785612014-01-25 11:49:49 +020026 return_value = binascii_a2b_uu_impl(module, &data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020027
28exit:
Benjamin Petersonb62deac2014-01-26 10:41:58 -050029 /* Cleanup for data */
30 if (data.obj)
31 PyBuffer_Release(&data);
32
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020033 return return_value;
34}
35
36PyDoc_STRVAR(binascii_b2a_uu__doc__,
Xiang Zhang13f1f422017-05-03 11:16:21 +080037"b2a_uu($module, data, /, *, backtick=False)\n"
Larry Hastings2623c8c2014-02-08 22:15:29 -080038"--\n"
39"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020040"Uuencode line of data.");
41
42#define BINASCII_B2A_UU_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +020043 {"b2a_uu", (PyCFunction)(void(*)(void))binascii_b2a_uu, METH_FASTCALL|METH_KEYWORDS, binascii_b2a_uu__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020044
45static PyObject *
Xiang Zhang13f1f422017-05-03 11:16:21 +080046binascii_b2a_uu_impl(PyObject *module, Py_buffer *data, int backtick);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020047
48static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +020049binascii_b2a_uu(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020050{
51 PyObject *return_value = NULL;
Xiang Zhang13f1f422017-05-03 11:16:21 +080052 static const char * const _keywords[] = {"", "backtick", NULL};
53 static _PyArg_Parser _parser = {"y*|$i:b2a_uu", _keywords, 0};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020054 Py_buffer data = {NULL, NULL};
Xiang Zhang13f1f422017-05-03 11:16:21 +080055 int backtick = 0;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020056
Xiang Zhang13f1f422017-05-03 11:16:21 +080057 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
58 &data, &backtick)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020059 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030060 }
Xiang Zhang13f1f422017-05-03 11:16:21 +080061 return_value = binascii_b2a_uu_impl(module, &data, backtick);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020062
63exit:
64 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030065 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020066 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030067 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020068
69 return return_value;
70}
71
72PyDoc_STRVAR(binascii_a2b_base64__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -080073"a2b_base64($module, data, /)\n"
74"--\n"
75"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020076"Decode a line of base64 data.");
77
78#define BINASCII_A2B_BASE64_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +030079 {"a2b_base64", (PyCFunction)binascii_a2b_base64, METH_O, binascii_a2b_base64__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020080
81static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030082binascii_a2b_base64_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020083
84static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +030085binascii_a2b_base64(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020086{
87 PyObject *return_value = NULL;
Benjamin Petersonb62deac2014-01-26 10:41:58 -050088 Py_buffer data = {NULL, NULL};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020089
Serhiy Storchaka32d96a22018-12-25 13:23:47 +020090 if (!ascii_buffer_converter(arg, &data)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020091 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030092 }
Serhiy Storchaka12785612014-01-25 11:49:49 +020093 return_value = binascii_a2b_base64_impl(module, &data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020094
95exit:
Benjamin Petersonb62deac2014-01-26 10:41:58 -050096 /* Cleanup for data */
97 if (data.obj)
98 PyBuffer_Release(&data);
99
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200100 return return_value;
101}
102
103PyDoc_STRVAR(binascii_b2a_base64__doc__,
Xiang Zhang1374dbb2017-05-01 13:12:07 +0800104"b2a_base64($module, data, /, *, newline=True)\n"
Larry Hastings2623c8c2014-02-08 22:15:29 -0800105"--\n"
106"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200107"Base64-code line of data.");
108
109#define BINASCII_B2A_BASE64_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200110 {"b2a_base64", (PyCFunction)(void(*)(void))binascii_b2a_base64, METH_FASTCALL|METH_KEYWORDS, binascii_b2a_base64__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200111
112static PyObject *
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300113binascii_b2a_base64_impl(PyObject *module, Py_buffer *data, int newline);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200114
115static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200116binascii_b2a_base64(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200117{
118 PyObject *return_value = NULL;
Xiang Zhang1374dbb2017-05-01 13:12:07 +0800119 static const char * const _keywords[] = {"", "newline", NULL};
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300120 static _PyArg_Parser _parser = {"y*|$i:b2a_base64", _keywords, 0};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200121 Py_buffer data = {NULL, NULL};
Victor Stinnere84c9762015-10-11 11:01:02 +0200122 int newline = 1;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200123
Victor Stinner3e1fad62017-01-17 01:29:01 +0100124 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300125 &data, &newline)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200126 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300127 }
Victor Stinnere84c9762015-10-11 11:01:02 +0200128 return_value = binascii_b2a_base64_impl(module, &data, newline);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200129
130exit:
131 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300132 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200133 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300134 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200135
136 return return_value;
137}
138
139PyDoc_STRVAR(binascii_a2b_hqx__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800140"a2b_hqx($module, data, /)\n"
141"--\n"
142"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200143"Decode .hqx coding.");
144
145#define BINASCII_A2B_HQX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300146 {"a2b_hqx", (PyCFunction)binascii_a2b_hqx, METH_O, binascii_a2b_hqx__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200147
148static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300149binascii_a2b_hqx_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200150
151static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300152binascii_a2b_hqx(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200153{
154 PyObject *return_value = NULL;
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500155 Py_buffer data = {NULL, NULL};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200156
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200157 if (!ascii_buffer_converter(arg, &data)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200158 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300159 }
Serhiy Storchaka12785612014-01-25 11:49:49 +0200160 return_value = binascii_a2b_hqx_impl(module, &data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200161
162exit:
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500163 /* Cleanup for data */
164 if (data.obj)
165 PyBuffer_Release(&data);
166
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200167 return return_value;
168}
169
170PyDoc_STRVAR(binascii_rlecode_hqx__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800171"rlecode_hqx($module, data, /)\n"
172"--\n"
173"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200174"Binhex RLE-code binary data.");
175
176#define BINASCII_RLECODE_HQX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300177 {"rlecode_hqx", (PyCFunction)binascii_rlecode_hqx, METH_O, binascii_rlecode_hqx__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200178
179static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300180binascii_rlecode_hqx_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200181
182static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300183binascii_rlecode_hqx(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200184{
185 PyObject *return_value = NULL;
186 Py_buffer data = {NULL, NULL};
187
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200188 if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) {
189 goto exit;
190 }
191 if (!PyBuffer_IsContiguous(&data, 'C')) {
192 _PyArg_BadArgument("rlecode_hqx", "contiguous buffer", arg);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200193 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300194 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200195 return_value = binascii_rlecode_hqx_impl(module, &data);
196
197exit:
198 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300199 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200200 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300201 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200202
203 return return_value;
204}
205
206PyDoc_STRVAR(binascii_b2a_hqx__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800207"b2a_hqx($module, data, /)\n"
208"--\n"
209"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200210"Encode .hqx data.");
211
212#define BINASCII_B2A_HQX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300213 {"b2a_hqx", (PyCFunction)binascii_b2a_hqx, METH_O, binascii_b2a_hqx__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200214
215static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300216binascii_b2a_hqx_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200217
218static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300219binascii_b2a_hqx(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200220{
221 PyObject *return_value = NULL;
222 Py_buffer data = {NULL, NULL};
223
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200224 if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) {
225 goto exit;
226 }
227 if (!PyBuffer_IsContiguous(&data, 'C')) {
228 _PyArg_BadArgument("b2a_hqx", "contiguous buffer", arg);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200229 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300230 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200231 return_value = binascii_b2a_hqx_impl(module, &data);
232
233exit:
234 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300235 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200236 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300237 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200238
239 return return_value;
240}
241
242PyDoc_STRVAR(binascii_rledecode_hqx__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800243"rledecode_hqx($module, data, /)\n"
244"--\n"
245"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200246"Decode hexbin RLE-coded string.");
247
248#define BINASCII_RLEDECODE_HQX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300249 {"rledecode_hqx", (PyCFunction)binascii_rledecode_hqx, METH_O, binascii_rledecode_hqx__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200250
251static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300252binascii_rledecode_hqx_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200253
254static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300255binascii_rledecode_hqx(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200256{
257 PyObject *return_value = NULL;
258 Py_buffer data = {NULL, NULL};
259
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200260 if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) {
261 goto exit;
262 }
263 if (!PyBuffer_IsContiguous(&data, 'C')) {
264 _PyArg_BadArgument("rledecode_hqx", "contiguous buffer", arg);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200265 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300266 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200267 return_value = binascii_rledecode_hqx_impl(module, &data);
268
269exit:
270 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300271 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200272 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300273 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200274
275 return return_value;
276}
277
278PyDoc_STRVAR(binascii_crc_hqx__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800279"crc_hqx($module, data, crc, /)\n"
280"--\n"
281"\n"
Martin Panter3310e142016-12-24 07:36:44 +0000282"Compute CRC-CCITT incrementally.");
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200283
284#define BINASCII_CRC_HQX_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200285 {"crc_hqx", (PyCFunction)(void(*)(void))binascii_crc_hqx, METH_FASTCALL, binascii_crc_hqx__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200286
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300287static unsigned int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300288binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200289
290static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200291binascii_crc_hqx(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200292{
293 PyObject *return_value = NULL;
294 Py_buffer data = {NULL, NULL};
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300295 unsigned int crc;
296 unsigned int _return_value;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200297
Sylvain74453812017-06-10 06:51:48 +0200298 if (!_PyArg_ParseStack(args, nargs, "y*I:crc_hqx",
299 &data, &crc)) {
Victor Stinner259f0e42017-01-17 01:35:17 +0100300 goto exit;
301 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200302 _return_value = binascii_crc_hqx_impl(module, &data, crc);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300303 if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200304 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300305 }
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300306 return_value = PyLong_FromUnsignedLong((unsigned long)_return_value);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200307
308exit:
309 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300310 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200311 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300312 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200313
314 return return_value;
315}
316
317PyDoc_STRVAR(binascii_crc32__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800318"crc32($module, data, crc=0, /)\n"
319"--\n"
320"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200321"Compute CRC-32 incrementally.");
322
323#define BINASCII_CRC32_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200324 {"crc32", (PyCFunction)(void(*)(void))binascii_crc32, METH_FASTCALL, binascii_crc32__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200325
326static unsigned int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300327binascii_crc32_impl(PyObject *module, Py_buffer *data, unsigned int crc);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200328
329static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200330binascii_crc32(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200331{
332 PyObject *return_value = NULL;
333 Py_buffer data = {NULL, NULL};
334 unsigned int crc = 0;
335 unsigned int _return_value;
336
Sylvain74453812017-06-10 06:51:48 +0200337 if (!_PyArg_ParseStack(args, nargs, "y*|I:crc32",
338 &data, &crc)) {
Victor Stinner259f0e42017-01-17 01:35:17 +0100339 goto exit;
340 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200341 _return_value = binascii_crc32_impl(module, &data, crc);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300342 if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200343 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300344 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200345 return_value = PyLong_FromUnsignedLong((unsigned long)_return_value);
346
347exit:
348 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300349 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200350 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300351 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200352
353 return return_value;
354}
355
356PyDoc_STRVAR(binascii_b2a_hex__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800357"b2a_hex($module, data, /)\n"
358"--\n"
359"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200360"Hexadecimal representation of binary data.\n"
361"\n"
362"The return value is a bytes object. This function is also\n"
363"available as \"hexlify()\".");
364
365#define BINASCII_B2A_HEX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300366 {"b2a_hex", (PyCFunction)binascii_b2a_hex, METH_O, binascii_b2a_hex__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200367
368static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300369binascii_b2a_hex_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200370
371static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300372binascii_b2a_hex(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200373{
374 PyObject *return_value = NULL;
375 Py_buffer data = {NULL, NULL};
376
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200377 if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) {
378 goto exit;
379 }
380 if (!PyBuffer_IsContiguous(&data, 'C')) {
381 _PyArg_BadArgument("b2a_hex", "contiguous buffer", arg);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200382 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300383 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200384 return_value = binascii_b2a_hex_impl(module, &data);
385
386exit:
387 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300388 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200389 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300390 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200391
392 return return_value;
393}
394
Zachary Wareb176d402015-01-20 13:59:46 -0600395PyDoc_STRVAR(binascii_hexlify__doc__,
396"hexlify($module, data, /)\n"
397"--\n"
398"\n"
399"Hexadecimal representation of binary data.\n"
400"\n"
401"The return value is a bytes object.");
402
403#define BINASCII_HEXLIFY_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300404 {"hexlify", (PyCFunction)binascii_hexlify, METH_O, binascii_hexlify__doc__},
Zachary Wareb176d402015-01-20 13:59:46 -0600405
406static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300407binascii_hexlify_impl(PyObject *module, Py_buffer *data);
Zachary Wareb176d402015-01-20 13:59:46 -0600408
409static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300410binascii_hexlify(PyObject *module, PyObject *arg)
Zachary Wareb176d402015-01-20 13:59:46 -0600411{
412 PyObject *return_value = NULL;
413 Py_buffer data = {NULL, NULL};
414
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200415 if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) {
416 goto exit;
417 }
418 if (!PyBuffer_IsContiguous(&data, 'C')) {
419 _PyArg_BadArgument("hexlify", "contiguous buffer", arg);
Zachary Wareb176d402015-01-20 13:59:46 -0600420 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300421 }
Zachary Wareb176d402015-01-20 13:59:46 -0600422 return_value = binascii_hexlify_impl(module, &data);
423
424exit:
425 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300426 if (data.obj) {
Zachary Wareb176d402015-01-20 13:59:46 -0600427 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300428 }
Zachary Wareb176d402015-01-20 13:59:46 -0600429
430 return return_value;
431}
432
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200433PyDoc_STRVAR(binascii_a2b_hex__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800434"a2b_hex($module, hexstr, /)\n"
435"--\n"
436"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200437"Binary data of hexadecimal representation.\n"
438"\n"
439"hexstr must contain an even number of hex digits (upper or lower case).\n"
440"This function is also available as \"unhexlify()\".");
441
442#define BINASCII_A2B_HEX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300443 {"a2b_hex", (PyCFunction)binascii_a2b_hex, METH_O, binascii_a2b_hex__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200444
445static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300446binascii_a2b_hex_impl(PyObject *module, Py_buffer *hexstr);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200447
448static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300449binascii_a2b_hex(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200450{
451 PyObject *return_value = NULL;
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500452 Py_buffer hexstr = {NULL, NULL};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200453
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200454 if (!ascii_buffer_converter(arg, &hexstr)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200455 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300456 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200457 return_value = binascii_a2b_hex_impl(module, &hexstr);
458
459exit:
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500460 /* Cleanup for hexstr */
461 if (hexstr.obj)
462 PyBuffer_Release(&hexstr);
463
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200464 return return_value;
465}
466
Zachary Wareb176d402015-01-20 13:59:46 -0600467PyDoc_STRVAR(binascii_unhexlify__doc__,
468"unhexlify($module, hexstr, /)\n"
469"--\n"
470"\n"
471"Binary data of hexadecimal representation.\n"
472"\n"
473"hexstr must contain an even number of hex digits (upper or lower case).");
474
475#define BINASCII_UNHEXLIFY_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300476 {"unhexlify", (PyCFunction)binascii_unhexlify, METH_O, binascii_unhexlify__doc__},
Zachary Wareb176d402015-01-20 13:59:46 -0600477
478static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300479binascii_unhexlify_impl(PyObject *module, Py_buffer *hexstr);
Zachary Wareb176d402015-01-20 13:59:46 -0600480
481static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300482binascii_unhexlify(PyObject *module, PyObject *arg)
Zachary Wareb176d402015-01-20 13:59:46 -0600483{
484 PyObject *return_value = NULL;
485 Py_buffer hexstr = {NULL, NULL};
486
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200487 if (!ascii_buffer_converter(arg, &hexstr)) {
Zachary Wareb176d402015-01-20 13:59:46 -0600488 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300489 }
Zachary Wareb176d402015-01-20 13:59:46 -0600490 return_value = binascii_unhexlify_impl(module, &hexstr);
491
492exit:
493 /* Cleanup for hexstr */
494 if (hexstr.obj)
495 PyBuffer_Release(&hexstr);
496
497 return return_value;
498}
499
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200500PyDoc_STRVAR(binascii_a2b_qp__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800501"a2b_qp($module, /, data, header=False)\n"
502"--\n"
503"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200504"Decode a string of qp-encoded data.");
505
506#define BINASCII_A2B_QP_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200507 {"a2b_qp", (PyCFunction)(void(*)(void))binascii_a2b_qp, METH_FASTCALL|METH_KEYWORDS, binascii_a2b_qp__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200508
509static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300510binascii_a2b_qp_impl(PyObject *module, Py_buffer *data, int header);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200511
512static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200513binascii_a2b_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200514{
515 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300516 static const char * const _keywords[] = {"data", "header", NULL};
517 static _PyArg_Parser _parser = {"O&|i:a2b_qp", _keywords, 0};
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500518 Py_buffer data = {NULL, NULL};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200519 int header = 0;
520
Victor Stinner3e1fad62017-01-17 01:29:01 +0100521 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300522 ascii_buffer_converter, &data, &header)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200523 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300524 }
Serhiy Storchaka12785612014-01-25 11:49:49 +0200525 return_value = binascii_a2b_qp_impl(module, &data, header);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200526
527exit:
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500528 /* Cleanup for data */
529 if (data.obj)
530 PyBuffer_Release(&data);
531
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200532 return return_value;
533}
534
535PyDoc_STRVAR(binascii_b2a_qp__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800536"b2a_qp($module, /, data, quotetabs=False, istext=True, header=False)\n"
537"--\n"
538"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200539"Encode a string using quoted-printable encoding.\n"
540"\n"
541"On encoding, when istext is set, newlines are not encoded, and white\n"
542"space at end of lines is. When istext is not set, \\r and \\n (CR/LF)\n"
543"are both encoded. When quotetabs is set, space and tabs are encoded.");
544
545#define BINASCII_B2A_QP_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200546 {"b2a_qp", (PyCFunction)(void(*)(void))binascii_b2a_qp, METH_FASTCALL|METH_KEYWORDS, binascii_b2a_qp__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200547
548static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300549binascii_b2a_qp_impl(PyObject *module, Py_buffer *data, int quotetabs,
Larry Hastings89964c42015-04-14 18:07:59 -0400550 int istext, int header);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200551
552static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200553binascii_b2a_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200554{
555 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300556 static const char * const _keywords[] = {"data", "quotetabs", "istext", "header", NULL};
557 static _PyArg_Parser _parser = {"y*|iii:b2a_qp", _keywords, 0};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200558 Py_buffer data = {NULL, NULL};
559 int quotetabs = 0;
560 int istext = 1;
561 int header = 0;
562
Victor Stinner3e1fad62017-01-17 01:29:01 +0100563 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300564 &data, &quotetabs, &istext, &header)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200565 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300566 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200567 return_value = binascii_b2a_qp_impl(module, &data, quotetabs, istext, header);
568
569exit:
570 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300571 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200572 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300573 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200574
575 return return_value;
576}
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200577/*[clinic end generated code: output=8ff0cb5717b15d1b input=a9049054013a1b77]*/