
#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;
}
