blob: 4043d89d97db3b02ca4dc6a043d8eb925c8695ce [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')) {
67 _PyArg_BadArgument("b2a_uu", 1, "contiguous buffer", args[0]);
68 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')) {
156 _PyArg_BadArgument("b2a_base64", 1, "contiguous buffer", args[0]);
157 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')) {
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200236 _PyArg_BadArgument("rlecode_hqx", 0, "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')) {
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200272 _PyArg_BadArgument("b2a_hqx", 0, "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')) {
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200308 _PyArg_BadArgument("rledecode_hqx", 0, "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
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300331static unsigned int
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;
340 unsigned int _return_value;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200341
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200342 if (!_PyArg_CheckPositional("crc_hqx", nargs, 2, 2)) {
343 goto exit;
344 }
345 if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) {
346 goto exit;
347 }
348 if (!PyBuffer_IsContiguous(&data, 'C')) {
349 _PyArg_BadArgument("crc_hqx", 1, "contiguous buffer", args[0]);
350 goto exit;
351 }
352 if (PyFloat_Check(args[1])) {
353 PyErr_SetString(PyExc_TypeError,
354 "integer argument expected, got float" );
355 goto exit;
356 }
357 crc = (unsigned int)PyLong_AsUnsignedLongMask(args[1]);
358 if (crc == (unsigned int)-1 && PyErr_Occurred()) {
Victor Stinner259f0e42017-01-17 01:35:17 +0100359 goto exit;
360 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200361 _return_value = binascii_crc_hqx_impl(module, &data, crc);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300362 if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200363 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300364 }
Serhiy Storchaka2ef7c472015-04-20 09:26:49 +0300365 return_value = PyLong_FromUnsignedLong((unsigned long)_return_value);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200366
367exit:
368 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300369 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200370 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300371 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200372
373 return return_value;
374}
375
376PyDoc_STRVAR(binascii_crc32__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800377"crc32($module, data, crc=0, /)\n"
378"--\n"
379"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200380"Compute CRC-32 incrementally.");
381
382#define BINASCII_CRC32_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200383 {"crc32", (PyCFunction)(void(*)(void))binascii_crc32, METH_FASTCALL, binascii_crc32__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200384
385static unsigned int
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300386binascii_crc32_impl(PyObject *module, Py_buffer *data, unsigned int crc);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200387
388static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200389binascii_crc32(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200390{
391 PyObject *return_value = NULL;
392 Py_buffer data = {NULL, NULL};
393 unsigned int crc = 0;
394 unsigned int _return_value;
395
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200396 if (!_PyArg_CheckPositional("crc32", nargs, 1, 2)) {
Victor Stinner259f0e42017-01-17 01:35:17 +0100397 goto exit;
398 }
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200399 if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) {
400 goto exit;
401 }
402 if (!PyBuffer_IsContiguous(&data, 'C')) {
403 _PyArg_BadArgument("crc32", 1, "contiguous buffer", args[0]);
404 goto exit;
405 }
406 if (nargs < 2) {
407 goto skip_optional;
408 }
409 if (PyFloat_Check(args[1])) {
410 PyErr_SetString(PyExc_TypeError,
411 "integer argument expected, got float" );
412 goto exit;
413 }
414 crc = (unsigned int)PyLong_AsUnsignedLongMask(args[1]);
415 if (crc == (unsigned int)-1 && PyErr_Occurred()) {
416 goto exit;
417 }
418skip_optional:
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200419 _return_value = binascii_crc32_impl(module, &data, crc);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300420 if ((_return_value == (unsigned int)-1) && PyErr_Occurred()) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200421 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300422 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200423 return_value = PyLong_FromUnsignedLong((unsigned long)_return_value);
424
425exit:
426 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300427 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200428 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300429 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200430
431 return return_value;
432}
433
434PyDoc_STRVAR(binascii_b2a_hex__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800435"b2a_hex($module, data, /)\n"
436"--\n"
437"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200438"Hexadecimal representation of binary data.\n"
439"\n"
440"The return value is a bytes object. This function is also\n"
441"available as \"hexlify()\".");
442
443#define BINASCII_B2A_HEX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300444 {"b2a_hex", (PyCFunction)binascii_b2a_hex, METH_O, binascii_b2a_hex__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200445
446static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300447binascii_b2a_hex_impl(PyObject *module, Py_buffer *data);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200448
449static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300450binascii_b2a_hex(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200451{
452 PyObject *return_value = NULL;
453 Py_buffer data = {NULL, NULL};
454
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200455 if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) {
456 goto exit;
457 }
458 if (!PyBuffer_IsContiguous(&data, 'C')) {
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200459 _PyArg_BadArgument("b2a_hex", 0, "contiguous buffer", arg);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200460 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300461 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200462 return_value = binascii_b2a_hex_impl(module, &data);
463
464exit:
465 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300466 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200467 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300468 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200469
470 return return_value;
471}
472
Zachary Wareb176d402015-01-20 13:59:46 -0600473PyDoc_STRVAR(binascii_hexlify__doc__,
474"hexlify($module, data, /)\n"
475"--\n"
476"\n"
477"Hexadecimal representation of binary data.\n"
478"\n"
479"The return value is a bytes object.");
480
481#define BINASCII_HEXLIFY_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300482 {"hexlify", (PyCFunction)binascii_hexlify, METH_O, binascii_hexlify__doc__},
Zachary Wareb176d402015-01-20 13:59:46 -0600483
484static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300485binascii_hexlify_impl(PyObject *module, Py_buffer *data);
Zachary Wareb176d402015-01-20 13:59:46 -0600486
487static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300488binascii_hexlify(PyObject *module, PyObject *arg)
Zachary Wareb176d402015-01-20 13:59:46 -0600489{
490 PyObject *return_value = NULL;
491 Py_buffer data = {NULL, NULL};
492
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200493 if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) {
494 goto exit;
495 }
496 if (!PyBuffer_IsContiguous(&data, 'C')) {
Serhiy Storchaka4fa95912019-01-11 16:01:14 +0200497 _PyArg_BadArgument("hexlify", 0, "contiguous buffer", arg);
Zachary Wareb176d402015-01-20 13:59:46 -0600498 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300499 }
Zachary Wareb176d402015-01-20 13:59:46 -0600500 return_value = binascii_hexlify_impl(module, &data);
501
502exit:
503 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300504 if (data.obj) {
Zachary Wareb176d402015-01-20 13:59:46 -0600505 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300506 }
Zachary Wareb176d402015-01-20 13:59:46 -0600507
508 return return_value;
509}
510
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200511PyDoc_STRVAR(binascii_a2b_hex__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800512"a2b_hex($module, hexstr, /)\n"
513"--\n"
514"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200515"Binary data of hexadecimal representation.\n"
516"\n"
517"hexstr must contain an even number of hex digits (upper or lower case).\n"
518"This function is also available as \"unhexlify()\".");
519
520#define BINASCII_A2B_HEX_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300521 {"a2b_hex", (PyCFunction)binascii_a2b_hex, METH_O, binascii_a2b_hex__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200522
523static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300524binascii_a2b_hex_impl(PyObject *module, Py_buffer *hexstr);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200525
526static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300527binascii_a2b_hex(PyObject *module, PyObject *arg)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200528{
529 PyObject *return_value = NULL;
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500530 Py_buffer hexstr = {NULL, NULL};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200531
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200532 if (!ascii_buffer_converter(arg, &hexstr)) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200533 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300534 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200535 return_value = binascii_a2b_hex_impl(module, &hexstr);
536
537exit:
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500538 /* Cleanup for hexstr */
539 if (hexstr.obj)
540 PyBuffer_Release(&hexstr);
541
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200542 return return_value;
543}
544
Zachary Wareb176d402015-01-20 13:59:46 -0600545PyDoc_STRVAR(binascii_unhexlify__doc__,
546"unhexlify($module, hexstr, /)\n"
547"--\n"
548"\n"
549"Binary data of hexadecimal representation.\n"
550"\n"
551"hexstr must contain an even number of hex digits (upper or lower case).");
552
553#define BINASCII_UNHEXLIFY_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300554 {"unhexlify", (PyCFunction)binascii_unhexlify, METH_O, binascii_unhexlify__doc__},
Zachary Wareb176d402015-01-20 13:59:46 -0600555
556static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300557binascii_unhexlify_impl(PyObject *module, Py_buffer *hexstr);
Zachary Wareb176d402015-01-20 13:59:46 -0600558
559static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300560binascii_unhexlify(PyObject *module, PyObject *arg)
Zachary Wareb176d402015-01-20 13:59:46 -0600561{
562 PyObject *return_value = NULL;
563 Py_buffer hexstr = {NULL, NULL};
564
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200565 if (!ascii_buffer_converter(arg, &hexstr)) {
Zachary Wareb176d402015-01-20 13:59:46 -0600566 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300567 }
Zachary Wareb176d402015-01-20 13:59:46 -0600568 return_value = binascii_unhexlify_impl(module, &hexstr);
569
570exit:
571 /* Cleanup for hexstr */
572 if (hexstr.obj)
573 PyBuffer_Release(&hexstr);
574
575 return return_value;
576}
577
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200578PyDoc_STRVAR(binascii_a2b_qp__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800579"a2b_qp($module, /, data, header=False)\n"
580"--\n"
581"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200582"Decode a string of qp-encoded data.");
583
584#define BINASCII_A2B_QP_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200585 {"a2b_qp", (PyCFunction)(void(*)(void))binascii_a2b_qp, METH_FASTCALL|METH_KEYWORDS, binascii_a2b_qp__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200586
587static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300588binascii_a2b_qp_impl(PyObject *module, Py_buffer *data, int header);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200589
590static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200591binascii_a2b_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200592{
593 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300594 static const char * const _keywords[] = {"data", "header", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200595 static _PyArg_Parser _parser = {NULL, _keywords, "a2b_qp", 0};
596 PyObject *argsbuf[2];
597 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500598 Py_buffer data = {NULL, NULL};
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200599 int header = 0;
600
Serhiy Storchaka31913912019-03-14 10:32:22 +0200601 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
602 if (!args) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200603 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300604 }
Serhiy Storchaka31913912019-03-14 10:32:22 +0200605 if (!ascii_buffer_converter(args[0], &data)) {
606 goto exit;
607 }
608 if (!noptargs) {
609 goto skip_optional_pos;
610 }
611 if (PyFloat_Check(args[1])) {
612 PyErr_SetString(PyExc_TypeError,
613 "integer argument expected, got float" );
614 goto exit;
615 }
616 header = _PyLong_AsInt(args[1]);
617 if (header == -1 && PyErr_Occurred()) {
618 goto exit;
619 }
620skip_optional_pos:
Serhiy Storchaka12785612014-01-25 11:49:49 +0200621 return_value = binascii_a2b_qp_impl(module, &data, header);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200622
623exit:
Benjamin Petersonb62deac2014-01-26 10:41:58 -0500624 /* Cleanup for data */
625 if (data.obj)
626 PyBuffer_Release(&data);
627
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200628 return return_value;
629}
630
631PyDoc_STRVAR(binascii_b2a_qp__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800632"b2a_qp($module, /, data, quotetabs=False, istext=True, header=False)\n"
633"--\n"
634"\n"
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200635"Encode a string using quoted-printable encoding.\n"
636"\n"
637"On encoding, when istext is set, newlines are not encoded, and white\n"
638"space at end of lines is. When istext is not set, \\r and \\n (CR/LF)\n"
639"are both encoded. When quotetabs is set, space and tabs are encoded.");
640
641#define BINASCII_B2A_QP_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200642 {"b2a_qp", (PyCFunction)(void(*)(void))binascii_b2a_qp, METH_FASTCALL|METH_KEYWORDS, binascii_b2a_qp__doc__},
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200643
644static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300645binascii_b2a_qp_impl(PyObject *module, Py_buffer *data, int quotetabs,
Larry Hastings89964c42015-04-14 18:07:59 -0400646 int istext, int header);
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200647
648static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200649binascii_b2a_qp(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200650{
651 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300652 static const char * const _keywords[] = {"data", "quotetabs", "istext", "header", NULL};
Serhiy Storchaka31913912019-03-14 10:32:22 +0200653 static _PyArg_Parser _parser = {NULL, _keywords, "b2a_qp", 0};
654 PyObject *argsbuf[4];
655 Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200656 Py_buffer data = {NULL, NULL};
657 int quotetabs = 0;
658 int istext = 1;
659 int header = 0;
660
Serhiy Storchaka31913912019-03-14 10:32:22 +0200661 args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 4, 0, argsbuf);
662 if (!args) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200663 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300664 }
Serhiy Storchaka31913912019-03-14 10:32:22 +0200665 if (PyObject_GetBuffer(args[0], &data, PyBUF_SIMPLE) != 0) {
666 goto exit;
667 }
668 if (!PyBuffer_IsContiguous(&data, 'C')) {
669 _PyArg_BadArgument("b2a_qp", 1, "contiguous buffer", args[0]);
670 goto exit;
671 }
672 if (!noptargs) {
673 goto skip_optional_pos;
674 }
675 if (args[1]) {
676 if (PyFloat_Check(args[1])) {
677 PyErr_SetString(PyExc_TypeError,
678 "integer argument expected, got float" );
679 goto exit;
680 }
681 quotetabs = _PyLong_AsInt(args[1]);
682 if (quotetabs == -1 && PyErr_Occurred()) {
683 goto exit;
684 }
685 if (!--noptargs) {
686 goto skip_optional_pos;
687 }
688 }
689 if (args[2]) {
690 if (PyFloat_Check(args[2])) {
691 PyErr_SetString(PyExc_TypeError,
692 "integer argument expected, got float" );
693 goto exit;
694 }
695 istext = _PyLong_AsInt(args[2]);
696 if (istext == -1 && PyErr_Occurred()) {
697 goto exit;
698 }
699 if (!--noptargs) {
700 goto skip_optional_pos;
701 }
702 }
703 if (PyFloat_Check(args[3])) {
704 PyErr_SetString(PyExc_TypeError,
705 "integer argument expected, got float" );
706 goto exit;
707 }
708 header = _PyLong_AsInt(args[3]);
709 if (header == -1 && PyErr_Occurred()) {
710 goto exit;
711 }
712skip_optional_pos:
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200713 return_value = binascii_b2a_qp_impl(module, &data, quotetabs, istext, header);
714
715exit:
716 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300717 if (data.obj) {
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200718 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300719 }
Serhiy Storchaka3ffd9132014-01-25 11:21:23 +0200720
721 return return_value;
722}
Serhiy Storchaka31913912019-03-14 10:32:22 +0200723/*[clinic end generated code: output=a4a38e162605aca2 input=a9049054013a1b77]*/