test_int_format.h 8.8 KB

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