Alibek Omarov
2 years ago
2 changed files with 178 additions and 0 deletions
@ -0,0 +1,177 @@
@@ -0,0 +1,177 @@
|
||||
#include <stdlib.h> |
||||
#include "build.h" |
||||
#include "buildenums.h" |
||||
#include "crtlib.h" |
||||
|
||||
// THESE DEFINITIONS MUST NEVER CHANGE
|
||||
static struct |
||||
{ |
||||
int id; |
||||
const char *string; |
||||
} expected_platforms[] = |
||||
{ |
||||
{ PLATFORM_WIN32, "win32" }, |
||||
{ PLATFORM_ANDROID, "android" }, |
||||
{ PLATFORM_LINUX_UNKNOWN, "linuxunkabi" }, |
||||
{ PLATFORM_LINUX, "linux" }, |
||||
{ PLATFORM_APPLE, "apple" }, |
||||
{ PLATFORM_FREEBSD, "freebsd" }, |
||||
{ PLATFORM_NETBSD, "netbsd" }, |
||||
{ PLATFORM_OPENBSD, "openbsd" }, |
||||
{ PLATFORM_EMSCRIPTEN, "emscripten" }, |
||||
{ PLATFORM_DOS4GW, "DOS4GW" }, |
||||
{ PLATFORM_HAIKU, "haiku" }, |
||||
{ PLATFORM_SERENITY, "serenity" }, |
||||
{ PLATFORM_IRIX, "irix" }, |
||||
{ PLATFORM_NSWITCH, "nswitch" }, |
||||
{ PLATFORM_PSVITA, "psvita" }, |
||||
}; |
||||
|
||||
static struct |
||||
{ |
||||
int id; |
||||
int abi; |
||||
int endianness; |
||||
int is64; |
||||
const char *string; |
||||
} expected_architectures[] = |
||||
{ |
||||
{ ARCHITECTURE_AMD64, 0, -1, -1, "amd64" }, |
||||
{ ARCHITECTURE_X86, 0, -1, -1, "i386" }, |
||||
{ ARCHITECTURE_E2K, 0, -1, -1, "e2k" }, |
||||
{ ARCHITECTURE_JS, 0, -1, -1, "javascript" }, |
||||
|
||||
// all possible MIPS names
|
||||
{ ARCHITECTURE_MIPS, 0, ENDIANNESS_BIG, true, "mips64" }, |
||||
{ ARCHITECTURE_MIPS, 0, ENDIANNESS_BIG, false, "mips" }, |
||||
{ ARCHITECTURE_MIPS, 0, ENDIANNESS_LITTLE, true, "mips64el" }, |
||||
{ ARCHITECTURE_MIPS, 0, ENDIANNESS_LITTLE, false, "mipsel" }, |
||||
|
||||
// All ARM is little endian only (for now?)
|
||||
// Arm64 is always arm64, no matter the version (for now)
|
||||
// Arm64 don't care about hardfp bit
|
||||
{ ARCHITECTURE_ARM, 8 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, true, "arm64" }, |
||||
{ ARCHITECTURE_ARM, 8, ENDIANNESS_LITTLE, true, "arm64" }, |
||||
{ ARCHITECTURE_ARM, 0 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, true, "arm64" }, |
||||
{ ARCHITECTURE_ARM, 0, ENDIANNESS_LITTLE, true, "arm64" }, |
||||
|
||||
// ARMv6 and below don't care about hardfp bit
|
||||
{ ARCHITECTURE_ARM, 4 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv4l" }, |
||||
{ ARCHITECTURE_ARM, 4, ENDIANNESS_LITTLE, false, "armv4l" }, |
||||
{ ARCHITECTURE_ARM, 5 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv5l" }, |
||||
{ ARCHITECTURE_ARM, 5, ENDIANNESS_LITTLE, false, "armv5l" }, |
||||
{ ARCHITECTURE_ARM, 6 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv6l" }, |
||||
{ ARCHITECTURE_ARM, 6, ENDIANNESS_LITTLE, false, "armv6l" }, |
||||
{ ARCHITECTURE_ARM, 6 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv6l" }, |
||||
{ ARCHITECTURE_ARM, 6, ENDIANNESS_LITTLE, false, "armv6l" }, |
||||
|
||||
// ARMv7 and ARMv8 in 32-bit mode, hardfp bit is important
|
||||
{ ARCHITECTURE_ARM, 7 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv7hf" }, |
||||
{ ARCHITECTURE_ARM, 7, ENDIANNESS_LITTLE, false, "armv7l" }, |
||||
{ ARCHITECTURE_ARM, 8 | ARCH_ARM_HARDFP, ENDIANNESS_LITTLE, false, "armv8_32hf" }, |
||||
{ ARCHITECTURE_ARM, 8, ENDIANNESS_LITTLE, false, "armv8_32l" }, |
||||
|
||||
{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_SOFT, -1, true, "riscv64" }, |
||||
{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_SOFT, -1, false, "riscv32" }, |
||||
{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_SINGLE, -1, true, "riscv64f" }, |
||||
{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_SINGLE, -1, false, "riscv32f" }, |
||||
{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_DOUBLE, -1, true, "riscv64d" }, |
||||
{ ARCHITECTURE_RISCV, ARCH_RISCV_FP_DOUBLE, -1, false, "riscv32d" }, |
||||
}; |
||||
|
||||
static int TestPlatformString( void ) |
||||
{ |
||||
int i; |
||||
|
||||
for( i = 0; i < sizeof( expected_platforms ) / sizeof( expected_platforms[0] ); i++ ) |
||||
{ |
||||
if( Q_strcmp( Q_PlatformStringByID( expected_platforms[i].id ), expected_platforms[i].string )) |
||||
return i + 1; |
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static qboolean TestArchitectureString_NoEndianness( int id, int abi, int is64, const char *string ) |
||||
{ |
||||
return !Q_strcmp( Q_ArchitectureStringByID( id, abi, ENDIANNESS_LITTLE, is64 ), string ) && |
||||
!Q_strcmp( Q_ArchitectureStringByID( id, abi, ENDIANNESS_BIG, is64 ), string ); |
||||
} |
||||
|
||||
static qboolean TestArchitectureString_No64( int id, int abi, int endianness, const char *string ) |
||||
{ |
||||
if( endianness == -1 ) |
||||
{ |
||||
return TestArchitectureString_NoEndianness( id, abi, false, string ) && |
||||
TestArchitectureString_NoEndianness( id, abi, true, string ); |
||||
} |
||||
|
||||
return !Q_strcmp( Q_ArchitectureStringByID( id, abi, endianness, true ), string ) && |
||||
!Q_strcmp( Q_ArchitectureStringByID( id, abi, endianness, false ), string ); |
||||
} |
||||
|
||||
static int TestArchitectureString( void ) |
||||
{ |
||||
int i; |
||||
|
||||
for( i = 0; i < sizeof( expected_architectures ) / sizeof( expected_architectures[0] ); i++ ) |
||||
{ |
||||
if( expected_architectures[i].is64 == -1 ) |
||||
{ |
||||
if( !TestArchitectureString_No64( |
||||
expected_architectures[i].id, |
||||
expected_architectures[i].abi, |
||||
expected_architectures[i].endianness, |
||||
expected_architectures[i].string )) |
||||
return i + 1; |
||||
} |
||||
else if( expected_architectures[i].endianness == -1 ) |
||||
{ |
||||
if( !TestArchitectureString_NoEndianness( |
||||
expected_architectures[i].id, |
||||
expected_architectures[i].abi, |
||||
expected_architectures[i].is64, |
||||
expected_architectures[i].string )) |
||||
{ |
||||
abort(); |
||||
return i + 1; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
if( Q_strcmp( Q_ArchitectureStringByID( |
||||
expected_architectures[i].id, |
||||
expected_architectures[i].abi, |
||||
expected_architectures[i].endianness, |
||||
expected_architectures[i].is64 |
||||
), expected_architectures[i].string )) |
||||
return i + 1; |
||||
} |
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
int main( void ) |
||||
{ |
||||
int res; |
||||
|
||||
res = TestPlatformString(); |
||||
if( res != 0 ) |
||||
return res; |
||||
|
||||
res = TestArchitectureString(); |
||||
if( res != 0 ) |
||||
return res + 100; |
||||
|
||||
if( Q_buildnum_compat() != 4529 ) |
||||
return 200; |
||||
|
||||
if( Q_buildnum_date( "Apr 02 2015" ) != 1 ) |
||||
return 201; |
||||
|
||||
if( Q_buildnum_date( "Apr 17 2023" ) != 2938 ) |
||||
return 202; |
||||
|
||||
return EXIT_SUCCESS; |
||||
} |
Loading…
Reference in new issue