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