summaryrefslogtreecommitdiffstats
path: root/Objects/longobject.c
diff options
context:
space:
mode:
authorEric Smith <eric@trueblade.com>2008-02-17 19:46:49 (GMT)
committerEric Smith <eric@trueblade.com>2008-02-17 19:46:49 (GMT)
commita9f7d6248032c9572b4d2024a1be8bd2823af09f (patch)
tree5465a1051312055678248db0076d314924ee4ebc /Objects/longobject.c
parente139688d34cc12b23d3a310f10d4f440f75f7d08 (diff)
downloadcpython-a9f7d6248032c9572b4d2024a1be8bd2823af09f.zip
cpython-a9f7d6248032c9572b4d2024a1be8bd2823af09f.tar.gz
cpython-a9f7d6248032c9572b4d2024a1be8bd2823af09f.tar.bz2
Backport of PEP 3101, Advanced String Formatting, from py3k.
Highlights: - Adding PyObject_Format. - Adding string.Format class. - Adding __format__ for str, unicode, int, long, float, datetime. - Adding builtin format. - Adding ''.format and u''.format. - str/unicode fixups for formatters. The files in Objects/stringlib that implement PEP 3101 (stringdefs.h, unicodedefs.h, formatter.h, string_format.h) are identical in trunk and py3k. Any changes from here on should be made to trunk, and changes will propogate to py3k).
Diffstat (limited to 'Objects/longobject.c')
-rw-r--r--Objects/longobject.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/Objects/longobject.c b/Objects/longobject.c
index 3ee2992..46ed713 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -6,6 +6,7 @@
#include "Python.h"
#include "longintrepr.h"
+#include "formatter_string.h"
#include <ctype.h>
@@ -3380,12 +3381,47 @@ long_getN(PyLongObject *v, void *context) {
return PyLong_FromLong((intptr_t)context);
}
+static PyObject *
+long__format__(PyObject *self, PyObject *args)
+{
+ PyObject *format_spec;
+
+ if (!PyArg_ParseTuple(args, "O:__format__", &format_spec))
+ return NULL;
+ if (PyString_Check(format_spec))
+ return string_long__format__(self, args);
+ if (PyUnicode_Check(format_spec)) {
+ /* Convert format_spec to a str */
+ PyObject *result = NULL;
+ PyObject *newargs = NULL;
+ PyObject *string_format_spec = NULL;
+
+ string_format_spec = PyObject_Str(format_spec);
+ if (string_format_spec == NULL)
+ goto done;
+
+ newargs = Py_BuildValue("(O)", string_format_spec);
+ if (newargs == NULL)
+ goto done;
+
+ result = string_long__format__(self, newargs);
+
+ done:
+ Py_XDECREF(string_format_spec);
+ Py_XDECREF(newargs);
+ return result;
+ }
+ PyErr_SetString(PyExc_TypeError, "__format__ requires str or unicode");
+ return NULL;
+}
+
static PyMethodDef long_methods[] = {
{"conjugate", (PyCFunction)long_long, METH_NOARGS,
"Returns self, the complex conjugate of any long."},
{"__trunc__", (PyCFunction)long_long, METH_NOARGS,
"Truncating an Integral returns itself."},
{"__getnewargs__", (PyCFunction)long_getnewargs, METH_NOARGS},
+ {"__format__", (PyCFunction)long__format__, METH_VARARGS},
{NULL, NULL} /* sentinel */
};