blob: 07ab24c2f7f4d5776dd3e1070f7b1e0e510fe56c [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 Storchaka5dee6552016-06-09 16:16:06 +030023 if (!PyArg_Parse(arg, "O&:a2b_uu", ascii_buffer_converter, &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 Storchaka5dee6552016-06-09 16:16:06 +030090 if (!PyArg_Parse(arg, "O&:a2b_base64", ascii_buffer_converter, &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 Storchaka5dee6552016-06-09 16:16:06 +0300157 if (!PyArg_Parse(arg, "O&:a2b_hqx", ascii_buffer_converter, &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 Storchaka5dee6552016-06-09 16:16:06 +0300188 if (!PyArg_Parse(arg, "y*:rlecode_hqx", &data)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200189 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300190 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200191 return_value = binascii_rlecode_hqx_impl(module, &data);
192
193exit:
194 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300195 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200196 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300197 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200198
199 return return_value;
200}
201
202PyDoc_STRVAR(binascii_b2a_hqx__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800203"b2a_hqx($module, data, /)\n"
204"--\n"
205"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200206"Encode .hqx data.");
207
208#define BINASCII_B2A_HQX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300209 {"b2a_hqx", (PyCFunction)binascii_b2a_hqx, METH_O, binascii_b2a_hqx__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200210
211static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300212binascii_b2a_hqx_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200213
214static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300215binascii_b2a_hqx(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200216{
217 PyObject *return_value = NULL;
218 Py_buffer data = {NULL, NULL};
219
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300220 if (!PyArg_Parse(arg, "y*:b2a_hqx", &data)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200221 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300222 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200223 return_value = binascii_b2a_hqx_impl(module, &data);
224
225exit:
226 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300227 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200228 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300229 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200230
231 return return_value;
232}
233
234PyDoc_STRVAR(binascii_rledecode_hqx__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800235"rledecode_hqx($module, data, /)\n"
236"--\n"
237"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200238"Decode hexbin RLE-coded string.");
239
240#define BINASCII_RLEDECODE_HQX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300241 {"rledecode_hqx", (PyCFunction)binascii_rledecode_hqx, METH_O, binascii_rledecode_hqx__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200242
243static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300244binascii_rledecode_hqx_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200245
246static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300247binascii_rledecode_hqx(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200248{
249 PyObject *return_value = NULL;
250 Py_buffer data = {NULL, NULL};
251
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300252 if (!PyArg_Parse(arg, "y*:rledecode_hqx", &data)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200253 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300254 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200255 return_value = binascii_rledecode_hqx_impl(module, &data);
256
257exit:
258 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300259 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200260 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300261 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200262
263 return return_value;
264}
265
266PyDoc_STRVAR(binascii_crc_hqx__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800267"crc_hqx($module, data, crc, /)\n"
268"--\n"
269"\n"
Martin Panter3310e142016-12-24 07:36:44 +0000270"Compute CRC-CCITT incrementally.");
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200271
272#define BINASCII_CRC_HQX_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200273 {"crc_hqx", (PyCFunction)(void(*)(void))binascii_crc_hqx, METH_FASTCALL, binascii_crc_hqx__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200274
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300275static unsigned int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300276binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200277
278static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200279binascii_crc_hqx(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200280{
281 PyObject *return_value = NULL;
282 Py_buffer data = {NULL, NULL};
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300283 unsigned int crc;
284 unsigned int _return_value;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200285
Sylvain74453812017-06-10 06:51:48 +0200286 if (!_PyArg_ParseStack(args, nargs, "y*I:crc_hqx",
287 &data, &crc)) {
Victor Stinner259f0e42017-01-17 01:35:17 +0100288 goto exit;
289 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200290 _return_value = binascii_crc_hqx_impl(module, &data, crc);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300291 if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200292 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300293 }
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300294 return_value = PyLong_FromUnsignedLong((unsigned long)_return_value);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200295
296exit:
297 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300298 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200299 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300300 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200301
302 return return_value;
303}
304
305PyDoc_STRVAR(binascii_crc32__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800306"crc32($module, data, crc=0, /)\n"
307"--\n"
308"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200309"Compute CRC-32 incrementally.");
310
311#define BINASCII_CRC32_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200312 {"crc32", (PyCFunction)(void(*)(void))binascii_crc32, METH_FASTCALL, binascii_crc32__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200313
314static unsigned int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300315binascii_crc32_impl(PyObject *module, Py_buffer *data, unsigned int crc);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200316
317static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200318binascii_crc32(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200319{
320 PyObject *return_value = NULL;
321 Py_buffer data = {NULL, NULL};
322 unsigned int crc = 0;
323 unsigned int _return_value;
324
Sylvain74453812017-06-10 06:51:48 +0200325 if (!_PyArg_ParseStack(args, nargs, "y*|I:crc32",
326 &data, &crc)) {
Victor Stinner259f0e42017-01-17 01:35:17 +0100327 goto exit;
328 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200329 _return_value = binascii_crc32_impl(module, &data, crc);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300330 if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200331 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300332 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200333 return_value = PyLong_FromUnsignedLong((unsigned long)_return_value);
334
335exit:
336 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300337 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200338 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300339 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200340
341 return return_value;
342}
343
344PyDoc_STRVAR(binascii_b2a_hex__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800345"b2a_hex($module, data, /)\n"
346"--\n"
347"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200348"Hexadecimal representation of binary data.\n"
349"\n"
350"The return value is a bytes object. This function is also\n"
351"available as \"hexlify()\".");
352
353#define BINASCII_B2A_HEX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300354 {"b2a_hex", (PyCFunction)binascii_b2a_hex, METH_O, binascii_b2a_hex__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200355
356static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300357binascii_b2a_hex_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200358
359static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300360binascii_b2a_hex(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200361{
362 PyObject *return_value = NULL;
363 Py_buffer data = {NULL, NULL};
364
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300365 if (!PyArg_Parse(arg, "y*:b2a_hex", &data)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200366 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300367 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200368 return_value = binascii_b2a_hex_impl(module, &data);
369
370exit:
371 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300372 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200373 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300374 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200375
376 return return_value;
377}
378
Zachary Wareb176d402015-01-20 13:59:46 -0600379PyDoc_STRVAR(binascii_hexlify__doc__,
380"hexlify($module, data, /)\n"
381"--\n"
382"\n"
383"Hexadecimal representation of binary data.\n"
384"\n"
385"The return value is a bytes object.");
386
387#define BINASCII_HEXLIFY_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300388 {"hexlify", (PyCFunction)binascii_hexlify, METH_O, binascii_hexlify__doc__},
Zachary Wareb176d402015-01-20 13:59:46 -0600389
390static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300391binascii_hexlify_impl(PyObject *module, Py_buffer *data);
Zachary Wareb176d402015-01-20 13:59:46 -0600392
393static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300394binascii_hexlify(PyObject *module, PyObject *arg)
Zachary Wareb176d402015-01-20 13:59:46 -0600395{
396 PyObject *return_value = NULL;
397 Py_buffer data = {NULL, NULL};
398
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300399 if (!PyArg_Parse(arg, "y*:hexlify", &data)) {
Zachary Wareb176d402015-01-20 13:59:46 -0600400 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300401 }
Zachary Wareb176d402015-01-20 13:59:46 -0600402 return_value = binascii_hexlify_impl(module, &data);
403
404exit:
405 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300406 if (data.obj) {
Zachary Wareb176d402015-01-20 13:59:46 -0600407 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300408 }
Zachary Wareb176d402015-01-20 13:59:46 -0600409
410 return return_value;
411}
412
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200413PyDoc_STRVAR(binascii_a2b_hex__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800414"a2b_hex($module, hexstr, /)\n"
415"--\n"
416"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200417"Binary data of hexadecimal representation.\n"
418"\n"
419"hexstr must contain an even number of hex digits (upper or lower case).\n"
420"This function is also available as \"unhexlify()\".");
421
422#define BINASCII_A2B_HEX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300423 {"a2b_hex", (PyCFunction)binascii_a2b_hex, METH_O, binascii_a2b_hex__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200424
425static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300426binascii_a2b_hex_impl(PyObject *module, Py_buffer *hexstr);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200427
428static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300429binascii_a2b_hex(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200430{
431 PyObject *return_value = NULL;
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500432 Py_buffer hexstr = {NULL, NULL};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200433
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300434 if (!PyArg_Parse(arg, "O&:a2b_hex", ascii_buffer_converter, &hexstr)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200435 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300436 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200437 return_value = binascii_a2b_hex_impl(module, &hexstr);
438
439exit:
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500440 /* Cleanup for hexstr */
441 if (hexstr.obj)
442 PyBuffer_Release(&hexstr);
443
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200444 return return_value;
445}
446
Zachary Wareb176d402015-01-20 13:59:46 -0600447PyDoc_STRVAR(binascii_unhexlify__doc__,
448"unhexlify($module, hexstr, /)\n"
449"--\n"
450"\n"
451"Binary data of hexadecimal representation.\n"
452"\n"
453"hexstr must contain an even number of hex digits (upper or lower case).");
454
455#define BINASCII_UNHEXLIFY_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300456 {"unhexlify", (PyCFunction)binascii_unhexlify, METH_O, binascii_unhexlify__doc__},
Zachary Wareb176d402015-01-20 13:59:46 -0600457
458static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300459binascii_unhexlify_impl(PyObject *module, Py_buffer *hexstr);
Zachary Wareb176d402015-01-20 13:59:46 -0600460
461static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300462binascii_unhexlify(PyObject *module, PyObject *arg)
Zachary Wareb176d402015-01-20 13:59:46 -0600463{
464 PyObject *return_value = NULL;
465 Py_buffer hexstr = {NULL, NULL};
466
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300467 if (!PyArg_Parse(arg, "O&:unhexlify", ascii_buffer_converter, &hexstr)) {
Zachary Wareb176d402015-01-20 13:59:46 -0600468 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300469 }
Zachary Wareb176d402015-01-20 13:59:46 -0600470 return_value = binascii_unhexlify_impl(module, &hexstr);
471
472exit:
473 /* Cleanup for hexstr */
474 if (hexstr.obj)
475 PyBuffer_Release(&hexstr);
476
477 return return_value;
478}
479
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200480PyDoc_STRVAR(binascii_a2b_qp__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800481"a2b_qp($module, /, data, header=False)\n"
482"--\n"
483"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200484"Decode a string of qp-encoded data.");
485
486#define BINASCII_A2B_QP_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200487 {"a2b_qp", (PyCFunction)(void(*)(void))binascii_a2b_qp, METH_FASTCALL|METH_KEYWORDS, binascii_a2b_qp__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200488
489static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300490binascii_a2b_qp_impl(PyObject *module, Py_buffer *data, int header);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200491
492static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200493binascii_a2b_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200494{
495 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300496 static const char * const _keywords[] = {"data", "header", NULL};
497 static _PyArg_Parser _parser = {"O&|i:a2b_qp", _keywords, 0};
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500498 Py_buffer data = {NULL, NULL};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200499 int header = 0;
500
Victor Stinner3e1fad62017-01-17 01:29:01 +0100501 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300502 ascii_buffer_converter, &data, &header)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200503 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300504 }
Serhiy Storchaka12785612014-01-25 11:49:49 +0200505 return_value = binascii_a2b_qp_impl(module, &data, header);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200506
507exit:
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500508 /* Cleanup for data */
509 if (data.obj)
510 PyBuffer_Release(&data);
511
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200512 return return_value;
513}
514
515PyDoc_STRVAR(binascii_b2a_qp__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800516"b2a_qp($module, /, data, quotetabs=False, istext=True, header=False)\n"
517"--\n"
518"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200519"Encode a string using quoted-printable encoding.\n"
520"\n"
521"On encoding, when istext is set, newlines are not encoded, and white\n"
522"space at end of lines is. When istext is not set, \\r and \\n (CR/LF)\n"
523"are both encoded. When quotetabs is set, space and tabs are encoded.");
524
525#define BINASCII_B2A_QP_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200526 {"b2a_qp", (PyCFunction)(void(*)(void))binascii_b2a_qp, METH_FASTCALL|METH_KEYWORDS, binascii_b2a_qp__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200527
528static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300529binascii_b2a_qp_impl(PyObject *module, Py_buffer *data, int quotetabs,
Larry Hastings89964c42015-04-14 18:07:59 -0400530 int istext, int header);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200531
532static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200533binascii_b2a_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200534{
535 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300536 static const char * const _keywords[] = {"data", "quotetabs", "istext", "header", NULL};
537 static _PyArg_Parser _parser = {"y*|iii:b2a_qp", _keywords, 0};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200538 Py_buffer data = {NULL, NULL};
539 int quotetabs = 0;
540 int istext = 1;
541 int header = 0;
542
Victor Stinner3e1fad62017-01-17 01:29:01 +0100543 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300544 &data, &quotetabs, &istext, &header)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200545 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300546 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200547 return_value = binascii_b2a_qp_impl(module, &data, quotetabs, istext, header);
548
549exit:
550 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300551 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200552 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300553 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200554
555 return return_value;
556}
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200557/*[clinic end generated code: output=3f45e15ce8b563b7 input=a9049054013a1b77]*/