diff Objects/stringobject.c @ 36510:0f3894bb2ada legacy-trunk

Support %zd in PyErr_Format and PyString_FromFormat.
author Martin v. Löwis <martin@v.loewis.de>
date Thu, 16 Feb 2006 06:54:25 +0000
parents 7fdc639bc5b4
children d6d415df0df0
line wrap: on
line diff
--- a/Objects/stringobject.c	Thu Feb 16 06:21:57 2006 +0000
+++ b/Objects/stringobject.c	Thu Feb 16 06:54:25 2006 +0000
@@ -181,6 +181,9 @@
 			   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 @@
 			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 @@
 				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 @@
 			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);