| |
| #include <stdio.h> |
| |
| #include "SDL.h" |
| #include "SDL_endian.h" |
| #include "SDL_cpuinfo.h" |
| |
| /* |
| * Watcom C flags these as Warning 201: "Unreachable code" if you just |
| * compare them directly, so we push it through a function to keep the |
| * compiler quiet. --ryan. |
| */ |
| static int |
| badsize(size_t sizeoftype, size_t hardcodetype) |
| { |
| return sizeoftype != hardcodetype; |
| } |
| |
| int |
| TestTypes(SDL_bool verbose) |
| { |
| int error = 0; |
| |
| if (badsize(sizeof(Uint8), 1)) { |
| if (verbose) |
| printf("sizeof(Uint8) != 1, instead = %ul\n", sizeof(Uint8)); |
| ++error; |
| } |
| if (badsize(sizeof(Uint16), 2)) { |
| if (verbose) |
| printf("sizeof(Uint16) != 2, instead = %ul\n", sizeof(Uint16)); |
| ++error; |
| } |
| if (badsize(sizeof(Uint32), 4)) { |
| if (verbose) |
| printf("sizeof(Uint32) != 4, instead = %ul\n", sizeof(Uint32)); |
| ++error; |
| } |
| #ifdef SDL_HAS_64BIT_TYPE |
| if (badsize(sizeof(Uint64), 8)) { |
| if (verbose) |
| printf("sizeof(Uint64) != 8, instead = %ul\n", sizeof(Uint64)); |
| ++error; |
| } |
| #else |
| if (verbose) { |
| printf("WARNING: No 64-bit datatype on this platform\n"); |
| } |
| #endif |
| if (verbose && !error) |
| printf("All data types are the expected size.\n"); |
| |
| return (error ? 1 : 0); |
| } |
| |
| int |
| TestEndian(SDL_bool verbose) |
| { |
| int error = 0; |
| Uint16 value = 0x1234; |
| int real_byteorder; |
| Uint16 value16 = 0xCDAB; |
| Uint16 swapped16 = 0xABCD; |
| Uint32 value32 = 0xEFBEADDE; |
| Uint32 swapped32 = 0xDEADBEEF; |
| #ifdef SDL_HAS_64BIT_TYPE |
| Uint64 value64, swapped64; |
| value64 = 0xEFBEADDE; |
| value64 <<= 32; |
| value64 |= 0xCDAB3412; |
| swapped64 = 0x1234ABCD; |
| swapped64 <<= 32; |
| swapped64 |= 0xDEADBEEF; |
| #endif |
| |
| if (verbose) { |
| printf("Detected a %s endian machine.\n", |
| (SDL_BYTEORDER == SDL_LIL_ENDIAN) ? "little" : "big"); |
| } |
| if ((*((char *) &value) >> 4) == 0x1) { |
| real_byteorder = SDL_BIG_ENDIAN; |
| } else { |
| real_byteorder = SDL_LIL_ENDIAN; |
| } |
| if (real_byteorder != SDL_BYTEORDER) { |
| if (verbose) { |
| printf("Actually a %s endian machine!\n", |
| (real_byteorder == SDL_LIL_ENDIAN) ? "little" : "big"); |
| } |
| ++error; |
| } |
| if (verbose) { |
| printf("Value 16 = 0x%X, swapped = 0x%X\n", value16, |
| SDL_Swap16(value16)); |
| } |
| if (SDL_Swap16(value16) != swapped16) { |
| if (verbose) { |
| printf("16 bit value swapped incorrectly!\n"); |
| } |
| ++error; |
| } |
| if (verbose) { |
| printf("Value 32 = 0x%X, swapped = 0x%X\n", value32, |
| SDL_Swap32(value32)); |
| } |
| if (SDL_Swap32(value32) != swapped32) { |
| if (verbose) { |
| printf("32 bit value swapped incorrectly!\n"); |
| } |
| ++error; |
| } |
| #ifdef SDL_HAS_64BIT_TYPE |
| if (verbose) { |
| #ifdef _MSC_VER |
| printf("Value 64 = 0x%I64X, swapped = 0x%I64X\n", value64, |
| SDL_Swap64(value64)); |
| #else |
| printf("Value 64 = 0x%llX, swapped = 0x%llX\n", value64, |
| SDL_Swap64(value64)); |
| #endif |
| } |
| if (SDL_Swap64(value64) != swapped64) { |
| if (verbose) { |
| printf("64 bit value swapped incorrectly!\n"); |
| } |
| ++error; |
| } |
| #endif |
| return (error ? 1 : 0); |
| } |
| |
| |
| int |
| TestCPUInfo(SDL_bool verbose) |
| { |
| if (verbose) { |
| printf("RDTSC %s\n", SDL_HasRDTSC()? "detected" : "not detected"); |
| printf("MMX %s\n", SDL_HasMMX()? "detected" : "not detected"); |
| printf("MMX Ext %s\n", SDL_HasMMXExt()? "detected" : "not detected"); |
| printf("3DNow %s\n", SDL_Has3DNow()? "detected" : "not detected"); |
| printf("3DNow Ext %s\n", |
| SDL_Has3DNowExt()? "detected" : "not detected"); |
| printf("SSE %s\n", SDL_HasSSE()? "detected" : "not detected"); |
| printf("SSE2 %s\n", SDL_HasSSE2()? "detected" : "not detected"); |
| printf("AltiVec %s\n", SDL_HasAltiVec()? "detected" : "not detected"); |
| } |
| return (0); |
| } |
| |
| int |
| main(int argc, char *argv[]) |
| { |
| SDL_bool verbose = SDL_TRUE; |
| int status = 0; |
| |
| if (argv[1] && (SDL_strcmp(argv[1], "-q") == 0)) { |
| verbose = SDL_FALSE; |
| } |
| if (verbose) { |
| printf("This system is running %s\n", |
| #if __AIX__ |
| "AIX" |
| #elif __AMIGA__ |
| "AmigaOS" |
| #elif __BEOS__ |
| "BeOS" |
| #elif __BSDI__ |
| "BSDI" |
| #elif __DREAMCAST__ |
| "Dreamcast" |
| #elif __FREEBSD__ |
| "FreeBSD" |
| #elif __HPUX__ |
| "HP-UX" |
| #elif __IRIX__ |
| "Irix" |
| #elif __LINUX__ |
| "Linux" |
| #elif __MINT__ |
| "Atari MiNT" |
| #elif __MACOS__ |
| "MacOS Classic" |
| #elif __MACOSX__ |
| "Mac OS X" |
| #elif __NETBSD__ |
| "NetBSD" |
| #elif __OPENBSD__ |
| "OpenBSD" |
| #elif __OS2__ |
| "OS/2" |
| #elif __OSF__ |
| "OSF/1" |
| #elif __QNXNTO__ |
| "QNX Neutrino" |
| #elif __RISCOS__ |
| "RISC OS" |
| #elif __SOLARIS__ |
| "Solaris" |
| #elif __WIN32__ |
| #ifdef _WIN32_WCE |
| "Windows CE" |
| #else |
| "Windows" |
| #endif |
| #else |
| "an unknown operating system! (see SDL_platform.h)" |
| #endif |
| ); |
| } |
| |
| status += TestTypes(verbose); |
| status += TestEndian(verbose); |
| status += TestCPUInfo(verbose); |
| return status; |
| } |