test_int_format.h 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /*
  2. Copyright Kitware, Inc.
  3. Distributed under the OSI-approved BSD 3-Clause License.
  4. See accompanying file Copyright.txt for details.
  5. */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #if defined(_MSC_VER)
  9. # pragma warning (push)
  10. # pragma warning (disable:4309) /* static_cast trunction of constant value */
  11. # pragma warning (disable:4310) /* cast truncates constant value */
  12. #endif
  13. #ifdef __cplusplus
  14. # define LANG "C++ "
  15. #else
  16. # define LANG "C "
  17. #endif
  18. #if defined(__cplusplus) && !defined(__BORLANDC__)
  19. # define STATIC_CAST(t,v) static_cast<t>(v)
  20. #else
  21. # define STATIC_CAST(t,v) (t)(v)
  22. #endif
  23. #if defined(_MSC_VER) && _MSC_VER < 1900
  24. # define SNPRINTF(buf, sz, fmt, x) sprintf(buf, fmt, x)
  25. #else
  26. # define SNPRINTF(buf, sz, fmt, x) snprintf(buf, sz, fmt, x)
  27. #endif
  28. #define VALUE(T, U) STATIC_CAST(T, STATIC_CAST(U, 0xab) << ((sizeof(T)-1)<<3))
  29. #define TEST_C_(C, V, PRI, T, U) \
  30. { \
  31. T const x = VALUE(T, U); \
  32. T y = C(V); \
  33. printf(LANG #C ":" \
  34. " expression [%" KWIML_INT_PRI##PRI "]," \
  35. " literal [%" KWIML_INT_PRI##PRI "]", x, y); \
  36. if(x == y) \
  37. { \
  38. printf(", PASSED\n"); \
  39. } \
  40. else \
  41. { \
  42. printf(", FAILED\n"); \
  43. result = 0; \
  44. } \
  45. }
  46. #define TEST_PRI_(PRI, T, U, STR) \
  47. { \
  48. T const x = VALUE(T, U); \
  49. char const* str = STR; \
  50. SNPRINTF(buf, sizeof(buf), "%" KWIML_INT_PRI##PRI, x); \
  51. printf(LANG "KWIML_INT_PRI" #PRI ":" \
  52. " expected [%s], got [%s]", str, buf); \
  53. if(strcmp(str, buf) == 0) \
  54. { \
  55. printf(", PASSED\n"); \
  56. } \
  57. else \
  58. { \
  59. printf(", FAILED\n"); \
  60. result = 0; \
  61. } \
  62. }
  63. #define TEST_SCN_(SCN, T, U, STR) TEST_SCN2_(SCN, SCN, T, U, STR)
  64. #define TEST_SCN2_(PRI, SCN, T, U, STR) \
  65. { \
  66. T const x = VALUE(T, U); \
  67. T y; \
  68. char const* str = STR; \
  69. if(sscanf(str, "%" KWIML_INT_SCN##SCN, &y) != 1) \
  70. { \
  71. y = 0; \
  72. } \
  73. printf(LANG "KWIML_INT_SCN" #SCN ":" \
  74. " expected [%" KWIML_INT_PRI##PRI "]," \
  75. " got [%" KWIML_INT_PRI##PRI "]", x, y); \
  76. if(x == y) \
  77. { \
  78. printf(", PASSED\n"); \
  79. } \
  80. else \
  81. { \
  82. printf(", FAILED\n"); \
  83. result = 0; \
  84. } \
  85. }
  86. #define TEST_(FMT, T, U, STR) TEST2_(FMT, FMT, T, U, STR)
  87. #define TEST2_(PRI, SCN, T, U, STR) \
  88. TEST_PRI_(PRI, T, U, STR) \
  89. TEST_SCN2_(PRI, SCN, T, U, STR)
  90. /* Concatenate T and U now to avoid expanding them. */
  91. #define TEST(FMT, T, U, STR) \
  92. TEST_(FMT, KWIML_INT_##T, KWIML_INT_##U, STR)
  93. #define TEST2(PRI, SCN, T, U, STR) \
  94. TEST2_(PRI, SCN, KWIML_INT_##T, KWIML_INT_##U, STR)
  95. #define TEST_C(C, V, PRI, T, U) \
  96. TEST_C_(KWIML_INT_##C, V, PRI, KWIML_INT_##T, KWIML_INT_##U)
  97. #define TEST_PRI(PRI, T, U, STR) \
  98. TEST_PRI_(PRI, KWIML_INT_##T, KWIML_INT_##U, STR)
  99. #define TEST_SCN(SCN, T, U, STR) \
  100. TEST_SCN_(SCN, KWIML_INT_##T, KWIML_INT_##U, STR)
  101. #define TEST_SCN2(PRI, SCN, T, U, STR) \
  102. TEST_SCN2_(PRI, SCN, KWIML_INT_##T, KWIML_INT_##U, STR)
  103. static int test_int_format(void)
  104. {
  105. int result = 1;
  106. char buf[256];
  107. TEST_PRI(i8, int8_t, uint8_t, "-85")
  108. #if defined(KWIML_INT_SCNi8)
  109. TEST_SCN(i8, int8_t, uint8_t, "-85")
  110. #endif
  111. TEST_PRI(d8, int8_t, uint8_t, "-85")
  112. #if defined(KWIML_INT_SCNd8)
  113. TEST_SCN(d8, int8_t, uint8_t, "-85")
  114. #endif
  115. TEST_PRI(o8, uint8_t, uint8_t, "253")
  116. #if defined(KWIML_INT_SCNo8)
  117. TEST_SCN(o8, uint8_t, uint8_t, "253")
  118. #endif
  119. TEST_PRI(u8, uint8_t, uint8_t, "171")
  120. #if defined(KWIML_INT_SCNu8)
  121. TEST_SCN(u8, uint8_t, uint8_t, "171")
  122. #endif
  123. TEST_PRI(x8, uint8_t, uint8_t, "ab")
  124. TEST_PRI(X8, uint8_t, uint8_t, "AB")
  125. #if defined(KWIML_INT_SCNx8)
  126. TEST_SCN(x8, uint8_t, uint8_t, "ab")
  127. TEST_SCN2(X8, x8, uint8_t, uint8_t, "AB")
  128. #endif
  129. TEST(i16, int16_t, uint16_t, "-21760")
  130. TEST(d16, int16_t, uint16_t, "-21760")
  131. TEST(o16, uint16_t, uint16_t, "125400")
  132. TEST(u16, uint16_t, uint16_t, "43776")
  133. TEST(x16, uint16_t, uint16_t, "ab00")
  134. TEST2(X16, x16, uint16_t, uint16_t, "AB00")
  135. TEST(i32, int32_t, uint32_t, "-1426063360")
  136. TEST(d32, int32_t, uint32_t, "-1426063360")
  137. TEST(o32, uint32_t, uint32_t, "25300000000")
  138. TEST(u32, uint32_t, uint32_t, "2868903936")
  139. TEST(x32, uint32_t, uint32_t, "ab000000")
  140. TEST2(X32, x32, uint32_t, uint32_t, "AB000000")
  141. TEST_PRI(i64, int64_t, uint64_t, "-6124895493223874560")
  142. #if defined(KWIML_INT_SCNi64)
  143. TEST_SCN(i64, int64_t, uint64_t, "-6124895493223874560")
  144. #endif
  145. TEST_PRI(d64, int64_t, uint64_t, "-6124895493223874560")
  146. #if defined(KWIML_INT_SCNd64)
  147. TEST_SCN(d64, int64_t, uint64_t, "-6124895493223874560")
  148. #endif
  149. TEST_PRI(o64, uint64_t, uint64_t, "1254000000000000000000")
  150. #if defined(KWIML_INT_SCNo64)
  151. TEST_SCN(o64, uint64_t, uint64_t, "1254000000000000000000")
  152. #endif
  153. TEST_PRI(u64, uint64_t, uint64_t, "12321848580485677056")
  154. #if defined(KWIML_INT_SCNu64)
  155. TEST_SCN(u64, uint64_t, uint64_t, "12321848580485677056")
  156. #endif
  157. TEST_PRI(x64, uint64_t, uint64_t, "ab00000000000000")
  158. TEST_PRI(X64, uint64_t, uint64_t, "AB00000000000000")
  159. #if defined(KWIML_INT_SCNx64)
  160. TEST_SCN(x64, uint64_t, uint64_t, "ab00000000000000")
  161. TEST_SCN2(X64, x64, uint64_t, uint64_t, "AB00000000000000")
  162. #endif
  163. #if !defined(KWIML_INT_NO_INTPTR_T)
  164. # if KWIML_ABI_SIZEOF_DATA_PTR == 4
  165. TEST(iPTR, intptr_t, uint32_t, "-1426063360")
  166. TEST(dPTR, intptr_t, uint32_t, "-1426063360")
  167. # else
  168. TEST(iPTR, intptr_t, uint64_t, "-6124895493223874560")
  169. TEST(dPTR, intptr_t, uint64_t, "-6124895493223874560")
  170. # endif
  171. #endif
  172. #if !defined(KWIML_INT_NO_UINTPTR_T)
  173. # if KWIML_ABI_SIZEOF_DATA_PTR == 4
  174. TEST(oPTR, uintptr_t, uintptr_t, "25300000000")
  175. TEST(uPTR, uintptr_t, uintptr_t, "2868903936")
  176. TEST(xPTR, uintptr_t, uintptr_t, "ab000000")
  177. TEST2(XPTR, xPTR, uintptr_t, uintptr_t, "AB000000")
  178. # else
  179. TEST(oPTR, uintptr_t, uintptr_t, "1254000000000000000000")
  180. TEST(uPTR, uintptr_t, uintptr_t, "12321848580485677056")
  181. TEST(xPTR, uintptr_t, uintptr_t, "ab00000000000000")
  182. TEST2(XPTR, xPTR, uintptr_t, uintptr_t, "AB00000000000000")
  183. # endif
  184. #endif
  185. TEST_C(INT8_C, -0x55, i8, int8_t, uint8_t)
  186. TEST_C(UINT8_C, 0xAB, u8, uint8_t, uint8_t)
  187. TEST_C(INT16_C, -0x5500, i16, int16_t, uint16_t)
  188. TEST_C(UINT16_C, 0xAB00, u16, uint16_t, uint16_t)
  189. TEST_C(INT32_C, -0x55000000, i32, int32_t, uint32_t)
  190. TEST_C(UINT32_C, 0xAB000000, u32, uint32_t, uint32_t)
  191. TEST_C(INT64_C, -0x5500000000000000, i64, int64_t, uint64_t)
  192. TEST_C(UINT64_C, 0xAB00000000000000, u64, uint64_t, uint64_t)
  193. return result;
  194. }
  195. #if defined(_MSC_VER)
  196. # pragma warning (pop)
  197. #endif