diff options
author | 2017-05-03 11:16:21 +0800 | |
---|---|---|
committer | 2017-05-03 11:16:21 +0800 | |
commit | 13f1f423fac39f8f14a3ce919dd236975517d5c6 (patch) | |
tree | 674546ddbbbfaf930c0087eeb1621fab11e25d5f /Modules | |
parent | Fix tests: getsockname() can return None on OS X on unbound sockets (#1400) (diff) | |
download | cpython-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.c | 16 | ||||
-rw-r--r-- | Modules/clinic/binascii.c.h | 18 |
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]*/ |