diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2006-02-16 06:54:25 +0000 |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2006-02-16 06:54:25 +0000 |
commit | 927fc40c9a396cd36b6eaf963f25dfbb21959487 (patch) | |
tree | cd21ae57805b39e88d5515feca5cdac8e335081b /Objects/stringobject.c | |
parent | 1f6961af675c2bdcf8b62aeda44564ac63a77a5f (diff) | |
download | cpython-927fc40c9a396cd36b6eaf963f25dfbb21959487.tar.gz |
Support %zd in PyErr_Format and PyString_FromFormat.
Diffstat (limited to 'Objects/stringobject.c')
-rw-r--r-- | Objects/stringobject.c | 21 |
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); |