summaryrefslogtreecommitdiffstats
path: root/Objects/stringobject.c
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2006-02-16 06:54:25 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2006-02-16 06:54:25 (GMT)
commit2c95cc6d72957296c46bb11362359675a47e2085 (patch)
tree9e6e78432b2aef86240297833b644d4d60d771a7 /Objects/stringobject.c
parent26efe402c2a5dba441dc2feae2f15fea6be452ba (diff)
downloadcpython-2c95cc6d72957296c46bb11362359675a47e2085.zip
cpython-2c95cc6d72957296c46bb11362359675a47e2085.tar.gz
cpython-2c95cc6d72957296c46bb11362359675a47e2085.tar.bz2
Support %zd in PyErr_Format and PyString_FromFormat.
Diffstat (limited to 'Objects/stringobject.c')
-rw-r--r--Objects/stringobject.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index a8e1cb6..8821dcec 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -181,6 +181,9 @@ PyString_FromFormatV(const char *format, va_list vargs)
added */
if (*f == 'l' && *(f+1) == 'd')
++f;
+ /* likewise for %zd */
+ if (*f == 'z' && *(f+1) == 'd')
+ ++f;
switch (*f) {
case 'c':
@@ -237,6 +240,7 @@ PyString_FromFormatV(const char *format, va_list vargs)
const char* p = f++;
Py_ssize_t i;
int longflag = 0;
+ int size_tflag = 0;
/* parse the width.precision part (we're only
interested in the precision value, if any) */
n = 0;
@@ -256,6 +260,11 @@ PyString_FromFormatV(const char *format, va_list vargs)
longflag = 1;
++f;
}
+ /* handle the size_t flag. */
+ if (*f == 'z' && *(f+1) == 'd') {
+ size_tflag = 1;
+ ++f;
+ }
switch (*f) {
case 'c':
@@ -264,6 +273,18 @@ PyString_FromFormatV(const char *format, va_list vargs)
case 'd':
if (longflag)
sprintf(s, "%ld", va_arg(vargs, long));
+ else if (size_tflag) {
+ /* Instead of checking whether the C
+ library supports %zd, handle the
+ common cases. */
+ #if SIZEOF_SIZE_T == SIZEOF_LONG
+ sprintf(s, "%ld", va_arg(vargs, long));
+ #elif defined(MS_WINDOWS)
+ sprintf(s, "%Id", va_arg(vargs, size_t));
+ #else
+ #error Cannot print size_t values
+ #endif
+ }
else
sprintf(s, "%d", va_arg(vargs, int));
s += strlen(s);