blob: 4d02c72c472e1d89a7fd59cc4129169cc2034a42 [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};
Serhiy Storchaka31913912019-03-14 10:32:22 +020053 static _PyArg_Parser _parser = {NULL, _keywords, "b2a_uu", 0};
54 PyObject *argsbuf[2];
55 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020056 Py_buffer data = {NULL, NULL};
Xiang Zhang13f1f422017-05-03 11:16:21 +080057 int backtick = 0;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020058
Serhiy Storchaka31913912019-03-14 10:32:22 +020059 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
60 if (!args) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020061 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030062 }
Serhiy Storchaka31913912019-03-14 10:32:22 +020063 if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) {
64 goto exit;
65 }
66 if (!PyBuffer_IsContiguous(&data, 'C')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +020067 _PyArg_BadArgument("b2a_uu", "argument 1", "contiguous buffer", args[0]);
Serhiy Storchaka31913912019-03-14 10:32:22 +020068 goto exit;
69 }
70 if (!noptargs) {
71 goto skip_optional_kwonly;
72 }
73 if (PyFloat_Check(args[1])) {
74 PyErr_SetString(PyExc_TypeError,
75 "integer argument expected, got float" );
76 goto exit;
77 }
78 backtick = _PyLong_AsInt(args[1]);
79 if (backtick == -1 && PyErr_Occurred()) {
80 goto exit;
81 }
82skip_optional_kwonly:
Xiang Zhang13f1f422017-05-03 11:16:21 +080083 return_value = binascii_b2a_uu_impl(module, &data, backtick);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020084
85exit:
86 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030087 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020088 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030089 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020090
91 return return_value;
92}
93
94PyDoc_STRVAR(binascii_a2b_base64__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -080095"a2b_base64($module, data, /)\n"
96"--\n"
97"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +020098"Decode a line of base64 data.");
99
100#define BINASCII_A2B_BASE64_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300101 {"a2b_base64", (PyCFunction)binascii_a2b_base64, METH_O, binascii_a2b_base64__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200102
103static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300104binascii_a2b_base64_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200105
106static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300107binascii_a2b_base64(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200108{
109 PyObject *return_value = NULL;
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500110 Py_buffer data = {NULL, NULL};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200111
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200112 if (!ascii_buffer_converter(arg, &data)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200113 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300114 }
Serhiy Storchaka12785612014-01-25 11:49:49 +0200115 return_value = binascii_a2b_base64_impl(module, &data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200116
117exit:
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500118 /* Cleanup for data */
119 if (data.obj)
120 PyBuffer_Release(&data);
121
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200122 return return_value;
123}
124
125PyDoc_STRVAR(binascii_b2a_base64__doc__,
Xiang Zhang1374dbb2017-05-01 13:12:07 +0800126"b2a_base64($module, data, /, *, newline=True)\n"
Larry Hastings2623c8c2014-02-08 22:15:29 -0800127"--\n"
128"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200129"Base64-code line of data.");
130
131#define BINASCII_B2A_BASE64_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200132 {"b2a_base64", (PyCFunction)(void(*)(void))binascii_b2a_base64, METH_FASTCALL|METH_KEYWORDS, binascii_b2a_base64__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200133
134static PyObject *
Serhiy Storchaka2954f832016-07-07 18:20:03 +0300135binascii_b2a_base64_impl(PyObject *module, Py_buffer *data, int newline);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200136
137static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200138binascii_b2a_base64(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200139{
140 PyObject *return_value = NULL;
Xiang Zhang1374dbb2017-05-01 13:12:07 +0800141 static const char * const _keywords[] = {"", "newline", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200142 static _PyArg_Parser _parser = {NULL, _keywords, "b2a_base64", 0};
143 PyObject *argsbuf[2];
144 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200145 Py_buffer data = {NULL, NULL};
Victor Stinnere84c9762015-10-11 11:01:02 +0200146 int newline = 1;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200147
Serhiy Storchaka31913912019-03-14 10:32:22 +0200148 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
149 if (!args) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200150 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300151 }
Serhiy Storchaka31913912019-03-14 10:32:22 +0200152 if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) {
153 goto exit;
154 }
155 if (!PyBuffer_IsContiguous(&data, 'C')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200156 _PyArg_BadArgument("b2a_base64", "argument 1", "contiguous buffer", args[0]);
Serhiy Storchaka31913912019-03-14 10:32:22 +0200157 goto exit;
158 }
159 if (!noptargs) {
160 goto skip_optional_kwonly;
161 }
162 if (PyFloat_Check(args[1])) {
163 PyErr_SetString(PyExc_TypeError,
164 "integer argument expected, got float" );
165 goto exit;
166 }
167 newline = _PyLong_AsInt(args[1]);
168 if (newline == -1 && PyErr_Occurred()) {
169 goto exit;
170 }
171skip_optional_kwonly:
Victor Stinnere84c9762015-10-11 11:01:02 +0200172 return_value = binascii_b2a_base64_impl(module, &data, newline);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200173
174exit:
175 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300176 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200177 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300178 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200179
180 return return_value;
181}
182
183PyDoc_STRVAR(binascii_a2b_hqx__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800184"a2b_hqx($module, data, /)\n"
185"--\n"
186"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200187"Decode .hqx coding.");
188
189#define BINASCII_A2B_HQX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300190 {"a2b_hqx", (PyCFunction)binascii_a2b_hqx, METH_O, binascii_a2b_hqx__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200191
192static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300193binascii_a2b_hqx_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200194
195static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300196binascii_a2b_hqx(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200197{
198 PyObject *return_value = NULL;
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500199 Py_buffer data = {NULL, NULL};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200200
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200201 if (!ascii_buffer_converter(arg, &data)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200202 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300203 }
Serhiy Storchaka12785612014-01-25 11:49:49 +0200204 return_value = binascii_a2b_hqx_impl(module, &data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200205
206exit:
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500207 /* Cleanup for data */
208 if (data.obj)
209 PyBuffer_Release(&data);
210
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200211 return return_value;
212}
213
214PyDoc_STRVAR(binascii_rlecode_hqx__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800215"rlecode_hqx($module, data, /)\n"
216"--\n"
217"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200218"Binhex RLE-code binary data.");
219
220#define BINASCII_RLECODE_HQX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300221 {"rlecode_hqx", (PyCFunction)binascii_rlecode_hqx, METH_O, binascii_rlecode_hqx__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200222
223static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300224binascii_rlecode_hqx_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200225
226static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300227binascii_rlecode_hqx(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200228{
229 PyObject *return_value = NULL;
230 Py_buffer data = {NULL, NULL};
231
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200232 if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) {
233 goto exit;
234 }
235 if (!PyBuffer_IsContiguous(&data, 'C')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200236 _PyArg_BadArgument("rlecode_hqx", "argument", "contiguous buffer", arg);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200237 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300238 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200239 return_value = binascii_rlecode_hqx_impl(module, &data);
240
241exit:
242 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300243 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200244 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300245 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200246
247 return return_value;
248}
249
250PyDoc_STRVAR(binascii_b2a_hqx__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800251"b2a_hqx($module, data, /)\n"
252"--\n"
253"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200254"Encode .hqx data.");
255
256#define BINASCII_B2A_HQX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300257 {"b2a_hqx", (PyCFunction)binascii_b2a_hqx, METH_O, binascii_b2a_hqx__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200258
259static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300260binascii_b2a_hqx_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200261
262static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300263binascii_b2a_hqx(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200264{
265 PyObject *return_value = NULL;
266 Py_buffer data = {NULL, NULL};
267
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200268 if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) {
269 goto exit;
270 }
271 if (!PyBuffer_IsContiguous(&data, 'C')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200272 _PyArg_BadArgument("b2a_hqx", "argument", "contiguous buffer", arg);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200273 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300274 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200275 return_value = binascii_b2a_hqx_impl(module, &data);
276
277exit:
278 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300279 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200280 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300281 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200282
283 return return_value;
284}
285
286PyDoc_STRVAR(binascii_rledecode_hqx__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800287"rledecode_hqx($module, data, /)\n"
288"--\n"
289"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200290"Decode hexbin RLE-coded string.");
291
292#define BINASCII_RLEDECODE_HQX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300293 {"rledecode_hqx", (PyCFunction)binascii_rledecode_hqx, METH_O, binascii_rledecode_hqx__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200294
295static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300296binascii_rledecode_hqx_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200297
298static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300299binascii_rledecode_hqx(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200300{
301 PyObject *return_value = NULL;
302 Py_buffer data = {NULL, NULL};
303
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200304 if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) {
305 goto exit;
306 }
307 if (!PyBuffer_IsContiguous(&data, 'C')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200308 _PyArg_BadArgument("rledecode_hqx", "argument", "contiguous buffer", arg);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200309 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300310 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200311 return_value = binascii_rledecode_hqx_impl(module, &data);
312
313exit:
314 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300315 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200316 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300317 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200318
319 return return_value;
320}
321
322PyDoc_STRVAR(binascii_crc_hqx__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800323"crc_hqx($module, data, crc, /)\n"
324"--\n"
325"\n"
Martin Panter3310e142016-12-24 07:36:44 +0000326"Compute CRC-CCITT incrementally.");
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200327
328#define BINASCII_CRC_HQX_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200329 {"crc_hqx", (PyCFunction)(void(*)(void))binascii_crc_hqx, METH_FASTCALL, binascii_crc_hqx__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200330
Victor Stinnerbeea26b2020-01-22 20:44:22 +0100331static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300332binascii_crc_hqx_impl(PyObject *module, Py_buffer *data, unsigned int crc);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200333
334static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200335binascii_crc_hqx(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200336{
337 PyObject *return_value = NULL;
338 Py_buffer data = {NULL, NULL};
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300339 unsigned int crc;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200340
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200341 if (!_PyArg_CheckPositional("crc_hqx", nargs, 2, 2)) {
342 goto exit;
343 }
344 if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) {
345 goto exit;
346 }
347 if (!PyBuffer_IsContiguous(&data, 'C')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200348 _PyArg_BadArgument("crc_hqx", "argument 1", "contiguous buffer", args[0]);
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200349 goto exit;
350 }
351 if (PyFloat_Check(args[1])) {
352 PyErr_SetString(PyExc_TypeError,
353 "integer argument expected, got float" );
354 goto exit;
355 }
356 crc = (unsigned int)PyLong_AsUnsignedLongMask(args[1]);
357 if (crc == (unsigned int)-1 && PyErr_Occurred()) {
Victor Stinner259f0e42017-01-17 01:35:17 +0100358 goto exit;
359 }
Victor Stinnerbeea26b2020-01-22 20:44:22 +0100360 return_value = binascii_crc_hqx_impl(module, &data, crc);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200361
362exit:
363 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300364 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200365 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300366 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200367
368 return return_value;
369}
370
371PyDoc_STRVAR(binascii_crc32__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800372"crc32($module, data, crc=0, /)\n"
373"--\n"
374"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200375"Compute CRC-32 incrementally.");
376
377#define BINASCII_CRC32_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200378 {"crc32", (PyCFunction)(void(*)(void))binascii_crc32, METH_FASTCALL, binascii_crc32__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200379
380static unsigned int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300381binascii_crc32_impl(PyObject *module, Py_buffer *data, unsigned int crc);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200382
383static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200384binascii_crc32(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200385{
386 PyObject *return_value = NULL;
387 Py_buffer data = {NULL, NULL};
388 unsigned int crc = 0;
389 unsigned int _return_value;
390
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200391 if (!_PyArg_CheckPositional("crc32", nargs, 1, 2)) {
Victor Stinner259f0e42017-01-17 01:35:17 +0100392 goto exit;
393 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200394 if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) {
395 goto exit;
396 }
397 if (!PyBuffer_IsContiguous(&data, 'C')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200398 _PyArg_BadArgument("crc32", "argument 1", "contiguous buffer", args[0]);
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200399 goto exit;
400 }
401 if (nargs < 2) {
402 goto skip_optional;
403 }
404 if (PyFloat_Check(args[1])) {
405 PyErr_SetString(PyExc_TypeError,
406 "integer argument expected, got float" );
407 goto exit;
408 }
409 crc = (unsigned int)PyLong_AsUnsignedLongMask(args[1]);
410 if (crc == (unsigned int)-1 && PyErr_Occurred()) {
411 goto exit;
412 }
413skip_optional:
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200414 _return_value = binascii_crc32_impl(module, &data, crc);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300415 if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) {
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 = PyLong_FromUnsignedLong((unsigned long)_return_value);
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
429PyDoc_STRVAR(binascii_b2a_hex__doc__,
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300430"b2a_hex($module, /, data, sep=<unrepresentable>, bytes_per_sep=1)\n"
Larry Hastings2623c8c2014-02-08 22:15:29 -0800431"--\n"
432"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200433"Hexadecimal representation of binary data.\n"
434"\n"
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700435" sep\n"
436" An optional single character or byte to separate hex bytes.\n"
437" bytes_per_sep\n"
438" How many bytes between separators. Positive values count from the\n"
439" right, negative values count from the left.\n"
440"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200441"The return value is a bytes object. This function is also\n"
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700442"available as \"hexlify()\".\n"
443"\n"
444"Example:\n"
445">>> binascii.b2a_hex(b\'\\xb9\\x01\\xef\')\n"
446"b\'b901ef\'\n"
447">>> binascii.hexlify(b\'\\xb9\\x01\\xef\', \':\')\n"
448"b\'b9:01:ef\'\n"
449">>> binascii.b2a_hex(b\'\\xb9\\x01\\xef\', b\'_\', 2)\n"
450"b\'b9_01ef\'");
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200451
452#define BINASCII_B2A_HEX_METHODDEF \
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700453 {"b2a_hex", (PyCFunction)(void(*)(void))binascii_b2a_hex, METH_FASTCALL|METH_KEYWORDS, binascii_b2a_hex__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200454
455static PyObject *
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700456binascii_b2a_hex_impl(PyObject *module, Py_buffer *data, PyObject *sep,
457 int bytes_per_sep);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200458
459static PyObject *
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700460binascii_b2a_hex(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200461{
462 PyObject *return_value = NULL;
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700463 static const char * const _keywords[] = {"data", "sep", "bytes_per_sep", NULL};
464 static _PyArg_Parser _parser = {NULL, _keywords, "b2a_hex", 0};
465 PyObject *argsbuf[3];
466 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200467 Py_buffer data = {NULL, NULL};
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700468 PyObject *sep = NULL;
469 int bytes_per_sep = 1;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200470
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700471 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf);
472 if (!args) {
473 goto exit;
474 }
475 if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) {
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200476 goto exit;
477 }
478 if (!PyBuffer_IsContiguous(&data, 'C')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200479 _PyArg_BadArgument("b2a_hex", "argument 'data'", "contiguous buffer", args[0]);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200480 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300481 }
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700482 if (!noptargs) {
483 goto skip_optional_pos;
484 }
485 if (args[1]) {
486 sep = args[1];
487 if (!--noptargs) {
488 goto skip_optional_pos;
489 }
490 }
491 if (PyFloat_Check(args[2])) {
492 PyErr_SetString(PyExc_TypeError,
493 "integer argument expected, got float" );
494 goto exit;
495 }
496 bytes_per_sep = _PyLong_AsInt(args[2]);
497 if (bytes_per_sep == -1 && PyErr_Occurred()) {
498 goto exit;
499 }
500skip_optional_pos:
501 return_value = binascii_b2a_hex_impl(module, &data, sep, bytes_per_sep);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200502
503exit:
504 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300505 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200506 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300507 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200508
509 return return_value;
510}
511
Zachary Wareb176d402015-01-20 13:59:46 -0600512PyDoc_STRVAR(binascii_hexlify__doc__,
Serhiy Storchaka279f4462019-09-14 12:24:05 +0300513"hexlify($module, /, data, sep=<unrepresentable>, bytes_per_sep=1)\n"
Zachary Wareb176d402015-01-20 13:59:46 -0600514"--\n"
515"\n"
516"Hexadecimal representation of binary data.\n"
517"\n"
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700518" sep\n"
519" An optional single character or byte to separate hex bytes.\n"
520" bytes_per_sep\n"
521" How many bytes between separators. Positive values count from the\n"
522" right, negative values count from the left.\n"
523"\n"
524"The return value is a bytes object. This function is also\n"
525"available as \"b2a_hex()\".");
Zachary Wareb176d402015-01-20 13:59:46 -0600526
527#define BINASCII_HEXLIFY_METHODDEF \
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700528 {"hexlify", (PyCFunction)(void(*)(void))binascii_hexlify, METH_FASTCALL|METH_KEYWORDS, binascii_hexlify__doc__},
Zachary Wareb176d402015-01-20 13:59:46 -0600529
530static PyObject *
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700531binascii_hexlify_impl(PyObject *module, Py_buffer *data, PyObject *sep,
532 int bytes_per_sep);
Zachary Wareb176d402015-01-20 13:59:46 -0600533
534static PyObject *
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700535binascii_hexlify(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Zachary Wareb176d402015-01-20 13:59:46 -0600536{
537 PyObject *return_value = NULL;
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700538 static const char * const _keywords[] = {"data", "sep", "bytes_per_sep", NULL};
539 static _PyArg_Parser _parser = {NULL, _keywords, "hexlify", 0};
540 PyObject *argsbuf[3];
541 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
Zachary Wareb176d402015-01-20 13:59:46 -0600542 Py_buffer data = {NULL, NULL};
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700543 PyObject *sep = NULL;
544 int bytes_per_sep = 1;
Zachary Wareb176d402015-01-20 13:59:46 -0600545
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700546 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf);
547 if (!args) {
548 goto exit;
549 }
550 if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) {
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200551 goto exit;
552 }
553 if (!PyBuffer_IsContiguous(&data, 'C')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200554 _PyArg_BadArgument("hexlify", "argument 'data'", "contiguous buffer", args[0]);
Zachary Wareb176d402015-01-20 13:59:46 -0600555 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300556 }
Gregory P. Smith0c2f9302019-05-29 11:46:58 -0700557 if (!noptargs) {
558 goto skip_optional_pos;
559 }
560 if (args[1]) {
561 sep = args[1];
562 if (!--noptargs) {
563 goto skip_optional_pos;
564 }
565 }
566 if (PyFloat_Check(args[2])) {
567 PyErr_SetString(PyExc_TypeError,
568 "integer argument expected, got float" );
569 goto exit;
570 }
571 bytes_per_sep = _PyLong_AsInt(args[2]);
572 if (bytes_per_sep == -1 && PyErr_Occurred()) {
573 goto exit;
574 }
575skip_optional_pos:
576 return_value = binascii_hexlify_impl(module, &data, sep, bytes_per_sep);
Zachary Wareb176d402015-01-20 13:59:46 -0600577
578exit:
579 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300580 if (data.obj) {
Zachary Wareb176d402015-01-20 13:59:46 -0600581 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300582 }
Zachary Wareb176d402015-01-20 13:59:46 -0600583
584 return return_value;
585}
586
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200587PyDoc_STRVAR(binascii_a2b_hex__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800588"a2b_hex($module, hexstr, /)\n"
589"--\n"
590"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200591"Binary data of hexadecimal representation.\n"
592"\n"
593"hexstr must contain an even number of hex digits (upper or lower case).\n"
594"This function is also available as \"unhexlify()\".");
595
596#define BINASCII_A2B_HEX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300597 {"a2b_hex", (PyCFunction)binascii_a2b_hex, METH_O, binascii_a2b_hex__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200598
599static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300600binascii_a2b_hex_impl(PyObject *module, Py_buffer *hexstr);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200601
602static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300603binascii_a2b_hex(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200604{
605 PyObject *return_value = NULL;
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500606 Py_buffer hexstr = {NULL, NULL};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200607
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200608 if (!ascii_buffer_converter(arg, &hexstr)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200609 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300610 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200611 return_value = binascii_a2b_hex_impl(module, &hexstr);
612
613exit:
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500614 /* Cleanup for hexstr */
615 if (hexstr.obj)
616 PyBuffer_Release(&hexstr);
617
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200618 return return_value;
619}
620
Zachary Wareb176d402015-01-20 13:59:46 -0600621PyDoc_STRVAR(binascii_unhexlify__doc__,
622"unhexlify($module, hexstr, /)\n"
623"--\n"
624"\n"
625"Binary data of hexadecimal representation.\n"
626"\n"
627"hexstr must contain an even number of hex digits (upper or lower case).");
628
629#define BINASCII_UNHEXLIFY_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300630 {"unhexlify", (PyCFunction)binascii_unhexlify, METH_O, binascii_unhexlify__doc__},
Zachary Wareb176d402015-01-20 13:59:46 -0600631
632static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300633binascii_unhexlify_impl(PyObject *module, Py_buffer *hexstr);
Zachary Wareb176d402015-01-20 13:59:46 -0600634
635static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300636binascii_unhexlify(PyObject *module, PyObject *arg)
Zachary Wareb176d402015-01-20 13:59:46 -0600637{
638 PyObject *return_value = NULL;
639 Py_buffer hexstr = {NULL, NULL};
640
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200641 if (!ascii_buffer_converter(arg, &hexstr)) {
Zachary Wareb176d402015-01-20 13:59:46 -0600642 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300643 }
Zachary Wareb176d402015-01-20 13:59:46 -0600644 return_value = binascii_unhexlify_impl(module, &hexstr);
645
646exit:
647 /* Cleanup for hexstr */
648 if (hexstr.obj)
649 PyBuffer_Release(&hexstr);
650
651 return return_value;
652}
653
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200654PyDoc_STRVAR(binascii_a2b_qp__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800655"a2b_qp($module, /, data, header=False)\n"
656"--\n"
657"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200658"Decode a string of qp-encoded data.");
659
660#define BINASCII_A2B_QP_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200661 {"a2b_qp", (PyCFunction)(void(*)(void))binascii_a2b_qp, METH_FASTCALL|METH_KEYWORDS, binascii_a2b_qp__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200662
663static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300664binascii_a2b_qp_impl(PyObject *module, Py_buffer *data, int header);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200665
666static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200667binascii_a2b_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200668{
669 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300670 static const char * const _keywords[] = {"data", "header", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200671 static _PyArg_Parser _parser = {NULL, _keywords, "a2b_qp", 0};
672 PyObject *argsbuf[2];
673 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500674 Py_buffer data = {NULL, NULL};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200675 int header = 0;
676
Serhiy Storchaka31913912019-03-14 10:32:22 +0200677 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
678 if (!args) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200679 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300680 }
Serhiy Storchaka31913912019-03-14 10:32:22 +0200681 if (!ascii_buffer_converter(args[0], &data)) {
682 goto exit;
683 }
684 if (!noptargs) {
685 goto skip_optional_pos;
686 }
687 if (PyFloat_Check(args[1])) {
688 PyErr_SetString(PyExc_TypeError,
689 "integer argument expected, got float" );
690 goto exit;
691 }
692 header = _PyLong_AsInt(args[1]);
693 if (header == -1 && PyErr_Occurred()) {
694 goto exit;
695 }
696skip_optional_pos:
Serhiy Storchaka12785612014-01-25 11:49:49 +0200697 return_value = binascii_a2b_qp_impl(module, &data, header);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200698
699exit:
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500700 /* Cleanup for data */
701 if (data.obj)
702 PyBuffer_Release(&data);
703
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200704 return return_value;
705}
706
707PyDoc_STRVAR(binascii_b2a_qp__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800708"b2a_qp($module, /, data, quotetabs=False, istext=True, header=False)\n"
709"--\n"
710"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200711"Encode a string using quoted-printable encoding.\n"
712"\n"
713"On encoding, when istext is set, newlines are not encoded, and white\n"
714"space at end of lines is. When istext is not set, \\r and \\n (CR/LF)\n"
715"are both encoded. When quotetabs is set, space and tabs are encoded.");
716
717#define BINASCII_B2A_QP_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200718 {"b2a_qp", (PyCFunction)(void(*)(void))binascii_b2a_qp, METH_FASTCALL|METH_KEYWORDS, binascii_b2a_qp__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200719
720static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300721binascii_b2a_qp_impl(PyObject *module, Py_buffer *data, int quotetabs,
Larry Hastings89964c42015-04-14 18:07:59 -0400722 int istext, int header);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200723
724static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200725binascii_b2a_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200726{
727 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300728 static const char * const _keywords[] = {"data", "quotetabs", "istext", "header", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200729 static _PyArg_Parser _parser = {NULL, _keywords, "b2a_qp", 0};
730 PyObject *argsbuf[4];
731 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200732 Py_buffer data = {NULL, NULL};
733 int quotetabs = 0;
734 int istext = 1;
735 int header = 0;
736
Serhiy Storchaka31913912019-03-14 10:32:22 +0200737 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 4, 0, argsbuf);
738 if (!args) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200739 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300740 }
Serhiy Storchaka31913912019-03-14 10:32:22 +0200741 if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) {
742 goto exit;
743 }
744 if (!PyBuffer_IsContiguous(&data, 'C')) {
Rémi Lapeyre4901fe22019-08-29 16:49:08 +0200745 _PyArg_BadArgument("b2a_qp", "argument 'data'", "contiguous buffer", args[0]);
Serhiy Storchaka31913912019-03-14 10:32:22 +0200746 goto exit;
747 }
748 if (!noptargs) {
749 goto skip_optional_pos;
750 }
751 if (args[1]) {
752 if (PyFloat_Check(args[1])) {
753 PyErr_SetString(PyExc_TypeError,
754 "integer argument expected, got float" );
755 goto exit;
756 }
757 quotetabs = _PyLong_AsInt(args[1]);
758 if (quotetabs == -1 && PyErr_Occurred()) {
759 goto exit;
760 }
761 if (!--noptargs) {
762 goto skip_optional_pos;
763 }
764 }
765 if (args[2]) {
766 if (PyFloat_Check(args[2])) {
767 PyErr_SetString(PyExc_TypeError,
768 "integer argument expected, got float" );
769 goto exit;
770 }
771 istext = _PyLong_AsInt(args[2]);
772 if (istext == -1 && PyErr_Occurred()) {
773 goto exit;
774 }
775 if (!--noptargs) {
776 goto skip_optional_pos;
777 }
778 }
779 if (PyFloat_Check(args[3])) {
780 PyErr_SetString(PyExc_TypeError,
781 "integer argument expected, got float" );
782 goto exit;
783 }
784 header = _PyLong_AsInt(args[3]);
785 if (header == -1 && PyErr_Occurred()) {
786 goto exit;
787 }
788skip_optional_pos:
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200789 return_value = binascii_b2a_qp_impl(module, &data, quotetabs, istext, header);
790
791exit:
792 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300793 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200794 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300795 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200796
797 return return_value;
798}
Victor Stinnerbeea26b2020-01-22 20:44:22 +0100799/*[clinic end generated code: output=a1e878d3963b615e input=a9049054013a1b77]*/