summaryrefslogtreecommitdiff
path: root/Objects/stringobject.c
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2006-02-16 06:54:25 +0000
committerMartin v. Löwis <martin@v.loewis.de>2006-02-16 06:54:25 +0000
commit927fc40c9a396cd36b6eaf963f25dfbb21959487 (patch)
treecd21ae57805b39e88d5515feca5cdac8e335081b /Objects/stringobject.c
parent1f6961af675c2bdcf8b62aeda44564ac63a77a5f (diff)
downloadcpython-927fc40c9a396cd36b6eaf963f25dfbb21959487.tar.gz
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 a8e1cb6900..8821dcecfd 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);