diff options
author | Walter Dörwald <walter@livinglogic.de> | 2007-05-23 21:02:42 (GMT) |
---|---|---|
committer | Walter Dörwald <walter@livinglogic.de> | 2007-05-23 21:02:42 (GMT) |
commit | 1be7e3f2ec91a811e76972c3c7a986795f7dadbd (patch) | |
tree | f3ff782d88a2d63383b02d75a31f2cca5fbdef44 | |
parent | 6252e10ed906eb419a75b310f7c0d6696a4eeb46 (diff) | |
download | cpython-1be7e3f2ec91a811e76972c3c7a986795f7dadbd.zip cpython-1be7e3f2ec91a811e76972c3c7a986795f7dadbd.tar.gz cpython-1be7e3f2ec91a811e76972c3c7a986795f7dadbd.tar.bz2 |
Add a format character %S to PyUnicode_FromFormat() that
embeds the result of PyObject_Unicode() into the resulting
unicode string.
-rw-r--r-- | Objects/unicodeobject.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index f2c5afa..2fec095 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -504,14 +504,15 @@ PyUnicode_FromFormatV(const char *format, va_list vargs) count = vargs; #endif #endif - /* step 1: count the number of %R format specifications - * (we call PyObject_Repr() for these objects once during step 3 - * and put the result in an array) */ + /* step 1: count the number of %S/%R format specifications + * (we call PyObject_Unicode()/PyObject_Repr() for these objects + * once during step 3 and put the result in an array) */ for (f = format; *f; f++) { - if (*f == '%' && *(f+1)=='R') + if (*f == '%' && (*(f+1)=='S' || *(f+1)=='R')) ++callcount; } - /* step 2: allocate memory for the results of PyObject_Repr() calls */ + /* step 2: allocate memory for the results of + * PyObject_Unicode()/PyObject_Repr() calls */ if (callcount) { callresults = PyMem_Malloc(sizeof(PyObject *)*callcount); if (!callresults) { @@ -558,6 +559,19 @@ PyUnicode_FromFormatV(const char *format, va_list vargs) n += PyUnicode_GET_SIZE(obj); break; } + case 'S': + { + PyObject *obj = va_arg(count, PyObject *); + PyObject *str; + assert(obj); + str = PyObject_Unicode(obj); + if (!str) + goto fail; + n += PyUnicode_GET_SIZE(str); + /* Remember the str and switch to the next slot */ + *callresult++ = str; + break; + } case 'R': { PyObject *obj = va_arg(count, PyObject *); @@ -683,6 +697,7 @@ PyUnicode_FromFormatV(const char *format, va_list vargs) *s++ = ucopy[upos++]; break; } + case 'S': case 'R': { /* unused, since we already have the result */ @@ -692,9 +707,9 @@ PyUnicode_FromFormatV(const char *format, va_list vargs) Py_ssize_t upos; for (upos = 0; upos<usize;) *s++ = ucopy[upos++]; - /* We're done with the repr() => forget it */ + /* We're done with the unicode()/repr() => forget it */ Py_DECREF(*callresult); - /* switch to next repr() result */ + /* switch to next unicode()/repr() result */ ++callresult; break; } |