xash3d-fwgs/public/build.c

258 lines
5.2 KiB
C

/*
build.c - returns a engine build number
Copyright (C) 2010 Uncle Mike
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
#include "crtlib.h"
#include "buildenums.h"
static const char *mon[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
static const char mond[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int Q_buildnum_date( const char *date )
{
int b;
int m = 0;
int d = 0;
int y = 0;
for( m = 0; m < 11; m++ )
{
if( !Q_strnicmp( &date[0], mon[m], 3 ))
break;
d += mond[m];
}
d += Q_atoi( &date[4] ) - 1;
y = Q_atoi( &date[7] ) - 1900;
b = d + (int)((y - 1) * 365.25f );
if((( y % 4 ) == 0 ) && m > 1 )
{
b += 1;
}
b -= 41728; // Apr 1 2015
return b;
}
/*
===============
Q_buildnum
returns days since Apr 1 2015
===============
*/
int Q_buildnum( void )
{
static int b = 0;
if( !b )
b = Q_buildnum_date( __DATE__ );
return b;
}
/*
=============
Q_buildnum_compat
Returns a Xash3D build number. This is left for compability with original Xash3D.
IMPORTANT: this value must be changed ONLY after updating to newer Xash3D base
IMPORTANT: this value must be acquired through "build" cvar.
=============
*/
int Q_buildnum_compat( void )
{
// do not touch this! Only author of Xash3D can increase buildnumbers!
return 4529;
}
/*
============
Q_GetPlatformStringByID
Returns name of operating system by ID. Without any spaces.
TODO: add platform-dependent ABI variants, for example, different libc on Linux
============
*/
const char *Q_PlatformStringByID( const int platform )
{
switch( platform )
{
case PLATFORM_WIN32:
return "win32";
case PLATFORM_ANDROID:
return "android";
case PLATFORM_LINUX_UNKNOWN:
return "linuxunkabi";
case PLATFORM_LINUX:
return "linux";
case PLATFORM_APPLE:
return "apple";
case PLATFORM_FREEBSD:
return "freebsd";
case PLATFORM_NETBSD:
return "netbsd";
case PLATFORM_OPENBSD:
return "openbsd";
case PLATFORM_EMSCRIPTEN:
return "emscripten";
case PLATFORM_DOS4GW:
return "DOS4GW";
case PLATFORM_HAIKU:
return "haiku";
case PLATFORM_SERENITY:
return "serenity";
case PLATFORM_IRIX:
return "irix";
case PLATFORM_NSWITCH:
return "nswitch";
case PLATFORM_PSVITA:
return "psvita";
}
assert( 0 );
return "unknown";
}
/*
============
Q_buildos
Shortcut for Q_buildos_
============
*/
const char *Q_buildos( void )
{
return Q_PlatformStringByID( XASH_PLATFORM );
}
/*
============
Q_ArchitectureStringByID
Returns name of the architecture by it's ID. Without any spaces.
============
*/
const char *Q_ArchitectureStringByID( const int arch, const uint abi, const int endianness, const qboolean is64 )
{
// I don't want to change this function prototype
// and don't want to use static buffer either
// so encode all possible variants... :)
switch( arch )
{
case ARCHITECTURE_AMD64:
return "amd64";
case ARCHITECTURE_X86:
return "i386";
case ARCHITECTURE_E2K:
return "e2k";
case ARCHITECTURE_JS:
return "javascript";
case ARCHITECTURE_PPC:
return endianness == ENDIANNESS_LITTLE ?
( is64 ? "ppc64el" : "ppcel" ):
( is64 ? "ppc64" : "ppc" );
case ARCHITECTURE_MIPS:
return endianness == ENDIANNESS_LITTLE ?
( is64 ? "mips64el" : "mipsel" ):
( is64 ? "mips64" : "mips" );
case ARCHITECTURE_ARM:
// no support for big endian ARM here
if( endianness == ENDIANNESS_LITTLE )
{
const uint ver = ( abi >> ARCH_ARM_VER_SHIFT ) & ARCH_ARM_VER_MASK;
const qboolean hardfp = FBitSet( abi, ARCH_ARM_HARDFP );
if( is64 )
return "arm64"; // keep as arm64, it's not aarch64!
switch( ver )
{
case 8:
return hardfp ? "armv8_32hf" : "armv8_32l";
case 7:
return hardfp ? "armv7hf" : "armv7l";
case 6:
return "armv6l";
case 5:
return "armv5l";
case 4:
return "armv4l";
}
}
break;
case ARCHITECTURE_RISCV:
switch( abi )
{
case ARCH_RISCV_FP_SOFT:
return is64 ? "riscv64" : "riscv32";
case ARCH_RISCV_FP_SINGLE:
return is64 ? "riscv64f" : "riscv32f";
case ARCH_RISCV_FP_DOUBLE:
return is64 ? "riscv64d" : "riscv32d";
}
break;
}
assert( 0 );
return is64 ?
( endianness == ENDIANNESS_LITTLE ? "unknown64el" : "unknownel" ) :
( endianness == ENDIANNESS_LITTLE ? "unknown64be" : "unknownbe" );
}
/*
============
Q_buildarch
Returns current name of the architecture. Without any spaces.
============
*/
const char *Q_buildarch( void )
{
return Q_ArchitectureStringByID(
XASH_ARCHITECTURE,
XASH_ARCHITECTURE_ABI,
XASH_ENDIANNESS,
#if XASH_64BIT
true
#else
false
#endif
);
}
/*
=============
Q_buildcommit
Returns a short hash of current commit in VCS as string.
XASH_BUILD_COMMIT must be passed in quotes
if XASH_BUILD_COMMIT is not defined,
Q_buildcommit will identify this build as "notset"
=============
*/
const char *Q_buildcommit( void )
{
#ifdef XASH_BUILD_COMMIT
return XASH_BUILD_COMMIT;
#else
return "notset";
#endif
}