aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiang Zhang <angwerzx@126.com>2017-05-03 11:16:21 +0800
committerGitHub <noreply@github.com>2017-05-03 11:16:21 +0800
commit13f1f423fac39f8f14a3ce919dd236975517d5c6 (patch)
tree674546ddbbbfaf930c0087eeb1621fab11e25d5f /Modules
parentFix tests: getsockname() can return None on OS X on unbound sockets (#1400) (diff)
downloadcpython-13f1f423fac39f8f14a3ce919dd236975517d5c6.tar.gz
cpython-13f1f423fac39f8f14a3ce919dd236975517d5c6.tar.bz2
cpython-13f1f423fac39f8f14a3ce919dd236975517d5c6.zip
bpo-30103: Allow Uuencode in Python using backtick as zero instead of space (#1326)
Diffstat (limited to 'Modules')
-rw-r--r--Modules/binascii.c16
-rw-r--r--Modules/clinic/binascii.c.h18
2 files changed, 23 insertions, 11 deletions
diff --git a/Modules/binascii.c b/Modules/binascii.c
index fbd23207986..1f9ff5a57b4 100644
--- a/Modules/binascii.c
+++ b/Modules/binascii.c
@@ -335,13 +335,15 @@ binascii.b2a_uu
data: Py_buffer
/
+ *
+ backtick: bool(accept={int}) = False
Uuencode line of data.
[clinic start generated code]*/
static PyObject *
-binascii_b2a_uu_impl(PyObject *module, Py_buffer *data)
-/*[clinic end generated code: output=0070670e52e4aa6b input=00fdf458ce8b465b]*/
+binascii_b2a_uu_impl(PyObject *module, Py_buffer *data, int backtick)
+/*[clinic end generated code: output=b1b99de62d9bbeb8 input=b26bc8d32b6ed2f6]*/
{
unsigned char *ascii_data;
const unsigned char *bin_data;
@@ -367,7 +369,10 @@ binascii_b2a_uu_impl(PyObject *module, Py_buffer *data)
return NULL;
/* Store the length */
- *ascii_data++ = ' ' + (bin_len & 077);
+ if (backtick && !bin_len)
+ *ascii_data++ = '`';
+ else
+ *ascii_data++ = ' ' + bin_len;
for( ; bin_len > 0 || leftbits != 0 ; bin_len--, bin_data++ ) {
/* Shift the data (or padding) into our buffer */
@@ -381,7 +386,10 @@ binascii_b2a_uu_impl(PyObject *module, Py_buffer *data)
while ( leftbits >= 6 ) {
this_ch = (leftchar >> (leftbits-6)) & 0x3f;
leftbits -= 6;
- *ascii_data++ = this_ch + ' ';
+ if (backtick && !this_ch)
+ *ascii_data++ = '`';
+ else
+ *ascii_data++ = this_ch + ' ';
}
}
*ascii_data++ = '\n'; /* Append a courtesy newline */
diff --git a/Modules/clinic/binascii.c.h b/Modules/clinic/binascii.c.h
index ca5d4c5e80e..130e249bf89 100644
--- a/Modules/clinic/binascii.c.h
+++ b/Modules/clinic/binascii.c.h
@@ -34,27 +34,31 @@ exit:
}
PyDoc_STRVAR(binascii_b2a_uu__doc__,
-"b2a_uu($module, data, /)\n"
+"b2a_uu($module, data, /, *, backtick=False)\n"
"--\n"
"\n"
"Uuencode line of data.");
#define BINASCII_B2A_UU_METHODDEF \
- {"b2a_uu", (PyCFunction)binascii_b2a_uu, METH_O, binascii_b2a_uu__doc__},
+ {"b2a_uu", (PyCFunction)binascii_b2a_uu, METH_FASTCALL, binascii_b2a_uu__doc__},
static PyObject *
-binascii_b2a_uu_impl(PyObject *module, Py_buffer *data);
+binascii_b2a_uu_impl(PyObject *module, Py_buffer *data, int backtick);
static PyObject *
-binascii_b2a_uu(PyObject *module, PyObject *arg)
+binascii_b2a_uu(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
+ static const char * const _keywords[] = {"", "backtick", NULL};
+ static _PyArg_Parser _parser = {"y*|$i:b2a_uu", _keywords, 0};
Py_buffer data = {NULL, NULL};
+ int backtick = 0;
- if (!PyArg_Parse(arg, "y*:b2a_uu", &data)) {
+ if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
+ &data, &backtick)) {
goto exit;
}
- return_value = binascii_b2a_uu_impl(module, &data);
+ return_value = binascii_b2a_uu_impl(module, &data, backtick);
exit:
/* Cleanup for data */
@@ -558,4 +562,4 @@ exit:
return return_value;
}
-/*[clinic end generated code: output=35821bce7e0e4714 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=9db57e86dbe7b2fa input=a9049054013a1b77]*/