@@ -181,6 +181,9 @@ PyString_FromFormatV(const char *format, va_list vargs)
181181 added */
182182 if (* f == 'l' && * (f + 1 ) == 'd' )
183183 ++ f ;
184+ /* likewise for %zd */
185+ if (* f == 'z' && * (f + 1 ) == 'd' )
186+ ++ f ;
184187
185188 switch (* f ) {
186189 case 'c' :
@@ -237,6 +240,7 @@ PyString_FromFormatV(const char *format, va_list vargs)
237240 const char * p = f ++ ;
238241 Py_ssize_t i ;
239242 int longflag = 0 ;
243+ int size_tflag = 0 ;
240244 /* parse the width.precision part (we're only
241245 interested in the precision value, if any) */
242246 n = 0 ;
@@ -256,6 +260,11 @@ PyString_FromFormatV(const char *format, va_list vargs)
256260 longflag = 1 ;
257261 ++ f ;
258262 }
263+ /* handle the size_t flag. */
264+ if (* f == 'z' && * (f + 1 ) == 'd' ) {
265+ size_tflag = 1 ;
266+ ++ f ;
267+ }
259268
260269 switch (* f ) {
261270 case 'c' :
@@ -264,6 +273,18 @@ PyString_FromFormatV(const char *format, va_list vargs)
264273 case 'd' :
265274 if (longflag )
266275 sprintf (s , "%ld" , va_arg (vargs , long ));
276+ else if (size_tflag ) {
277+ /* Instead of checking whether the C
278+ library supports %zd, handle the
279+ common cases. */
280+ #if SIZEOF_SIZE_T == SIZEOF_LONG
281+ sprintf (s , "%ld" , va_arg (vargs , long ));
282+ #elif defined(MS_WINDOWS )
283+ sprintf (s , "%Id" , va_arg (vargs , size_t ));
284+ #else
285+ #error Cannot print size_t values
286+ #endif
287+ }
267288 else
268289 sprintf (s , "%d" , va_arg (vargs , int ));
269290 s += strlen (s );
0 commit comments