Home | History | Annotate | Download | only in test
      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  */
     13 static int badsize(size_t sizeoftype, size_t hardcodetype)
     14 {
     15     return sizeoftype != hardcodetype;
     16 }
     17 
     18 int 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 
     58 int 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 
    130 int 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 
    145 int 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