1
2#include <stdio.h>
3
4#include "SDL.h"
5#include "SDL_endian.h"
6#include "SDL_cpuinfo.h"
7
8/*
9 * Watcom C flags these as Warning 201: "Unreachable code" if you just
10 *  compare them directly, so we push it through a function to keep the
11 *  compiler quiet.  --ryan.
12 */
13static int badsize(size_t sizeoftype, size_t hardcodetype)
14{
15    return sizeoftype != hardcodetype;
16}
17
18int TestTypes(SDL_bool verbose)
19{
20	int error = 0;
21
22	if ( badsize(sizeof(Uint8), 1) ) {
23		if ( verbose )
24			printf("sizeof(Uint8) != 1, instead = %lu\n",
25								(unsigned long) sizeof(Uint8));
26		++error;
27	}
28	if ( badsize(sizeof(Uint16), 2) ) {
29		if ( verbose )
30			printf("sizeof(Uint16) != 2, instead = %lu\n",
31								(unsigned long) sizeof(Uint16));
32		++error;
33	}
34	if ( badsize(sizeof(Uint32), 4) ) {
35		if ( verbose )
36			printf("sizeof(Uint32) != 4, instead = %lu\n",
37								(unsigned long) sizeof(Uint32));
38		++error;
39	}
40#ifdef SDL_HAS_64BIT_TYPE
41	if ( badsize(sizeof(Uint64), 8) ) {
42		if ( verbose )
43			printf("sizeof(Uint64) != 8, instead = %lu\n",
44								(unsigned long) sizeof(Uint64));
45		++error;
46	}
47#else
48	if ( verbose ) {
49		printf("WARNING: No 64-bit datatype on this platform\n");
50	}
51#endif
52	if ( verbose && !error )
53		printf("All data types are the expected size.\n");
54
55	return( error ? 1 : 0 );
56}
57
58int TestEndian(SDL_bool verbose)
59{
60	int error = 0;
61	Uint16 value = 0x1234;
62	int real_byteorder;
63	Uint16 value16 = 0xCDAB;
64	Uint16 swapped16 = 0xABCD;
65	Uint32 value32 = 0xEFBEADDE;
66	Uint32 swapped32 = 0xDEADBEEF;
67#ifdef SDL_HAS_64BIT_TYPE
68	Uint64 value64, swapped64;
69	value64 = 0xEFBEADDE;
70	value64 <<= 32;
71	value64 |= 0xCDAB3412;
72	swapped64 = 0x1234ABCD;
73	swapped64 <<= 32;
74	swapped64 |= 0xDEADBEEF;
75#endif
76
77	if ( verbose ) {
78		printf("Detected a %s endian machine.\n",
79			(SDL_BYTEORDER == SDL_LIL_ENDIAN) ? "little" : "big");
80	}
81	if ( (*((char *)&value) >> 4) == 0x1 ) {
82		real_byteorder = SDL_BIG_ENDIAN;
83	} else {
84		real_byteorder = SDL_LIL_ENDIAN;
85	}
86	if ( real_byteorder != SDL_BYTEORDER ) {
87		if ( verbose ) {
88			printf("Actually a %s endian machine!\n",
89				(real_byteorder == SDL_LIL_ENDIAN) ? "little" : "big");
90		}
91		++error;
92	}
93	if ( verbose ) {
94		printf("Value 16 = 0x%X, swapped = 0x%X\n", value16, SDL_Swap16(value16));
95	}
96	if ( SDL_Swap16(value16) != swapped16 ) {
97		if ( verbose ) {
98			printf("16 bit value swapped incorrectly!\n");
99		}
100		++error;
101	}
102	if ( verbose ) {
103		printf("Value 32 = 0x%X, swapped = 0x%X\n", value32, SDL_Swap32(value32));
104	}
105	if ( SDL_Swap32(value32) != swapped32 ) {
106		if ( verbose ) {
107			printf("32 bit value swapped incorrectly!\n");
108		}
109		++error;
110	}
111#ifdef SDL_HAS_64BIT_TYPE
112	if ( verbose ) {
113#ifdef _MSC_VER
114		printf("Value 64 = 0x%I64X, swapped = 0x%I64X\n", value64, SDL_Swap64(value64));
115#else
116		printf("Value 64 = 0x%llX, swapped = 0x%llX\n", (unsigned long long) value64, (unsigned long long) SDL_Swap64(value64));
117#endif
118	}
119	if ( SDL_Swap64(value64) != swapped64 ) {
120		if ( verbose ) {
121			printf("64 bit value swapped incorrectly!\n");
122		}
123		++error;
124	}
125#endif
126	return( error ? 1 : 0 );
127}
128
129
130int TestCPUInfo(SDL_bool verbose)
131{
132	if ( verbose ) {
133		printf("RDTSC %s\n", SDL_HasRDTSC() ? "detected" : "not detected");
134		printf("MMX %s\n", SDL_HasMMX() ? "detected" : "not detected");
135		printf("MMX Ext %s\n", SDL_HasMMXExt() ? "detected" : "not detected");
136		printf("3DNow %s\n", SDL_Has3DNow() ? "detected" : "not detected");
137		printf("3DNow Ext %s\n", SDL_Has3DNowExt() ? "detected" : "not detected");
138		printf("SSE %s\n", SDL_HasSSE() ? "detected" : "not detected");
139		printf("SSE2 %s\n", SDL_HasSSE2() ? "detected" : "not detected");
140		printf("AltiVec %s\n", SDL_HasAltiVec() ? "detected" : "not detected");
141	}
142	return(0);
143}
144
145int main(int argc, char *argv[])
146{
147	SDL_bool verbose = SDL_TRUE;
148	int status = 0;
149
150	if ( argv[1] && (SDL_strcmp(argv[1], "-q") == 0) ) {
151		verbose = SDL_FALSE;
152	}
153	if ( verbose ) {
154		printf("This system is running %s\n",
155#if __AIX__
156			"AIX"
157#elif __HAIKU__
158/* Haiku must appear here before BeOS, since it also defines __BEOS__ */
159			"Haiku"
160#elif __BEOS__
161			"BeOS"
162#elif __BSDI__
163			"BSDI"
164#elif __DREAMCAST__
165			"Dreamcast"
166#elif __FREEBSD__
167			"FreeBSD"
168#elif __HPUX__
169			"HP-UX"
170#elif __IRIX__
171			"Irix"
172#elif __LINUX__
173			"Linux"
174#elif __MINT__
175			"Atari MiNT"
176#elif __MACOS__
177			"MacOS Classic"
178#elif __MACOSX__
179			"Mac OS X"
180#elif __NETBSD__
181			"NetBSD"
182#elif __OPENBSD__
183			"OpenBSD"
184#elif __OS2__
185			"OS/2"
186#elif __OSF__
187			"OSF/1"
188#elif __QNXNTO__
189			"QNX Neutrino"
190#elif __RISCOS__
191			"RISC OS"
192#elif __SOLARIS__
193			"Solaris"
194#elif __WIN32__
195#ifdef _WIN32_WCE
196			"Windows CE"
197#else
198			"Windows"
199#endif
200#else
201			"an unknown operating system! (see SDL_platform.h)"
202#endif
203		);
204	}
205
206	status += TestTypes(verbose);
207	status += TestEndian(verbose);
208	status += TestCPUInfo(verbose);
209	return status;
210}
211