diff options
Diffstat (limited to 'Python/bltinmodule.c')
-rw-r--r-- | Python/bltinmodule.c | 80 |
1 files changed, 42 insertions, 38 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 66c5fba..bfe21ad 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1952,24 +1952,31 @@ builtin_pow_impl(PyObject *module, PyObject *base, PyObject *exp, return PyNumber_Power(base, exp, mod); } +/*[clinic input] +print as builtin_print + + *args: object + sep: object(c_default="Py_None") = ' ' + string inserted between values, default a space. + end: object(c_default="Py_None") = '\n' + string appended after the last value, default a newline. + file: object = None + a file-like object (stream); defaults to the current sys.stdout. + flush: bool = False + whether to forcibly flush the stream. + +Prints the values to a stream, or to sys.stdout by default. + +[clinic start generated code]*/ -/* AC: cannot convert yet, waiting for *args support */ static PyObject * -builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) +builtin_print_impl(PyObject *module, PyObject *args, PyObject *sep, + PyObject *end, PyObject *file, int flush) +/*[clinic end generated code: output=3cfc0940f5bc237b input=c143c575d24fe665]*/ { - static const char * const _keywords[] = {"sep", "end", "file", "flush", 0}; - static struct _PyArg_Parser _parser = {"|OOOp:print", _keywords, 0}; - PyObject *sep = NULL, *end = NULL, *file = NULL; - int flush = 0; int i, err; - if (kwnames != NULL && - !_PyArg_ParseStackAndKeywords(args + nargs, 0, kwnames, &_parser, - &sep, &end, &file, &flush)) { - return NULL; - } - - if (file == NULL || file == Py_None) { + if (file == Py_None) { file = _PySys_GetObjectId(&PyId_stdout); if (file == NULL) { PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); @@ -1977,8 +1984,9 @@ builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject } /* sys.stdout may be None when FILE* stdout isn't connected */ - if (file == Py_None) + if (file == Py_None) { Py_RETURN_NONE; + } } if (sep == Py_None) { @@ -2000,48 +2008,45 @@ builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject return NULL; } - for (i = 0; i < nargs; i++) { + for (i = 0; i < PyTuple_GET_SIZE(args); i++) { if (i > 0) { - if (sep == NULL) + if (sep == NULL) { err = PyFile_WriteString(" ", file); - else - err = PyFile_WriteObject(sep, file, - Py_PRINT_RAW); - if (err) + } + else { + err = PyFile_WriteObject(sep, file, Py_PRINT_RAW); + } + if (err) { return NULL; + } } - err = PyFile_WriteObject(args[i], file, Py_PRINT_RAW); - if (err) + err = PyFile_WriteObject(PyTuple_GET_ITEM(args, i), file, Py_PRINT_RAW); + if (err) { return NULL; + } } - if (end == NULL) + if (end == NULL) { err = PyFile_WriteString("\n", file); - else + } + else { err = PyFile_WriteObject(end, file, Py_PRINT_RAW); - if (err) + } + if (err) { return NULL; + } if (flush) { PyObject *tmp = _PyObject_CallMethodIdNoArgs(file, &PyId_flush); - if (tmp == NULL) + if (tmp == NULL) { return NULL; + } Py_DECREF(tmp); } Py_RETURN_NONE; } -PyDoc_STRVAR(print_doc, -"print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n\ -\n\ -Prints the values to a stream, or to sys.stdout by default.\n\ -Optional keyword arguments:\n\ -file: a file-like object (stream); defaults to the current sys.stdout.\n\ -sep: string inserted between values, default a space.\n\ -end: string appended after the last value, default a newline.\n\ -flush: whether to forcibly flush the stream."); - /*[clinic input] input as builtin_input @@ -2644,7 +2649,6 @@ builtin_issubclass_impl(PyObject *module, PyObject *cls, return PyBool_FromLong(retval); } - typedef struct { PyObject_HEAD Py_ssize_t tuplesize; @@ -2955,7 +2959,7 @@ static PyMethodDef builtin_methods[] = { BUILTIN_OCT_METHODDEF BUILTIN_ORD_METHODDEF BUILTIN_POW_METHODDEF - {"print", (PyCFunction)(void(*)(void))builtin_print, METH_FASTCALL | METH_KEYWORDS, print_doc}, + BUILTIN_PRINT_METHODDEF BUILTIN_REPR_METHODDEF BUILTIN_ROUND_METHODDEF BUILTIN_SETATTR_METHODDEF |