Fixing format strings to remove 'z' size specifier.
authorBruce Dawson <brucedawson@google.com>
Tue, 18 Nov 2014 17:55:38 +0000 (09:55 -0800)
committerBruce Dawson <brucedawson@google.com>
Tue, 18 Nov 2014 17:55:38 +0000 (09:55 -0800)
As of the 2013 version VC++ still doesn't support the 'z' size specifier. This makes portable printing of size_t types frustrating. The simplest general solution is to use %u and cast to unsigned. If there was any possibility of the numbers getting larger than 32-bit then we would need better alternatives, but there is not.

This was found through code inspection, through /analyze, and through pdfium_test print this non-helpful message:

Loaded, parsed and rendered zu pages.
Skipped zu bad pages.

I can confirm that the fix works on Windows and it should work identically on mac. This is a follow-on to change 02e6ca4c4f.

R=tsepez@chromium.org

Review URL: https://codereview.chromium.org/738433003

core/include/fxcrt/fx_system.h
samples/pdfium_test.cc

index 36050f3..355bd74 100644 (file)
@@ -293,4 +293,35 @@ typedef base::CheckedNumeric<size_t>   FX_SAFE_SIZE_T;
 #define FX_OVERRIDE
 #endif
 #endif
+
+// To print a size_t value in a portable way:
+//   size_t size;
+//   printf("xyz: %" PRIuS, size);
+// The "u" in the macro corresponds to %u, and S is for "size".
+
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+
+#if (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && !defined(PRId64)
+#error "inttypes.h has already been included before this header file, but "
+#error "without __STDC_FORMAT_MACROS defined."
+#endif
+
+#if !defined(__STDC_FORMAT_MACROS)
+#define __STDC_FORMAT_MACROS
+#endif
+
+#include <inttypes.h>
+
+#if !defined(PRIuS)
+#define PRIuS "zu"
+#endif
+
+#else  // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+
+#if !defined(PRIuS)
+#define PRIuS "Iu"
+#endif
+
+#endif
+
 #endif
index 96788e0..3a6cdfa 100644 (file)
@@ -16,6 +16,7 @@
 #include "../fpdfsdk/include/fpdfformfill.h"
 #include "../fpdfsdk/include/fpdftext.h"
 #include "../fpdfsdk/include/fpdfview.h"
+#include "../core/include/fxcrt/fx_system.h"
 #include "v8/include/v8.h"
 
 #ifdef _WIN32
@@ -359,8 +360,8 @@ void RenderPdf(const char* name, const char* pBuf, size_t len,
   FPDF_CloseDocument(doc);
   FPDFAvail_Destroy(pdf_avail);
 
-  printf("Loaded, parsed and rendered %zu pages.\n", rendered_pages);
-  printf("Skipped %zu bad pages.\n", bad_pages);
+  printf("Loaded, parsed and rendered %" PRIuS " pages.\n", rendered_pages);
+  printf("Skipped %" PRIuS " bad pages.\n", bad_pages);
 }
 
 int main(int argc, const char* argv[]) {