diff --git a/common/port.h b/common/port.h new file mode 100644 index 0000000..33b4e2d --- /dev/null +++ b/common/port.h @@ -0,0 +1,158 @@ +/* +port.h -- Portability Layer for Windows types +Copyright (C) 2015 Alibek Omarov + +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. +*/ + +#pragma once +#ifndef PORT_H +#define PORT_H + +#include "build.h" + +#if !XASH_WIN32 + + + #if XASH_APPLE + #include + #define OS_LIB_EXT "dylib" + #define OPEN_COMMAND "open" + #else + #define OS_LIB_EXT "so" + #define OPEN_COMMAND "xdg-open" + #endif + + #define OS_LIB_PREFIX "lib" + + #if XASH_ANDROID + //#if defined(LOAD_HARDFP) + // #define POSTFIX "_hardfp" + //#else + #define POSTFIX + //#endif + #else + #endif + + #define VGUI_SUPPORT_DLL "libvgui_support." OS_LIB_EXT + + // Windows-specific + #define _cdecl + #define __cdecl + #define __stdcall + + #define _inline static inline + #define FORCEINLINE inline __attribute__((always_inline)) + +#if XASH_POSIX + #define PATH_SPLITTER "/" + #include + #include + #define O_BINARY 0 // O_BINARY is Windows extension + #define O_TEXT 0 // O_TEXT is Windows extension + // Windows functions to posix equivalent + #define _mkdir( x ) mkdir( x, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH ) + #define LoadLibrary( x ) dlopen( x, RTLD_NOW ) + #define GetProcAddress( x, y ) dlsym( x, y ) + #define SetCurrentDirectory( x ) (!chdir( x )) + #define FreeLibrary( x ) dlclose( x ) + #define tell( a ) lseek(a, 0, SEEK_CUR) + #define HAVE_DUP +#endif + +#if XASH_DOS4GW + #define PATH_SPLITTER "\\" + #define LoadLibrary( x ) (0) + #define GetProcAddress( x, y ) (0) + #define FreeLibrary( x ) (0) + #define SetCurrentDirectory( x ) (!chdir( x )) +#endif + //#define MAKEWORD( a, b ) ((short int)(((unsigned char)(a))|(((short int)((unsigned char)(b)))<<8))) + #define max( a, b ) (((a) > (b)) ? (a) : (b)) + #define min( a, b ) (((a) < (b)) ? (a) : (b)) + + /// TODO: check if we may clean this defines, it should not appear in non-platform code! + typedef unsigned char BYTE; + typedef short int WORD; + typedef unsigned int DWORD; + typedef int LONG; + typedef unsigned int ULONG; + typedef int WPARAM; + typedef unsigned int LPARAM; + + typedef void* HANDLE; + typedef void* HMODULE; + typedef void* HINSTANCE; + + typedef char* LPSTR; + + typedef struct tagPOINT + { + int x, y; + } POINT; +#else // WIN32 + #define PATH_SPLITTER "\\" + #ifdef __MINGW32__ + #define _inline static inline + #define FORCEINLINE inline __attribute__((always_inline)) + #else + #define FORCEINLINE __forceinline + #endif + + #define open _open + #define read _read + #define alloca _alloca + + // shut-up compiler warnings + #pragma warning(disable : 4244) // MIPS + #pragma warning(disable : 4018) // signed/unsigned mismatch + #pragma warning(disable : 4305) // truncation from const double to float + #pragma warning(disable : 4115) // named type definition in parentheses + #pragma warning(disable : 4100) // unreferenced formal parameter + #pragma warning(disable : 4127) // conditional expression is constant + #pragma warning(disable : 4057) // differs in indirection to slightly different base types + #pragma warning(disable : 4201) // nonstandard extension used + #pragma warning(disable : 4706) // assignment within conditional expression + #pragma warning(disable : 4054) // type cast' : from function pointer + #pragma warning(disable : 4310) // cast truncates constant value + + #define HSPRITE WINAPI_HSPRITE + #define WIN32_LEAN_AND_MEAN + #include + #include + #undef HSPRITE + + #define OS_LIB_PREFIX "" + #define OS_LIB_EXT "dll" + #define VGUI_SUPPORT_DLL "../vgui_support." OS_LIB_EXT + #ifdef XASH_64BIT + // windows NameForFunction not implemented yet + #define XASH_ALLOW_SAVERESTORE_OFFSETS + #endif + #define HAVE_DUP + +#endif //WIN32 + +#define _forceinline FORCEINLINE + +#ifndef XASH_LOW_MEMORY +#define XASH_LOW_MEMORY 0 +#endif + +#include +#include +#include + +#if defined XASH_SDL && !defined REF_DLL +#include +#endif + +#endif // PORT_H diff --git a/public/build.h b/public/build.h new file mode 100644 index 0000000..a087c22 --- /dev/null +++ b/public/build.h @@ -0,0 +1,225 @@ +/* +build.h - compile-time build information + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to +*/ +#pragma once +#ifndef BUILD_H +#define BUILD_H + +// All XASH_* macros set by this header are guaranteed to have positive value otherwise not defined + +// Any new define must be undefined at first +// You can generate #undef list below with this oneliner: +// $ cat build.h | sed 's/\t//g' | grep '^#define XASH' | awk '{ print $2 }' | sort | uniq | awk '{ print "#undef " $1 }' +// +// So in various buildscripts you can grep for ^#undef XASH and select only second word +// or in another oneliner: +// $ cat build.h | grep '^#undef XASH' | awk '{ print $2 }' + +#undef XASH_64BIT +#undef XASH_AMD64 +#undef XASH_ANDROID +#undef XASH_APPLE +#undef XASH_ARM +#undef XASH_ARM64 +#undef XASH_ARM_HARDFP +#undef XASH_ARM_SOFTFP +#undef XASH_ARMv4 +#undef XASH_ARMv5 +#undef XASH_ARMv6 +#undef XASH_ARMv7 +//#undef XASH_BIG_ENDIAN +#undef XASH_BSD +#undef XASH_E2K +#undef XASH_EMSCRIPTEN +#undef XASH_FREEBSD +#undef XASH_IOS +#undef XASH_JS +#undef XASH_LINUX +//#undef XASH_LITTLE_ENDIAN +#undef XASH_MINGW +#undef XASH_MIPS +#undef XASH_MOBILE_PLATFORM +#undef XASH_MSVC +#undef XASH_NETBSD +#undef XASH_OPENBSD +#undef XASH_WIN32 +#undef XASH_WIN64 +#undef XASH_X86 + +//================================================================ +// +// OPERATING SYSTEM DEFINES +// +//================================================================ +#if defined(_WIN32) + #define XASH_WIN32 1 + #if defined(__MINGW32__) + #define XASH_MINGW 1 + #elif defined(_MSC_VER) + #define XASH_MSVC 1 + #endif + + #if defined(_WIN64) + #define XASH_WIN64 1 + #endif +#elif defined(__linux__) + #define XASH_LINUX 1 + #if defined(__ANDROID__) + #define XASH_ANDROID 1 + #endif // defined(__ANDROID__) + #define XASH_POSIX 1 +#elif defined(__APPLE__) + #include + #define XASH_APPLE 1 + #if TARGET_OS_IOS + #define XASH_IOS 1 + #endif // TARGET_OS_IOS + #define XASH_POSIX 1 +#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) + #define XASH_BSD 1 + #if defined(__FreeBSD__) + #define XASH_FREEBSD 1 + #elif defined(__NetBSD__) + #define XASH_NETBSD 1 + #elif defined(__OpenBSD__) + #define XASH_OPENBSD 1 + #endif + #define XASH_POSIX 1 +#elif defined __EMSCRIPTEN__ + #define XASH_EMSCRIPTEN 1 +#elif defined __WATCOMC__ && defined __DOS__ + #define XASH_DOS4GW 1 + #define XASH_LITTLE_ENDIAN +#else +#error "Place your operating system name here! If this is a mistake, try to fix conditions above and report a bug" +#endif + +#if defined XASH_ANDROID || defined XASH_IOS + #define XASH_MOBILE_PLATFORM 1 +#endif + +//================================================================ +// +// ENDIANNESS DEFINES +// +//================================================================ + +#if defined(XASH_LITTLE_ENDIAN) && defined(XASH_BIG_ENDIAN) + #error "Both XASH_LITTLE_ENDIAN and XASH_BIG_ENDIAN are defined" +#endif + +#if !defined(XASH_LITTLE_ENDIAN) && !defined(XASH_BIG_ENDIAN) + #if defined XASH_MSVC || __LITTLE_ENDIAN__ + //!!! Probably all WinNT installations runs in little endian + #define XASH_LITTLE_ENDIAN 1 + #elif __BIG_ENDIAN__ + #define XASH_BIG_ENDIAN 1 + #elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && defined(__ORDER_LITTLE_ENDIAN__) // some compilers define this + #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + #define XASH_BIG_ENDIAN 1 + #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + #define XASH_LITTLE_ENDIAN 1 + #else + #error "Unknown endianness!" + #endif + #else + #include + #if __BYTE_ORDER == __BIG_ENDIAN + #define XASH_BIG_ENDIAN 1 + #elif __BYTE_ORDER == __LITTLE_ENDIAN + #define XASH_LITTLE_ENDIAN 1 + #else + #error "Unknown endianness!" + #endif + #endif // !XASH_WIN32 +#endif + +//================================================================ +// +// CPU ARCHITECTURE DEFINES +// +//================================================================ +#if defined(__x86_64__) || defined(_M_X64) + #define XASH_64BIT 1 + #define XASH_AMD64 1 +#elif defined(__i386__) || defined(_X86_) || defined(_M_IX86) + #define XASH_X86 1 +#elif defined __aarch64__ + #define XASH_64BIT 1 + #define XASH_ARM64 1 +#elif defined __arm__ || defined _M_ARM + #if defined _M_ARM + // msvc can only armv7 ? + #define XASH_ARM 7 + #elif __ARM_ARCH == 7 || __ARM_ARCH_7__ + #define XASH_ARM 7 + #elif __ARM_ARCH == 6 || __ARM_ARCH_6__ || __ARM_ARCH_6J__ + #define XASH_ARM 6 + #elif __ARM_ARCH == 5 || __ARM_ARCH_5__ + #define XASH_ARM 5 + #elif __ARM_ARCH == 4 || __ARM_ARCH_4__ + #define XASH_ARM 4 + #else + #error "Unknown ARM" + #endif + + #if defined _M_ARM + #error "No WinMobile port yet! Need to determine which ARM float ABI msvc uses if applicable" + #endif + + #if defined __SOFTFP__ || __ARM_PCS_VFP == 0 + #define XASH_ARM_SOFTFP 1 + #else // __SOFTFP__ + #define XASH_ARM_HARDFP 1 + #endif // __SOFTFP__ +#elif defined __mips__ + #define XASH_MIPS 1 +#elif defined __EMSCRIPTEN__ + #define XASH_JS 1 +#elif defined __e2k__ + #define XASH_64BIT 1 + #define XASH_E2K 1 +#else + #error "Place your architecture name here! If this is a mistake, try to fix conditions above and report a bug" +#endif + +#if defined(XASH_WAF_DETECTED_64BIT) && !defined(XASH_64BIT) + #define XASH_64BIT 1 +#endif + +#if XASH_ARM == 7 + #define XASH_ARMv7 1 +#elif XASH_ARM == 6 + #define XASH_ARMv6 1 +#elif XASH_ARM == 5 + #define XASH_ARMv5 1 +#elif XASH_ARM == 4 + #define XASH_ARMv4 1 +#endif + +#endif // BUILD_H