diff options
author | Marc-André Lemburg <mal@egenix.com> | 2000-10-07 08:54:09 (GMT) |
---|---|---|
committer | Marc-André Lemburg <mal@egenix.com> | 2000-10-07 08:54:09 (GMT) |
commit | 53f3d4ac74455e98e372af9dc7d29afd7b420644 (patch) | |
tree | c7fc032e0c7b255b05b129aa7ebeb2244cf638a3 /Objects/stringobject.c | |
parent | b96d80201cd6b3296cdbc04932843df1c3db6c78 (diff) | |
download | cpython-53f3d4ac74455e98e372af9dc7d29afd7b420644.zip cpython-53f3d4ac74455e98e372af9dc7d29afd7b420644.tar.gz cpython-53f3d4ac74455e98e372af9dc7d29afd7b420644.tar.bz2 |
[ Bug #116174 ] using %% in cstrings sometimes fails with unicode paramsFix for the bug reported in Bug #116174: "%% %s" % u"abc" failed due
to the way string formatting delegated work to the Unicode formatting
function.
Diffstat (limited to 'Objects/stringobject.c')
-rw-r--r-- | Objects/stringobject.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c index ec7eb90..dbade8c 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -2666,7 +2666,7 @@ PyString_Format(PyObject *format, PyObject *args) char *fmt, *res; int fmtcnt, rescnt, reslen, arglen, argidx; int args_owned = 0; - PyObject *result, *orig_args; + PyObject *result, *orig_args, *v, *w; PyObject *dict = NULL; if (format == NULL || !PyString_Check(format) || args == NULL) { PyErr_BadInternalCall(); @@ -3055,22 +3055,28 @@ PyString_Format(PyObject *format, PyObject *args) Py_INCREF(orig_args); args = orig_args; } - /* Paste rest of format string to what we have of the result - string; we reuse result for this */ + args_owned = 1; + /* Take what we have of the result and let the Unicode formatting + function format the rest of the input. */ rescnt = res - PyString_AS_STRING(result); + if (_PyString_Resize(&result, rescnt)) + goto error; fmtcnt = PyString_GET_SIZE(format) - \ (fmt - PyString_AS_STRING(format)); - if (_PyString_Resize(&result, rescnt + fmtcnt)) { - Py_DECREF(args); + format = PyUnicode_Decode(fmt, fmtcnt, NULL, NULL); + if (format == NULL) goto error; - } - memcpy(PyString_AS_STRING(result) + rescnt, fmt, fmtcnt); - format = result; - /* Let Unicode do its magic */ - result = PyUnicode_Format(format, args); + v = PyUnicode_Format(format, args); Py_DECREF(format); + if (v == NULL) + goto error; + /* Paste what we have (result) to what the Unicode formatting + function returned (v) and return the result (or error) */ + w = PyUnicode_Concat(result, v); + Py_DECREF(result); + Py_DECREF(v); Py_DECREF(args); - return result; + return w; error: Py_DECREF(result); |