Fix issuse with != and == shown by fx_basic_bstring unit tests.
[pdfium.git] / core / include / fxcrt / fx_system.h
index 7488e9d..d030bf7 100644 (file)
@@ -34,8 +34,9 @@
 #endif
 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
 #define _CRT_SECURE_NO_WARNINGS
+#include <sal.h>
 #include <windows.h>
-#endif
+#endif  // _FXM_PLATFORM_WINDOWS_
 #define _FX_W32_               1
 #define _FX_W64_               2
 #ifndef _FX_WORDSIZE_
@@ -137,13 +138,20 @@ typedef FX_UINT64                         FX_QWORD;
 #define FX_MAX(a, b) (((a) > (b)) ? (a) : (b))
 #define FX_MIN(a, b) (((a) < (b)) ? (a) : (b))
 #define FX_PI  3.1415926535897932384626433832795f
-#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
-#define FXSYS_snprintf _snprintf
+
+// NOTE: prevent use of the return value from snprintf() since some platforms
+// have different return values (e.g. windows _vsnprintf()), and provide
+// versions that always NUL-terminate.
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ && _MSC_VER < 1900
+void FXSYS_snprintf(char *str, size_t size, _Printf_format_string_ const char* fmt, ...);
+void FXSYS_vsnprintf(char *str, size_t size, const char* fmt, va_list ap);
 #else
-#define FXSYS_snprintf snprintf
+#define FXSYS_snprintf (void) snprintf
+#define FXSYS_vsnprintf        (void) vsnprintf
 #endif
-#define FXSYS_sprintf  sprintf
-#define FXSYS_vsprintf vsprintf
+
+#define FXSYS_sprintf  DO_NOT_USE_SPRINTF_DIE_DIE_DIE
+#define FXSYS_vsprintf DO_NOT_USE_VSPRINTF_DIE_DIE_DIE
 #define FXSYS_strchr   strchr
 #define FXSYS_strlen   strlen
 #define FXSYS_strncmp  strncmp
@@ -278,11 +286,45 @@ int                       FXSYS_round(FX_FLOAT f);
 
 #if defined(__clang__) || _MSC_VER >= 1700
 #define FX_FINAL final
+#define FX_OVERRIDE override
 #elif defined(__GNUC__) && __cplusplus >= 201103 && \
       (__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40700
 #define FX_FINAL final
+#define FX_OVERRIDE override
 #else
 #define FX_FINAL
+#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