blob: 3295833e87a9e853f22b5012b11657cf76f1a19b [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')) {
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200192 _PyArg_BadArgument("rlecode_hqx", 0, "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')) {
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200228 _PyArg_BadArgument("b2a_hqx", 0, "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')) {
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200264 _PyArg_BadArgument("rledecode_hqx", 0, "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
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200298 if (!_PyArg_CheckPositional("crc_hqx", nargs, 2, 2)) {
299 goto exit;
300 }
301 if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) {
302 goto exit;
303 }
304 if (!PyBuffer_IsContiguous(&data, 'C')) {
305 _PyArg_BadArgument("crc_hqx", 1, "contiguous buffer", args[0]);
306 goto exit;
307 }
308 if (PyFloat_Check(args[1])) {
309 PyErr_SetString(PyExc_TypeError,
310 "integer argument expected, got float" );
311 goto exit;
312 }
313 crc = (unsigned int)PyLong_AsUnsignedLongMask(args[1]);
314 if (crc == (unsigned int)-1 && PyErr_Occurred()) {
Victor Stinner259f0e42017-01-17 01:35:17 +0100315 goto exit;
316 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200317 _return_value = binascii_crc_hqx_impl(module, &data, crc);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300318 if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200319 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300320 }
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300321 return_value = PyLong_FromUnsignedLong((unsigned long)_return_value);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200322
323exit:
324 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300325 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200326 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300327 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200328
329 return return_value;
330}
331
332PyDoc_STRVAR(binascii_crc32__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800333"crc32($module, data, crc=0, /)\n"
334"--\n"
335"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200336"Compute CRC-32 incrementally.");
337
338#define BINASCII_CRC32_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200339 {"crc32", (PyCFunction)(void(*)(void))binascii_crc32, METH_FASTCALL, binascii_crc32__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200340
341static unsigned int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300342binascii_crc32_impl(PyObject *module, Py_buffer *data, unsigned int crc);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200343
344static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200345binascii_crc32(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200346{
347 PyObject *return_value = NULL;
348 Py_buffer data = {NULL, NULL};
349 unsigned int crc = 0;
350 unsigned int _return_value;
351
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200352 if (!_PyArg_CheckPositional("crc32", nargs, 1, 2)) {
Victor Stinner259f0e42017-01-17 01:35:17 +0100353 goto exit;
354 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200355 if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) {
356 goto exit;
357 }
358 if (!PyBuffer_IsContiguous(&data, 'C')) {
359 _PyArg_BadArgument("crc32", 1, "contiguous buffer", args[0]);
360 goto exit;
361 }
362 if (nargs < 2) {
363 goto skip_optional;
364 }
365 if (PyFloat_Check(args[1])) {
366 PyErr_SetString(PyExc_TypeError,
367 "integer argument expected, got float" );
368 goto exit;
369 }
370 crc = (unsigned int)PyLong_AsUnsignedLongMask(args[1]);
371 if (crc == (unsigned int)-1 && PyErr_Occurred()) {
372 goto exit;
373 }
374skip_optional:
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200375 _return_value = binascii_crc32_impl(module, &data, crc);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300376 if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200377 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300378 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200379 return_value = PyLong_FromUnsignedLong((unsigned long)_return_value);
380
381exit:
382 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300383 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200384 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300385 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200386
387 return return_value;
388}
389
390PyDoc_STRVAR(binascii_b2a_hex__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800391"b2a_hex($module, data, /)\n"
392"--\n"
393"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200394"Hexadecimal representation of binary data.\n"
395"\n"
396"The return value is a bytes object. This function is also\n"
397"available as \"hexlify()\".");
398
399#define BINASCII_B2A_HEX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300400 {"b2a_hex", (PyCFunction)binascii_b2a_hex, METH_O, binascii_b2a_hex__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200401
402static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300403binascii_b2a_hex_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200404
405static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300406binascii_b2a_hex(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200407{
408 PyObject *return_value = NULL;
409 Py_buffer data = {NULL, NULL};
410
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200411 if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) {
412 goto exit;
413 }
414 if (!PyBuffer_IsContiguous(&data, 'C')) {
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200415 _PyArg_BadArgument("b2a_hex", 0, "contiguous buffer", arg);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200416 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300417 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200418 return_value = binascii_b2a_hex_impl(module, &data);
419
420exit:
421 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300422 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200423 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300424 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200425
426 return return_value;
427}
428
Zachary Wareb176d402015-01-20 13:59:46 -0600429PyDoc_STRVAR(binascii_hexlify__doc__,
430"hexlify($module, data, /)\n"
431"--\n"
432"\n"
433"Hexadecimal representation of binary data.\n"
434"\n"
435"The return value is a bytes object.");
436
437#define BINASCII_HEXLIFY_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300438 {"hexlify", (PyCFunction)binascii_hexlify, METH_O, binascii_hexlify__doc__},
Zachary Wareb176d402015-01-20 13:59:46 -0600439
440static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300441binascii_hexlify_impl(PyObject *module, Py_buffer *data);
Zachary Wareb176d402015-01-20 13:59:46 -0600442
443static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300444binascii_hexlify(PyObject *module, PyObject *arg)
Zachary Wareb176d402015-01-20 13:59:46 -0600445{
446 PyObject *return_value = NULL;
447 Py_buffer data = {NULL, NULL};
448
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200449 if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) {
450 goto exit;
451 }
452 if (!PyBuffer_IsContiguous(&data, 'C')) {
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200453 _PyArg_BadArgument("hexlify", 0, "contiguous buffer", arg);
Zachary Wareb176d402015-01-20 13:59:46 -0600454 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300455 }
Zachary Wareb176d402015-01-20 13:59:46 -0600456 return_value = binascii_hexlify_impl(module, &data);
457
458exit:
459 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300460 if (data.obj) {
Zachary Wareb176d402015-01-20 13:59:46 -0600461 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300462 }
Zachary Wareb176d402015-01-20 13:59:46 -0600463
464 return return_value;
465}
466
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200467PyDoc_STRVAR(binascii_a2b_hex__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800468"a2b_hex($module, hexstr, /)\n"
469"--\n"
470"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200471"Binary data of hexadecimal representation.\n"
472"\n"
473"hexstr must contain an even number of hex digits (upper or lower case).\n"
474"This function is also available as \"unhexlify()\".");
475
476#define BINASCII_A2B_HEX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300477 {"a2b_hex", (PyCFunction)binascii_a2b_hex, METH_O, binascii_a2b_hex__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200478
479static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300480binascii_a2b_hex_impl(PyObject *module, Py_buffer *hexstr);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200481
482static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300483binascii_a2b_hex(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200484{
485 PyObject *return_value = NULL;
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500486 Py_buffer hexstr = {NULL, NULL};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200487
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200488 if (!ascii_buffer_converter(arg, &hexstr)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200489 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300490 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200491 return_value = binascii_a2b_hex_impl(module, &hexstr);
492
493exit:
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500494 /* Cleanup for hexstr */
495 if (hexstr.obj)
496 PyBuffer_Release(&hexstr);
497
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200498 return return_value;
499}
500
Zachary Wareb176d402015-01-20 13:59:46 -0600501PyDoc_STRVAR(binascii_unhexlify__doc__,
502"unhexlify($module, hexstr, /)\n"
503"--\n"
504"\n"
505"Binary data of hexadecimal representation.\n"
506"\n"
507"hexstr must contain an even number of hex digits (upper or lower case).");
508
509#define BINASCII_UNHEXLIFY_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300510 {"unhexlify", (PyCFunction)binascii_unhexlify, METH_O, binascii_unhexlify__doc__},
Zachary Wareb176d402015-01-20 13:59:46 -0600511
512static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300513binascii_unhexlify_impl(PyObject *module, Py_buffer *hexstr);
Zachary Wareb176d402015-01-20 13:59:46 -0600514
515static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300516binascii_unhexlify(PyObject *module, PyObject *arg)
Zachary Wareb176d402015-01-20 13:59:46 -0600517{
518 PyObject *return_value = NULL;
519 Py_buffer hexstr = {NULL, NULL};
520
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200521 if (!ascii_buffer_converter(arg, &hexstr)) {
Zachary Wareb176d402015-01-20 13:59:46 -0600522 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300523 }
Zachary Wareb176d402015-01-20 13:59:46 -0600524 return_value = binascii_unhexlify_impl(module, &hexstr);
525
526exit:
527 /* Cleanup for hexstr */
528 if (hexstr.obj)
529 PyBuffer_Release(&hexstr);
530
531 return return_value;
532}
533
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200534PyDoc_STRVAR(binascii_a2b_qp__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800535"a2b_qp($module, /, data, header=False)\n"
536"--\n"
537"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200538"Decode a string of qp-encoded data.");
539
540#define BINASCII_A2B_QP_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200541 {"a2b_qp", (PyCFunction)(void(*)(void))binascii_a2b_qp, METH_FASTCALL|METH_KEYWORDS, binascii_a2b_qp__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200542
543static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300544binascii_a2b_qp_impl(PyObject *module, Py_buffer *data, int header);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200545
546static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200547binascii_a2b_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200548{
549 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300550 static const char * const _keywords[] = {"data", "header", NULL};
551 static _PyArg_Parser _parser = {"O&|i:a2b_qp", _keywords, 0};
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500552 Py_buffer data = {NULL, NULL};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200553 int header = 0;
554
Victor Stinner3e1fad62017-01-17 01:29:01 +0100555 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300556 ascii_buffer_converter, &data, &header)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200557 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300558 }
Serhiy Storchaka12785612014-01-25 11:49:49 +0200559 return_value = binascii_a2b_qp_impl(module, &data, header);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200560
561exit:
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500562 /* Cleanup for data */
563 if (data.obj)
564 PyBuffer_Release(&data);
565
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200566 return return_value;
567}
568
569PyDoc_STRVAR(binascii_b2a_qp__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800570"b2a_qp($module, /, data, quotetabs=False, istext=True, header=False)\n"
571"--\n"
572"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200573"Encode a string using quoted-printable encoding.\n"
574"\n"
575"On encoding, when istext is set, newlines are not encoded, and white\n"
576"space at end of lines is. When istext is not set, \\r and \\n (CR/LF)\n"
577"are both encoded. When quotetabs is set, space and tabs are encoded.");
578
579#define BINASCII_B2A_QP_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200580 {"b2a_qp", (PyCFunction)(void(*)(void))binascii_b2a_qp, METH_FASTCALL|METH_KEYWORDS, binascii_b2a_qp__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200581
582static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300583binascii_b2a_qp_impl(PyObject *module, Py_buffer *data, int quotetabs,
Larry Hastings89964c42015-04-14 18:07:59 -0400584 int istext, int header);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200585
586static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200587binascii_b2a_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200588{
589 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300590 static const char * const _keywords[] = {"data", "quotetabs", "istext", "header", NULL};
591 static _PyArg_Parser _parser = {"y*|iii:b2a_qp", _keywords, 0};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200592 Py_buffer data = {NULL, NULL};
593 int quotetabs = 0;
594 int istext = 1;
595 int header = 0;
596
Victor Stinner3e1fad62017-01-17 01:29:01 +0100597 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300598 &data, &quotetabs, &istext, &header)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200599 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300600 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200601 return_value = binascii_b2a_qp_impl(module, &data, quotetabs, istext, header);
602
603exit:
604 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300605 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200606 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300607 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200608
609 return return_value;
610}
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200611/*[clinic end generated code: output=7210a01a718da4a0 input=a9049054013a1b77]*/