bpo-20180: complete AC conversion of Objects/stringlib/transmogrify.h (GH-8039)

* converted bytes methods: expandtabs, ljust, rjust, center, zfill
* updated char_convertor to properly set the C default value
This commit is contained in:
Tal Einat 2018-07-06 13:17:38 +03:00 committed by GitHub
parent 7943c5e8b5
commit c929df3b96
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 265 additions and 78 deletions

View file

@ -0,0 +1,158 @@
/*[clinic input]
preserve
[clinic start generated code]*/
PyDoc_STRVAR(stringlib_expandtabs__doc__,
"expandtabs($self, /, tabsize=8)\n"
"--\n"
"\n"
"Return a copy where all tab characters are expanded using spaces.\n"
"\n"
"If tabsize is not given, a tab size of 8 characters is assumed.");
#define STRINGLIB_EXPANDTABS_METHODDEF \
{"expandtabs", (PyCFunction)stringlib_expandtabs, METH_FASTCALL|METH_KEYWORDS, stringlib_expandtabs__doc__},
static PyObject *
stringlib_expandtabs_impl(PyObject *self, int tabsize);
static PyObject *
stringlib_expandtabs(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
static const char * const _keywords[] = {"tabsize", NULL};
static _PyArg_Parser _parser = {"|i:expandtabs", _keywords, 0};
int tabsize = 8;
if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
&tabsize)) {
goto exit;
}
return_value = stringlib_expandtabs_impl(self, tabsize);
exit:
return return_value;
}
PyDoc_STRVAR(stringlib_ljust__doc__,
"ljust($self, width, fillchar=b\' \', /)\n"
"--\n"
"\n"
"Return a left-justified string of length width.\n"
"\n"
"Padding is done using the specified fill character.");
#define STRINGLIB_LJUST_METHODDEF \
{"ljust", (PyCFunction)stringlib_ljust, METH_FASTCALL, stringlib_ljust__doc__},
static PyObject *
stringlib_ljust_impl(PyObject *self, Py_ssize_t width, char fillchar);
static PyObject *
stringlib_ljust(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
Py_ssize_t width;
char fillchar = ' ';
if (!_PyArg_ParseStack(args, nargs, "n|c:ljust",
&width, &fillchar)) {
goto exit;
}
return_value = stringlib_ljust_impl(self, width, fillchar);
exit:
return return_value;
}
PyDoc_STRVAR(stringlib_rjust__doc__,
"rjust($self, width, fillchar=b\' \', /)\n"
"--\n"
"\n"
"Return a right-justified string of length width.\n"
"\n"
"Padding is done using the specified fill character.");
#define STRINGLIB_RJUST_METHODDEF \
{"rjust", (PyCFunction)stringlib_rjust, METH_FASTCALL, stringlib_rjust__doc__},
static PyObject *
stringlib_rjust_impl(PyObject *self, Py_ssize_t width, char fillchar);
static PyObject *
stringlib_rjust(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
Py_ssize_t width;
char fillchar = ' ';
if (!_PyArg_ParseStack(args, nargs, "n|c:rjust",
&width, &fillchar)) {
goto exit;
}
return_value = stringlib_rjust_impl(self, width, fillchar);
exit:
return return_value;
}
PyDoc_STRVAR(stringlib_center__doc__,
"center($self, width, fillchar=b\' \', /)\n"
"--\n"
"\n"
"Return a centered string of length width.\n"
"\n"
"Padding is done using the specified fill character.");
#define STRINGLIB_CENTER_METHODDEF \
{"center", (PyCFunction)stringlib_center, METH_FASTCALL, stringlib_center__doc__},
static PyObject *
stringlib_center_impl(PyObject *self, Py_ssize_t width, char fillchar);
static PyObject *
stringlib_center(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
{
PyObject *return_value = NULL;
Py_ssize_t width;
char fillchar = ' ';
if (!_PyArg_ParseStack(args, nargs, "n|c:center",
&width, &fillchar)) {
goto exit;
}
return_value = stringlib_center_impl(self, width, fillchar);
exit:
return return_value;
}
PyDoc_STRVAR(stringlib_zfill__doc__,
"zfill($self, width, /)\n"
"--\n"
"\n"
"Pad a numeric string with zeros on the left, to fill a field of the given width.\n"
"\n"
"The original string is never truncated.");
#define STRINGLIB_ZFILL_METHODDEF \
{"zfill", (PyCFunction)stringlib_zfill, METH_O, stringlib_zfill__doc__},
static PyObject *
stringlib_zfill_impl(PyObject *self, Py_ssize_t width);
static PyObject *
stringlib_zfill(PyObject *self, PyObject *arg)
{
PyObject *return_value = NULL;
Py_ssize_t width;
if (!PyArg_Parse(arg, "n:zfill", &width)) {
goto exit;
}
return_value = stringlib_zfill_impl(self, width);
exit:
return return_value;
}
/*[clinic end generated code: output=336620159a1fc70d input=a9049054013a1b77]*/

View file

@ -5,6 +5,13 @@
/* the more complicated methods. parts of these should be pulled out into the
shared code in bytes_methods.c to cut down on duplicate code bloat. */
/*[clinic input]
class B "PyObject *" "&PyType_Type"
[clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=2935558188d97c76]*/
#include "clinic/transmogrify.h.h"
static inline PyObject *
return_self(PyObject *self)
{
@ -17,19 +24,24 @@ return_self(PyObject *self)
return STRINGLIB_NEW(STRINGLIB_STR(self), STRINGLIB_LEN(self));
}
static PyObject*
stringlib_expandtabs(PyObject *self, PyObject *args, PyObject *kwds)
/*[clinic input]
B.expandtabs as stringlib_expandtabs
tabsize: int = 8
Return a copy where all tab characters are expanded using spaces.
If tabsize is not given, a tab size of 8 characters is assumed.
[clinic start generated code]*/
static PyObject *
stringlib_expandtabs_impl(PyObject *self, int tabsize)
/*[clinic end generated code: output=069cb7fae72e4c2b input=3c6d3b12aa3ccbea]*/
{
const char *e, *p;
char *q;
Py_ssize_t i, j;
PyObject *u;
static char *kwlist[] = {"tabsize", 0};
int tabsize = 8;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:expandtabs",
kwlist, &tabsize))
return NULL;
/* First pass: determine size of output string */
i = j = 0;
@ -119,15 +131,22 @@ pad(PyObject *self, Py_ssize_t left, Py_ssize_t right, char fill)
return u;
}
/*[clinic input]
B.ljust as stringlib_ljust
width: Py_ssize_t
fillchar: char = b' '
/
Return a left-justified string of length width.
Padding is done using the specified fill character.
[clinic start generated code]*/
static PyObject *
stringlib_ljust(PyObject *self, PyObject *args)
stringlib_ljust_impl(PyObject *self, Py_ssize_t width, char fillchar)
/*[clinic end generated code: output=c79ca173c5ff8337 input=eff2d014bc7d80df]*/
{
Py_ssize_t width;
char fillchar = ' ';
if (!PyArg_ParseTuple(args, "n|c:ljust", &width, &fillchar))
return NULL;
if (STRINGLIB_LEN(self) >= width) {
return return_self(self);
}
@ -136,15 +155,22 @@ stringlib_ljust(PyObject *self, PyObject *args)
}
/*[clinic input]
B.rjust as stringlib_rjust
width: Py_ssize_t
fillchar: char = b' '
/
Return a right-justified string of length width.
Padding is done using the specified fill character.
[clinic start generated code]*/
static PyObject *
stringlib_rjust(PyObject *self, PyObject *args)
stringlib_rjust_impl(PyObject *self, Py_ssize_t width, char fillchar)
/*[clinic end generated code: output=7df5d728a5439570 input=218b0bd31308955d]*/
{
Py_ssize_t width;
char fillchar = ' ';
if (!PyArg_ParseTuple(args, "n|c:rjust", &width, &fillchar))
return NULL;
if (STRINGLIB_LEN(self) >= width) {
return return_self(self);
}
@ -153,15 +179,23 @@ stringlib_rjust(PyObject *self, PyObject *args)
}
/*[clinic input]
B.center as stringlib_center
width: Py_ssize_t
fillchar: char = b' '
/
Return a centered string of length width.
Padding is done using the specified fill character.
[clinic start generated code]*/
static PyObject *
stringlib_center(PyObject *self, PyObject *args)
stringlib_center_impl(PyObject *self, Py_ssize_t width, char fillchar)
/*[clinic end generated code: output=d8da2e055288b4c2 input=3776fd278765d89b]*/
{
Py_ssize_t marg, left;
Py_ssize_t width;
char fillchar = ' ';
if (!PyArg_ParseTuple(args, "n|c:center", &width, &fillchar))
return NULL;
if (STRINGLIB_LEN(self) >= width) {
return return_self(self);
@ -173,16 +207,24 @@ stringlib_center(PyObject *self, PyObject *args)
return pad(self, left, marg - left, fillchar);
}
/*[clinic input]
B.zfill as stringlib_zfill
width: Py_ssize_t
/
Pad a numeric string with zeros on the left, to fill a field of the given width.
The original string is never truncated.
[clinic start generated code]*/
static PyObject *
stringlib_zfill(PyObject *self, PyObject *args)
stringlib_zfill_impl(PyObject *self, Py_ssize_t width)
/*[clinic end generated code: output=0b3c684a7f1b2319 input=2da6d7b8e9bcb19a]*/
{
Py_ssize_t fill;
PyObject *s;
char *p;
Py_ssize_t width;
if (!PyArg_ParseTuple(args, "n:zfill", &width))
return NULL;
if (STRINGLIB_LEN(self) >= width) {
return return_self(self);