summaryrefslogtreecommitdiffstats
path: root/Objects/stringobject.c
diff options
context:
space:
mode:
authorMarc-André Lemburg <mal@egenix.com>2000-10-07 08:54:09 (GMT)
committerMarc-André Lemburg <mal@egenix.com>2000-10-07 08:54:09 (GMT)
commit53f3d4ac74455e98e372af9dc7d29afd7b420644 (patch)
treec7fc032e0c7b255b05b129aa7ebeb2244cf638a3 /Objects/stringobject.c
parentb96d80201cd6b3296cdbc04932843df1c3db6c78 (diff)
downloadcpython-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.c28
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);