#include "platform.h"

struct platform platforms[] = {
    {
        // item 0
        CS_ARCH_X86,
        CS_MODE_32,
        "X86 32 (Intel syntax)",
        "x32"
    },
    {
        // item 1
        CS_ARCH_X86,
        CS_MODE_64,
        "X86 64 (Intel syntax)",
        "x64"
    },
    {
        // item 2
        CS_ARCH_ARM,
        CS_MODE_ARM,
        "ARM",
        "arm"
    },
    {
        // item 3
        CS_ARCH_ARM,
        CS_MODE_THUMB,
        "THUMB",
        "thumb"
    },
    {
        // item 4
        CS_ARCH_ARM,
        (cs_mode)(CS_MODE_ARM + CS_MODE_V8),
        "Arm-V8",
        "armv8"
    },
    {
        // item 5
        CS_ARCH_ARM,
        (cs_mode)(CS_MODE_THUMB+CS_MODE_V8),
        "THUMB+V8",
        "thumbv8"
    },
    {
        // item 6
        CS_ARCH_ARM,
        (cs_mode)(CS_MODE_THUMB + CS_MODE_MCLASS),
        "Thumb-MClass",
        "cortexm"
    },
    {
        // item 7
        CS_ARCH_ARM64,
        (cs_mode)0,
        "ARM-64",
        "arm64"
    },
    {
        // item 8
        CS_ARCH_MIPS,
        (cs_mode)(CS_MODE_MIPS32 + CS_MODE_BIG_ENDIAN),
        "MIPS-32 (Big-endian)",
        "mipsbe"
    },
    {
        // item 9
        CS_ARCH_MIPS,
        (cs_mode)(CS_MODE_MIPS32 + CS_MODE_MICRO),
        "MIPS-32 (micro)",
        "mipsmicro"
    },
    {
        //item 10
        CS_ARCH_MIPS,
        CS_MODE_MIPS64,
        "MIPS-64-EL (Little-endian)",
        "mips64"
    },
    {
        //item 11
        CS_ARCH_MIPS,
        CS_MODE_MIPS32,
        "MIPS-32-EL (Little-endian)",
        "mips"
    },
    {
        //item 12
        CS_ARCH_MIPS,
        (cs_mode)(CS_MODE_MIPS64 + CS_MODE_BIG_ENDIAN),
        "MIPS-64 (Big-endian)",
        "mips64be"
    },
    {
        //item 13
        CS_ARCH_MIPS,
        (cs_mode)(CS_MODE_MIPS32 + CS_MODE_MICRO + CS_MODE_BIG_ENDIAN),
        "MIPS-32 | Micro (Big-endian)",
        "mipsbemicro"
    },
    {
        //item 14
        CS_ARCH_PPC,
        CS_MODE_64 | CS_MODE_BIG_ENDIAN,
        "PPC-64",
        "ppc64be"
    },
    {
        //item 15
        CS_ARCH_SPARC,
        CS_MODE_BIG_ENDIAN,
        "Sparc",
        "sparc"
    },
    {
        //item 16
        CS_ARCH_SPARC,
        (cs_mode)(CS_MODE_BIG_ENDIAN + CS_MODE_V9),
        "SparcV9",
        "sparcv9"
    },
    {
        //item 17
        CS_ARCH_SYSZ,
        (cs_mode)0,
        "SystemZ",
        "systemz"
    },
    {
        //item 18
        CS_ARCH_XCORE,
        (cs_mode)0,
        "XCore",
        "xcore"
    },
    {
        //item 19
        CS_ARCH_MIPS,
        (cs_mode)(CS_MODE_MIPS32R6 + CS_MODE_BIG_ENDIAN),
        "MIPS-32R6 (Big-endian)",
        "mipsbe32r6"
    },
    {
        //item 20
        CS_ARCH_MIPS,
        (cs_mode)(CS_MODE_MIPS32R6 + CS_MODE_MICRO + CS_MODE_BIG_ENDIAN),
        "MIPS-32R6 (Micro+Big-endian)",
        "mipsbe32r6micro"
    },
    {
        //item 21
        CS_ARCH_MIPS,
        CS_MODE_MIPS32R6,
        "MIPS-32R6 (Little-endian)",
        "mips32r6"
    },
    {
        //item 22
        CS_ARCH_MIPS,
        (cs_mode)(CS_MODE_MIPS32R6 + CS_MODE_MICRO),
        "MIPS-32R6 (Micro+Little-endian)",
        "mips32r6micro"
    },
    {
        //item 23
        CS_ARCH_M68K,
        (cs_mode)0,
        "M68K",
        "m68k"
    },
    {
        //item 24
        CS_ARCH_M680X,
        (cs_mode)CS_MODE_M680X_6809,
        "M680X_M6809",
        "m6809"
    },
    {
        //item 25
        CS_ARCH_EVM,
        (cs_mode)0,
        "EVM",
        "evm"
    },
    {
        //item 26
        CS_ARCH_MOS65XX,
        (cs_mode)0,
        "MOS65XX",
        "mos65xx"
    },
    {
        //item 27
        CS_ARCH_TMS320C64X,
        CS_MODE_BIG_ENDIAN,
        "tms320c64x",
        "tms320c64x"
    },
    {
        //item 28
        CS_ARCH_WASM,
        (cs_mode)0,
        "WASM",
        "wasm"
    },
    {
        //item 29
        CS_ARCH_BPF,
        CS_MODE_LITTLE_ENDIAN | CS_MODE_BPF_CLASSIC,
        "cBPF",
        "bpf"
    },
    {
        //item 30
        CS_ARCH_BPF,
        CS_MODE_LITTLE_ENDIAN | CS_MODE_BPF_EXTENDED,
        "eBPF",
        "ebpf"
    },
    {
        //item 31
        CS_ARCH_BPF,
        CS_MODE_BIG_ENDIAN | CS_MODE_BPF_CLASSIC,
        "cBPF",
        "bpfbe"
    },
    {
        //item 32
        CS_ARCH_BPF,
        CS_MODE_BIG_ENDIAN | CS_MODE_BPF_EXTENDED,
        "eBPF",
        "ebpfbe"
    },
    {
        // item 33
        CS_ARCH_X86,
        CS_MODE_16,
        "X86 16 (Intel syntax)",
        "x16"
    },
    {
        // item 34
        CS_ARCH_M68K,
        CS_MODE_M68K_040,
        "M68K mode 40",
        "m68k40"
    },
    {
        //item 35
        CS_ARCH_M680X,
        (cs_mode)CS_MODE_M680X_6800,
        "M680X_M6800",
        "m6800"
    },
    {
        //item 36
        CS_ARCH_M680X,
        (cs_mode)CS_MODE_M680X_6801,
        "M680X_M6801",
        "m6801"
    },
    {
        //item 37
        CS_ARCH_M680X,
        (cs_mode)CS_MODE_M680X_6805,
        "M680X_M6805",
        "m6805"
    },
    {
        //item 38
        CS_ARCH_M680X,
        (cs_mode)CS_MODE_M680X_6808,
        "M680X_M6808",
        "m6808"
    },
    {
        //item 39
        CS_ARCH_M680X,
        (cs_mode)CS_MODE_M680X_6811,
        "M680X_M6811",
        "m6811"
    },
    {
        //item 40
        CS_ARCH_M680X,
        (cs_mode)CS_MODE_M680X_CPU12,
        "M680X_cpu12",
        "cpu12"
    },
    {
        //item 41
        CS_ARCH_M680X,
        (cs_mode)CS_MODE_M680X_6301,
        "M680X_M6808",
        "hd6301"
    },
    {
        //item 42
        CS_ARCH_M680X,
        (cs_mode)CS_MODE_M680X_6309,
        "M680X_M6808",
        "hd6309"
    },
    {
        //item 43
        CS_ARCH_M680X,
        (cs_mode)CS_MODE_M680X_HCS08,
        "M680X_M6808",
        "hcs08"
    },
    {
        //item 44
        CS_ARCH_RISCV,
        CS_MODE_RISCV32,
        "RISCV",
        "riscv32"
    },
    {
        //item 45
        CS_ARCH_RISCV,
        CS_MODE_RISCV64,
        "RISCV",
        "riscv64"
    },
    {
        //item 46
        CS_ARCH_PPC,
        CS_MODE_64 | CS_MODE_BIG_ENDIAN | CS_MODE_QPX,
        "ppc+qpx",
        "ppc64beqpx"
    },

    // dummy entry to mark the end of this array.
    // DO NOT DELETE THIS
    {
        0,
        0,
        NULL,
        NULL,
    },
};

// get length of platforms[]
unsigned int platform_len(void)
{
    unsigned int c;

    for(c = 0; platforms[c].cstoolname; c++);

    return c;
}

// get platform entry encoded n (first byte for input data of OSS fuzz)
unsigned int get_platform_entry(uint8_t n)
{
    return n % platform_len();
}

// get cstoolname from encoded n (first byte for input data of OSS fuzz)
const char *get_platform_cstoolname(uint8_t n)
{
    return platforms[get_platform_entry(n)].cstoolname;
}

