summaryrefslogtreecommitdiffstats
path: root/winpr/libwinpr/crt/test/TestFormatSpecifiers.c
blob: 5ae6a40a606d7f0c05f29f854736d4f6e48f87df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#include <stdio.h>
#include <winpr/wtypes.h>
#include <winpr/string.h>

int TestFormatSpecifiers(int argc, char* argv[])
{
	unsigned errors = 0;

	char fmt[4096];

	WINPR_UNUSED(argc);
	WINPR_UNUSED(argv);

	/* size_t */
	{
		size_t arg = 0xabcd;
		const char* chk = "uz:43981 oz:125715 xz:abcd Xz:ABCD";

		sprintf_s(fmt, sizeof(fmt), "uz:%" PRIuz " oz:%" PRIoz " xz:%" PRIxz " Xz:%" PRIXz "", arg,
		          arg, arg, arg);

		if (strcmp(fmt, chk))
		{
			fprintf(stderr, "%s failed size_t test: got [%s] instead of [%s]\n", __func__, fmt,
			        chk);
			errors++;
		}
	}

	/* INT8 */
	{
		INT8 arg = -16;
		const char* chk = "d8:-16 x8:f0 X8:F0";

		sprintf_s(fmt, sizeof(fmt), "d8:%" PRId8 " x8:%" PRIx8 " X8:%" PRIX8 "", arg, (UINT8)arg,
		          (UINT8)arg);

		if (strcmp(fmt, chk))
		{
			fprintf(stderr, "%s failed INT8 test: got [%s] instead of [%s]\n", __func__, fmt, chk);
			errors++;
		}
	}

	/* UINT8 */
	{
		UINT8 arg = 0xFE;
		const char* chk = "u8:254 o8:376 x8:fe X8:FE";

		sprintf_s(fmt, sizeof(fmt), "u8:%" PRIu8 " o8:%" PRIo8 " x8:%" PRIx8 " X8:%" PRIX8 "", arg,
		          arg, arg, arg);

		if (strcmp(fmt, chk))
		{
			fprintf(stderr, "%s failed UINT8 test: got [%s] instead of [%s]\n", __func__, fmt, chk);
			errors++;
		}
	}

	/* INT16 */
	{
		INT16 arg = -16;
		const char* chk = "d16:-16 x16:fff0 X16:FFF0";

		sprintf_s(fmt, sizeof(fmt), "d16:%" PRId16 " x16:%" PRIx16 " X16:%" PRIX16 "", arg,
		          (UINT16)arg, (UINT16)arg);

		if (strcmp(fmt, chk))
		{
			fprintf(stderr, "%s failed INT16 test: got [%s] instead of [%s]\n", __func__, fmt, chk);
			errors++;
		}
	}

	/* UINT16 */
	{
		UINT16 arg = 0xFFFE;
		const char* chk = "u16:65534 o16:177776 x16:fffe X16:FFFE";

		sprintf_s(fmt, sizeof(fmt),
		          "u16:%" PRIu16 " o16:%" PRIo16 " x16:%" PRIx16 " X16:%" PRIX16 "", arg, arg, arg,
		          arg);

		if (strcmp(fmt, chk))
		{
			fprintf(stderr, "%s failed UINT16 test: got [%s] instead of [%s]\n", __func__, fmt,
			        chk);
			errors++;
		}
	}

	/* INT32 */
	{
		INT32 arg = -16;
		const char* chk = "d32:-16 x32:fffffff0 X32:FFFFFFF0";

		sprintf_s(fmt, sizeof(fmt), "d32:%" PRId32 " x32:%" PRIx32 " X32:%" PRIX32 "", arg,
		          (UINT32)arg, (UINT32)arg);

		if (strcmp(fmt, chk))
		{
			fprintf(stderr, "%s failed INT32 test: got [%s] instead of [%s]\n", __func__, fmt, chk);
			errors++;
		}
	}

	/* UINT32 */
	{
		UINT32 arg = 0xFFFFFFFE;
		const char* chk = "u32:4294967294 o32:37777777776 x32:fffffffe X32:FFFFFFFE";

		sprintf_s(fmt, sizeof(fmt),
		          "u32:%" PRIu32 " o32:%" PRIo32 " x32:%" PRIx32 " X32:%" PRIX32 "", arg, arg, arg,
		          arg);

		if (strcmp(fmt, chk))
		{
			fprintf(stderr, "%s failed UINT16 test: got [%s] instead of [%s]\n", __func__, fmt,
			        chk);
			errors++;
		}
	}

	/* INT64 */
	{
		INT64 arg = -16;
		const char* chk = "d64:-16 x64:fffffffffffffff0 X64:FFFFFFFFFFFFFFF0";

		sprintf_s(fmt, sizeof(fmt), "d64:%" PRId64 " x64:%" PRIx64 " X64:%" PRIX64 "", arg,
		          (UINT64)arg, (UINT64)arg);

		if (strcmp(fmt, chk))
		{
			fprintf(stderr, "%s failed INT64 test: got [%s] instead of [%s]\n", __func__, fmt, chk);
			errors++;
		}
	}

	/* UINT64 */
	{
		UINT64 arg = 0xFFFFFFFFFFFFFFFE;
		const char* chk = "u64:18446744073709551614 o64:1777777777777777777776 "
		                  "x64:fffffffffffffffe X64:FFFFFFFFFFFFFFFE";

		sprintf_s(fmt, sizeof(fmt),
		          "u64:%" PRIu64 " o64:%" PRIo64 " x64:%016" PRIx64 " X64:%016" PRIX64 "", arg, arg,
		          arg, arg);

		if (strcmp(fmt, chk))
		{
			fprintf(stderr, "%s failed UINT64 test: got [%s] instead of [%s]\n", __func__, fmt,
			        chk);
			errors++;
		}
	}

	if (errors)
	{
		fprintf(stderr, "%s produced %u errors\n", __func__, errors);
		return -1;
	}

	return 0;
}