From faae0bdcc7ba524815160a357531f905a5b9f22a Mon Sep 17 00:00:00 2001 From: kotofyt Date: Sun, 1 Feb 2026 17:47:49 +0200 Subject: [PATCH] made it work with new fpc --- .fpccfg | 2 + .gitmodules | 3 + appleauth/auth.cpp | 640 ------- appleauth/build.cpp | 36 - asmrigs/as/as.cpp | 132 -- asmrigs/as/main.cpp | 18 - asmrigs/brb/brb.h | 20 - asmrigs/brb/main.cpp | 395 ----- asmrigs/build.cpp | 101 -- asmrigs/libbr/Makefile | 0 asmrigs/libbr/math.s | 26 - asmrigs/tests/001.b | 4 - asmrigs/tests/001.s | 3 - asmrigs/tests/002.b | 5 - asmrigs/tests/002.s | 3 - asmrigs/tests/003.b | 5 - asmrigs/tests/004.b | 8 - asmrigs/tests/005.b | 9 - brv/brv.h | 0 brv/build.cpp | 0 brv/cbrv.h | 0 brv/modern.cpp | 0 build.cpp | 96 +- engine/__build.cpp | 15 +- engine/build.cpp | 46 +- engine/engine.cpp | 31 +- engine/gamemgr.cpp | 6 +- engine/gamewindow_sdl.cpp | 146 +- external/funnystdlib | 1 + fpc/.fpccfg | 1 - fpc/Makefile | 79 - fpc/README | 34 - fpc/apple/build.cpp | 54 - fpc/build.cpp | 160 -- fpc/buildfile/interfaces.cpp | 41 - fpc/external/build.cpp | 57 - fpc/external/zsign | 1 - fpc/generators/make/make.cpp | 0 fpc/library/android/apktool.cpp | 207 --- fpc/library/android/signtool.cpp | 23 - fpc/library/apple/appletool.cpp | 105 -- fpc/library/apple/swift.cpp | 135 -- fpc/library/builder.cpp | 131 -- fpc/library/c.cpp | 84 - fpc/library/clang/c.cpp | 284 ---- fpc/library/clang/c_clang_cl.cpp | 0 fpc/library/clang/c_libclang.cpp | 65 - fpc/library/clang/c_libclang.h | 17 - fpc/library/clang/ld.cpp | 413 ----- fpc/library/deploy.cpp | 40 - fpc/library/helper.cpp | 139 -- fpc/library/ld.cpp | 140 -- fpc/library/libfpc.cpp | 23 - fpc/library/runner.cpp | 105 -- fpc/library/swift.cpp | 81 - fpc/library/target.cpp | 257 --- fpc/library/windows/c.cpp | 155 -- fpc/library/windows/ld.cpp | 264 --- fpc/library/windows/runner.cpp | 101 -- fpc/library/windows/windres.cpp | 0 fpc/library/winerunner.cpp | 58 - fpc/main.cpp | 173 -- fpc/public/apktool.h | 45 - fpc/public/appletool.h | 33 - fpc/public/builder.h | 38 - fpc/public/c.h | 128 -- fpc/public/deploy.h | 25 - fpc/public/generator.h | 0 fpc/public/helper.h | 164 -- fpc/public/iostool.h | 26 - fpc/public/ld.h | 135 -- fpc/public/legal.h | 16 - fpc/public/lsp.h | 11 - fpc/public/obj.h | 17 - fpc/public/runner.h | 27 - fpc/public/signer.h | 11 - fpc/public/slang.h | 0 fpc/public/swift.h | 87 - fpc/public/sysrootfetch.h | 3 - fpc/public/target.h | 94 - fpc/public/temporalmgr.h | 0 fpc/public/watchmgr.h | 0 fpc/public/windres.h | 0 fpc/public/winerunner.h | 28 - fpc/sysroots/ios.cpp | 0 fpc/sysroots/macos.cpp | 0 fpc/sysroots/wdk.cpp | 0 fpc/sysroots/xcode.cpp | 10 - fpc/tests/android_build/.fpccfg | 6 - .../android_build/android_native_app_glue.c | 443 ----- .../android_build/android_native_app_glue.h | 349 ---- fpc/tests/android_build/build.cpp | 39 - fpc/tests/android_build/main.c | 40 - fpc/tests/android_build/my-release-key.jks | Bin 2550 -> 0 bytes fpc/tests/ios_build/.fpccfg | 2 - fpc/tests/ios_build/build.cpp | 29 - fpc/tests/ios_build/main.c | 6 - fpc/tests/windows_drivers_build/build.cpp | 0 fpc/tests/windows_drivers_build/main.c | 0 game/client/__build.cpp | 2 + http/build.cpp | 37 - http/client.cpp | 563 ------ http/test.cpp | 36 - .../.framework/Headers/SDL_gamepad.h | 1513 ----------------- .../funnygame.xcodeproj/project.pbxproj | 380 ----- .../contents.xcworkspacedata | 7 - .../UserInterfaceState.xcuserstate | Bin 216526 -> 0 bytes .../xcshareddata/xcschemes/funnygame.xcscheme | 80 - .../xcdebugger/Breakpoints_v2.xcbkptlist | 24 - .../xcschemes/xcschememanagement.plist | 22 - .../AccentColor.colorset/Contents.json | 11 - .../AppIcon.appiconset/Contents.json | 35 - .../funnygame/Assets.xcassets/Contents.json | 6 - ios_deploy/funnygame/funnygame/Info.plist | 18 - .../funnygame/funnygame.entitlements | 8 - launcher/__build.cpp | 79 - launcher/build.cpp | 20 + launcher/launcher.cpp | 27 +- materialsystem/__build.cpp | 45 - materialsystem/build.cpp | 38 +- materialsystem/compiledshader.cpp | 27 +- materialsystem/materialsystem.cpp | 12 +- materialsystem/vulkan/rendercontext.cpp | 111 +- materialsystem/vulkan/shader.cpp | 4 + materialsystem/vulkan/vulkan_state.h | 1 + public/appleauth/iauth.h | 32 - public/asmrigs/as.h | 14 - public/asmrigs/ld.h | 6 - public/asmrigs/tokenparser.h | 55 - public/http/http.h | 61 - public/igamewindow.h | 45 +- public/materialsystem/imaterialsystem.h | 25 +- public/tier0/commandline.h | 30 - public/tier0/lib.h | 130 -- public/tier0/mem.h | 20 - public/tier0/minmax_off.h | 9 - public/tier0/minmax_on.h | 8 - public/tier0/network.h | 21 - public/tier0/platform.h | 114 -- public/tier0/rand.h | 10 - public/tier1/appinit.h | 7 - public/tier1/ban_std.h | 5 - public/tier1/interface.h | 38 - public/tier1/unban_std.h | 5 - public/tier1/utlbuffer.h | 370 ---- public/tier1/utlinitlist.h | 64 - public/tier1/utlmap.h | 6 - public/tier1/utlmutex.h | 25 - public/tier1/utlstring.h | 275 --- public/tier1/utlvector.h | 447 ----- public/tier2/fileformats/ini.h | 33 - public/tier2/fileformats/json.h | 87 - public/tier2/fileformats/plist.h | 13 - public/tier2/fileformats/xml.h | 69 - public/tier2/iappsystem.h | 17 - public/tier2/ifilesystem.h | 73 - public/tier2/tokenizer.h | 29 - public/tier2/uuid.h | 0 public/tier3/lexer.h | 18 - shadercompiler/{__build.cpp => build.cpp} | 26 +- stdfilesystems/build.cpp | 35 - stdfilesystems/filesystem_libc.cpp | 165 -- tests/ini/build.cpp | 35 - tests/ini/initest | Bin 172032 -> 0 bytes tests/ini/main.cpp | 48 - tests/ini/test1.ini | 13 - tests/ini/test2.ini | 1 - tests/ini/test3.ini | 1 - tests/ini/test4.ini | 1 - tests/ini/test5.ini | 2 - tests/ini/test6.ini | 2 - tests/ini/test7.ini | 2 - tests/ini/test8.ini | 5 - tier0/__build.cpp | 44 - tier0/build.cpp | 33 - tier0/commandline.cpp | 85 - tier0/lib.cpp | 0 tier0/mem.cpp | 40 - tier0/network.cpp | 11 - tier0/platform.cpp | 310 ---- tier0/rand.cpp | 29 - tier1/__build.cpp | 34 - tier1/appinit.cpp | 13 - tier1/build.cpp | 32 - tier1/interface.cpp | 52 - tier1/utlbuffer.cpp | 1 - tier1/utlmap.cpp | 1 - tier1/utlmutex.cpp | 22 - tier1/utlstring.cpp | 2 - tier1/utlvector.cpp | 1 - tier2/__build.cpp | 31 - tier2/build.cpp | 33 - tier2/fileformats/ini.cpp | 335 ---- tier2/fileformats/json.cpp | 559 ------ tier2/fileformats/plist.cpp | 81 - tier2/fileformats/xml.cpp | 420 ----- tier2/filesystem.cpp | 4 - tier2/tokenizer.cpp | 130 -- tier2/uuid.cpp | 0 199 files changed, 355 insertions(+), 14541 deletions(-) create mode 100644 .fpccfg delete mode 100644 appleauth/auth.cpp delete mode 100644 appleauth/build.cpp delete mode 100644 asmrigs/as/as.cpp delete mode 100644 asmrigs/as/main.cpp delete mode 100644 asmrigs/brb/brb.h delete mode 100644 asmrigs/brb/main.cpp delete mode 100644 asmrigs/build.cpp delete mode 100644 asmrigs/libbr/Makefile delete mode 100644 asmrigs/libbr/math.s delete mode 100644 asmrigs/tests/001.b delete mode 100644 asmrigs/tests/001.s delete mode 100644 asmrigs/tests/002.b delete mode 100644 asmrigs/tests/002.s delete mode 100644 asmrigs/tests/003.b delete mode 100644 asmrigs/tests/004.b delete mode 100644 asmrigs/tests/005.b delete mode 100644 brv/brv.h delete mode 100644 brv/build.cpp delete mode 100644 brv/cbrv.h delete mode 100644 brv/modern.cpp create mode 160000 external/funnystdlib delete mode 100644 fpc/.fpccfg delete mode 100644 fpc/Makefile delete mode 100644 fpc/README delete mode 100644 fpc/apple/build.cpp delete mode 100644 fpc/build.cpp delete mode 100644 fpc/buildfile/interfaces.cpp delete mode 100644 fpc/external/build.cpp delete mode 160000 fpc/external/zsign delete mode 100644 fpc/generators/make/make.cpp delete mode 100644 fpc/library/android/apktool.cpp delete mode 100644 fpc/library/android/signtool.cpp delete mode 100644 fpc/library/apple/appletool.cpp delete mode 100644 fpc/library/apple/swift.cpp delete mode 100644 fpc/library/builder.cpp delete mode 100644 fpc/library/c.cpp delete mode 100644 fpc/library/clang/c.cpp delete mode 100644 fpc/library/clang/c_clang_cl.cpp delete mode 100644 fpc/library/clang/c_libclang.cpp delete mode 100644 fpc/library/clang/c_libclang.h delete mode 100644 fpc/library/clang/ld.cpp delete mode 100644 fpc/library/deploy.cpp delete mode 100644 fpc/library/helper.cpp delete mode 100644 fpc/library/ld.cpp delete mode 100644 fpc/library/libfpc.cpp delete mode 100644 fpc/library/runner.cpp delete mode 100644 fpc/library/swift.cpp delete mode 100644 fpc/library/target.cpp delete mode 100644 fpc/library/windows/c.cpp delete mode 100644 fpc/library/windows/ld.cpp delete mode 100644 fpc/library/windows/runner.cpp delete mode 100644 fpc/library/windows/windres.cpp delete mode 100644 fpc/library/winerunner.cpp delete mode 100644 fpc/main.cpp delete mode 100644 fpc/public/apktool.h delete mode 100644 fpc/public/appletool.h delete mode 100644 fpc/public/builder.h delete mode 100644 fpc/public/c.h delete mode 100644 fpc/public/deploy.h delete mode 100644 fpc/public/generator.h delete mode 100644 fpc/public/helper.h delete mode 100644 fpc/public/iostool.h delete mode 100644 fpc/public/ld.h delete mode 100644 fpc/public/legal.h delete mode 100644 fpc/public/lsp.h delete mode 100644 fpc/public/obj.h delete mode 100644 fpc/public/runner.h delete mode 100644 fpc/public/signer.h delete mode 100644 fpc/public/slang.h delete mode 100644 fpc/public/swift.h delete mode 100644 fpc/public/sysrootfetch.h delete mode 100644 fpc/public/target.h delete mode 100644 fpc/public/temporalmgr.h delete mode 100644 fpc/public/watchmgr.h delete mode 100644 fpc/public/windres.h delete mode 100644 fpc/public/winerunner.h delete mode 100644 fpc/sysroots/ios.cpp delete mode 100644 fpc/sysroots/macos.cpp delete mode 100644 fpc/sysroots/wdk.cpp delete mode 100644 fpc/sysroots/xcode.cpp delete mode 100644 fpc/tests/android_build/.fpccfg delete mode 100644 fpc/tests/android_build/android_native_app_glue.c delete mode 100644 fpc/tests/android_build/android_native_app_glue.h delete mode 100644 fpc/tests/android_build/build.cpp delete mode 100644 fpc/tests/android_build/main.c delete mode 100644 fpc/tests/android_build/my-release-key.jks delete mode 100644 fpc/tests/ios_build/.fpccfg delete mode 100644 fpc/tests/ios_build/build.cpp delete mode 100644 fpc/tests/ios_build/main.c delete mode 100644 fpc/tests/windows_drivers_build/build.cpp delete mode 100644 fpc/tests/windows_drivers_build/main.c delete mode 100644 http/build.cpp delete mode 100644 http/client.cpp delete mode 100644 http/test.cpp delete mode 100644 ios_deploy/funnygame/Frameworks/.framework/Headers/SDL_gamepad.h delete mode 100644 ios_deploy/funnygame/funnygame.xcodeproj/project.pbxproj delete mode 100644 ios_deploy/funnygame/funnygame.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 ios_deploy/funnygame/funnygame.xcodeproj/project.xcworkspace/xcuserdata/kotofyt.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 ios_deploy/funnygame/funnygame.xcodeproj/xcshareddata/xcschemes/funnygame.xcscheme delete mode 100644 ios_deploy/funnygame/funnygame.xcodeproj/xcuserdata/kotofyt.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist delete mode 100644 ios_deploy/funnygame/funnygame.xcodeproj/xcuserdata/kotofyt.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 ios_deploy/funnygame/funnygame/Assets.xcassets/AccentColor.colorset/Contents.json delete mode 100644 ios_deploy/funnygame/funnygame/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 ios_deploy/funnygame/funnygame/Assets.xcassets/Contents.json delete mode 100644 ios_deploy/funnygame/funnygame/Info.plist delete mode 100644 ios_deploy/funnygame/funnygame/funnygame.entitlements delete mode 100644 launcher/__build.cpp create mode 100644 launcher/build.cpp delete mode 100644 materialsystem/__build.cpp delete mode 100644 public/appleauth/iauth.h delete mode 100644 public/asmrigs/as.h delete mode 100644 public/asmrigs/ld.h delete mode 100644 public/asmrigs/tokenparser.h delete mode 100644 public/http/http.h delete mode 100644 public/tier0/commandline.h delete mode 100644 public/tier0/lib.h delete mode 100644 public/tier0/mem.h delete mode 100644 public/tier0/minmax_off.h delete mode 100644 public/tier0/minmax_on.h delete mode 100644 public/tier0/network.h delete mode 100644 public/tier0/platform.h delete mode 100644 public/tier0/rand.h delete mode 100644 public/tier1/appinit.h delete mode 100644 public/tier1/ban_std.h delete mode 100644 public/tier1/interface.h delete mode 100644 public/tier1/unban_std.h delete mode 100644 public/tier1/utlbuffer.h delete mode 100644 public/tier1/utlinitlist.h delete mode 100644 public/tier1/utlmap.h delete mode 100644 public/tier1/utlmutex.h delete mode 100644 public/tier1/utlstring.h delete mode 100644 public/tier1/utlvector.h delete mode 100644 public/tier2/fileformats/ini.h delete mode 100644 public/tier2/fileformats/json.h delete mode 100644 public/tier2/fileformats/plist.h delete mode 100644 public/tier2/fileformats/xml.h delete mode 100644 public/tier2/iappsystem.h delete mode 100644 public/tier2/ifilesystem.h delete mode 100644 public/tier2/tokenizer.h delete mode 100644 public/tier2/uuid.h delete mode 100644 public/tier3/lexer.h rename shadercompiler/{__build.cpp => build.cpp} (83%) delete mode 100644 stdfilesystems/build.cpp delete mode 100644 stdfilesystems/filesystem_libc.cpp delete mode 100644 tests/ini/build.cpp delete mode 100644 tests/ini/initest delete mode 100644 tests/ini/main.cpp delete mode 100644 tests/ini/test1.ini delete mode 100644 tests/ini/test2.ini delete mode 100644 tests/ini/test3.ini delete mode 100644 tests/ini/test4.ini delete mode 100644 tests/ini/test5.ini delete mode 100644 tests/ini/test6.ini delete mode 100644 tests/ini/test7.ini delete mode 100644 tests/ini/test8.ini delete mode 100644 tier0/__build.cpp delete mode 100644 tier0/build.cpp delete mode 100644 tier0/commandline.cpp delete mode 100644 tier0/lib.cpp delete mode 100644 tier0/mem.cpp delete mode 100644 tier0/network.cpp delete mode 100644 tier0/platform.cpp delete mode 100644 tier0/rand.cpp delete mode 100644 tier1/__build.cpp delete mode 100644 tier1/appinit.cpp delete mode 100644 tier1/build.cpp delete mode 100644 tier1/interface.cpp delete mode 100644 tier1/utlbuffer.cpp delete mode 100644 tier1/utlmap.cpp delete mode 100644 tier1/utlmutex.cpp delete mode 100644 tier1/utlstring.cpp delete mode 100644 tier1/utlvector.cpp delete mode 100644 tier2/__build.cpp delete mode 100644 tier2/build.cpp delete mode 100644 tier2/fileformats/ini.cpp delete mode 100644 tier2/fileformats/json.cpp delete mode 100644 tier2/fileformats/plist.cpp delete mode 100644 tier2/fileformats/xml.cpp delete mode 100644 tier2/filesystem.cpp delete mode 100644 tier2/tokenizer.cpp delete mode 100644 tier2/uuid.cpp diff --git a/.fpccfg b/.fpccfg new file mode 100644 index 0000000..0857ebb --- /dev/null +++ b/.fpccfg @@ -0,0 +1,2 @@ +[wasm32-unknown-wasi] +sysroot = "/home/kotofyt/Downloads/wasi-sysroot-29.0/" diff --git a/.gitmodules b/.gitmodules index be52a84..d429b95 100644 --- a/.gitmodules +++ b/.gitmodules @@ -28,3 +28,6 @@ [submodule "external/xtool"] path = external/xtool url = https://github.com/xtool-org/xtool.git +[submodule "external/funnystdlib"] + path = external/funnystdlib + url = https://github.com/KoT3isGood/funnystdlib.git diff --git a/appleauth/auth.cpp b/appleauth/auth.cpp deleted file mode 100644 index e6d8f81..0000000 --- a/appleauth/auth.cpp +++ /dev/null @@ -1,640 +0,0 @@ -#include "appleauth/iauth.h" -#include "tier2/fileformats/plist.h" -#include "http/http.h" -#include "openssl/srp.h" -#include "openssl/evp.h" -#include "openssl/sha.h" -#include "tier0/rand.h" - -IHTTPClientManager *g_pHttpClientMgr = NULL; -static int base64_decode(const char *b64, unsigned char *pOut) { - int len = strlen(b64); - if (pOut == NULL) - return (len*3)/4; - int out_len = EVP_DecodeBlock(pOut, - (const unsigned char *)b64, - len); - if (out_len < 0) - return -1; - - while (len > 0 && b64[len - 1] == '=') { - out_len--; - len--; - } - - return out_len; -} - -// autogenerated -#define APPLE_LOCAL_USER "e2e70285da39596ef06153b9c4e1e5dc8d2f983bc5cd63f5b1e292207060d931" -#define APPLE_HTTP_HEADER \ -{ \ - {"X-Apple-I-Client-Time", "2026-1-9T12:00:00"}, \ - {"X-Apple-Locale", "en_US"}, \ - {"X-Apple-I-TimeZone", "Europe/Kyiv"}, \ - {"X-Mme-Client-Info", " "}, \ - {"User-Agent", "akd/1.0 CFNetwork/808.1.4"}, \ - {"X-Apple-I-MD-LU", APPLE_LOCAL_USER}, \ - {"X-Apple-I-MD-M", "0"}, \ - {"X-Apple-I-SRL-NO", "0"}, \ - {"X-Mme-Device-Id", "0"}, \ - {"Content-Type", "text/x-xml-plist"}, \ - {"Accept", "*/*"}, \ -}; - -#define N2048 "AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73" -#define G2048 "2" -enum EPasswordType -{ - PASSWORD_TYPE_S2K, - PASSWORD_TYPE_S2K_FO, -}; - -class CAppleAuth: public IAppleAuth -{ -public: - virtual void Init() override; - virtual void Shutdown() override; - virtual void LaunchLoginDaemon() override; - virtual EAppleAuthDaemonStatus GetStatus() override; - virtual EAppleAuthStatus SubmitLoginData( const char *szEmail, const char *szPassword ) override; - virtual EAppleAuthStatus Submit2FA( const char *szCode ) override; - virtual CUtlString EncryptPassword( const char *szPassword, CUtlString szSalt, uint32_t uIters, EPasswordType eType ); - void ComputeM1( unsigned char M1[SHA256_DIGEST_LENGTH], const BIGNUM *N, const BIGNUM *g, const char *username, const char *password, const unsigned char *salt, size_t salt_len, const BIGNUM *A, const BIGNUM *B, const BIGNUM *a ); - - CUtlString FetchADIPB(); - void FetchHeaders( CUtlString szAdiPb ); - - IHTTPClient *m_pANIClient; - IHTTPClient *m_pGrandSlamClient; - - CUtlString m_szProvisionStart = "/grandslam/MidService/startMachineProvisioning"; - CUtlString m_szProvisionFinish = "/grandslam/MidService/finishMachineProvisioning"; - IJSONObject *pHeader; - - CUtlString m_szAppleIMD; - CUtlString m_szAppleIMDM; - CUtlString m_szAppleIMDRINFO; - -}; - -CUtlString CAppleAuth::FetchADIPB() -{ - - CUtlString szProvisionExpectedInputRaw = NULL; - IJSONObject *pObject = NULL; - IJSONObject *pPlistObject = NULL; - CUtlString szProvisionExpectedInput = NULL; - CUtlString szAdiPb = NULL; - - m_pANIClient = g_pHttpClientMgr->Connect("ani.sidestore.io", true, NULL); - - { - HTTPHeaderParam_t params[] = APPLE_HTTP_HEADER; - HTTPHeader_t header = { - sizeof(params)/sizeof(HTTPHeaderParam_t), - params, - }; - m_pGrandSlamClient->Get("/grandslam/GsService2/lookup", &header); - HTTPResponse_t r = m_pGrandSlamClient->GetResponse(); - if ( r.m_uCode != 200 ) - { - g_pHttpClientMgr->Disconnect(m_pANIClient); - return NULL; - } - } - - if ( !m_pANIClient->WebSocket_Connect("/v3/provisioning_session") ) - Plat_FatalErrorFunc("Failed to init AppleAuth websocket\n"); - - // Getting adipb - while ( ( szProvisionExpectedInputRaw = m_pANIClient->WebSocket_RecvText() ) != NULL ) - { - pObject = JSONManager()->ReadString(szProvisionExpectedInputRaw); - szProvisionExpectedInput = pObject->GetValue("result")->GetStringValue(); - V_printf("%s\n",szProvisionExpectedInput.GetString()); - if ( szProvisionExpectedInput == "GiveIdentifier" ) - { - m_pANIClient->WebSocket_SendText("{\"identifier\": \"" APPLE_LOCAL_USER "\"}"); - continue; - } - if ( szProvisionExpectedInput == "GiveStartProvisioningData" ) - { - const char *plist = - "\n" - "\n" - "\n" - "\n" - "\tHeader\n" - "\t\n" - "\tRequest\n" - "\t\n" - "\n" - "\n"; - - HTTPHeaderParam_t params[] = APPLE_HTTP_HEADER; - HTTPHeader_t header = { - sizeof(params)/sizeof(HTTPHeaderParam_t), - params, - }; - m_pGrandSlamClient->Post(m_szProvisionStart, &header, V_strlen(plist), plist); - HTTPResponse_t r = m_pGrandSlamClient->GetResponse(); - if ( r.m_uCode != 200 ) - { - g_pHttpClientMgr->Disconnect(m_pANIClient); - return NULL; - } - IJSONObject *pObject = PropertyListManager()->ReadString(r.m_message); - CUtlString spim = pObject->GetValue("Response")->GetObject()->GetValue("spim")->GetStringValue(); - m_pANIClient->WebSocket_SendText(CUtlString("{\"spim\": \"%s\"}", spim.GetString())); - - continue; - } - if ( szProvisionExpectedInput == "GiveEndProvisioningData" ) - { - CUtlString cpim = pObject->GetValue("cpim")->GetStringValue(); - - CUtlString plist = CUtlString( - "\n" - "\n" - "\n" - "\n" - "\tHeader\n" - "\t\n" - "\tRequest\n" - "\t\n" - "\tcpim\n" - "\t%s\n" - "\t\n" - "\n" - "\n", cpim.GetString()); - - HTTPHeaderParam_t params[] = APPLE_HTTP_HEADER; - HTTPHeader_t header = { - sizeof(params)/sizeof(HTTPHeaderParam_t), - params, - }; - m_pGrandSlamClient->Post(m_szProvisionFinish, &header, V_strlen(plist), plist); - HTTPResponse_t r = m_pGrandSlamClient->GetResponse(); - if ( r.m_uCode != 200 ) - { - g_pHttpClientMgr->Disconnect(m_pANIClient); - return NULL; - } - IJSONObject *pObject = PropertyListManager()->ReadString(r.m_message); - CUtlString tk = pObject->GetValue("Response")->GetObject()->GetValue("tk")->GetStringValue(); - CUtlString ptm = pObject->GetValue("Response")->GetObject()->GetValue("ptm")->GetStringValue(); - - V_printf("%s\n",CUtlString("{\"tk\": \"%s\", \"ptm\": \"%s\"}", tk.GetString(), ptm.GetString()).GetString()); - m_pANIClient->WebSocket_SendText(CUtlString("{\"tk\": \"%s\", \"ptm\": \"%s\"}", tk.GetString(), ptm.GetString())); - - continue; - } - if ( szProvisionExpectedInput == "ProvisioningSuccess" ) - { - szAdiPb = pObject->GetValue("adi_pb")->GetStringValue(); - g_pHttpClientMgr->Disconnect(m_pANIClient); - break; - } - if ( szProvisionExpectedInput == "Timeout" ) - { - break; - } - g_pHttpClientMgr->Disconnect(m_pANIClient); - return NULL; - } - g_pHttpClientMgr->Disconnect(m_pANIClient); - return szAdiPb; -} -void CAppleAuth::FetchHeaders( CUtlString szAdiPb ) -{ - // Get header - HTTPHeaderParam_t params[] = { - "Content-Type", "application/json", - }; - HTTPHeader_t header = { - sizeof(params)/sizeof(HTTPHeaderParam_t), - params, - }; - m_pANIClient = g_pHttpClientMgr->Connect("ani.sidestore.io", true, NULL); - CUtlString szPostData = CUtlString("{\"identifier\": \"" APPLE_LOCAL_USER "\", \"adi_pb\": \"%s\"}", szAdiPb.GetString()); - V_printf("%s\n",szPostData.GetString()); - m_pANIClient->Post("/v3/get_headers", &header, V_strlen(szPostData), szPostData); - HTTPResponse_t r = m_pANIClient->GetResponse(); - V_printf("%i\n",r.m_uCode); - if ( r.m_uCode == 200 ) - { - V_printf("%s\n",r.m_message.GetMemory()); - pHeader = JSONManager()->ReadString(r.m_message); - m_szAppleIMD = pHeader->GetValue("X-Apple-I-MD")->GetStringValue(); - m_szAppleIMDM = pHeader->GetValue("X-Apple-I-MD-M")->GetStringValue(); - m_szAppleIMDRINFO = pHeader->GetValue("X-Apple-I-MD-RINFO")->GetStringValue(); - JSONManager()->FreeObject(pHeader); - } - g_pHttpClientMgr->Disconnect(m_pANIClient); -} - -void CAppleAuth::Init() -{ - CreateInterfaceFn fnHttpFactory = Sys_GetFactory("funnyhttp"); - - g_pHttpClientMgr = (IHTTPClientManager*)fnHttpFactory(HTTP_CLIENT_INTERFACE_VERSION, NULL); - - m_pGrandSlamClient = g_pHttpClientMgr->Connect("gsa.apple.com", true, NULL); - - CUtlString szAdiPb = FetchADIPB(); - FetchHeaders(szAdiPb); - - - -} - -void CAppleAuth::Shutdown() -{ - -} - -void CAppleAuth::LaunchLoginDaemon() -{ - - -} - -EAppleAuthDaemonStatus CAppleAuth::GetStatus() -{ - return APPLE_AUTH_DAEMON_NOT_LOGGED_IN; -} - - -EAppleAuthStatus CAppleAuth::SubmitLoginData( const char *szEmail, const char *szPassword ) -{ - const char *pszUser = szEmail; - const char *pszPass = szPassword; - - BIGNUM* pN = BN_new(); - BIGNUM* pG = BN_new(); - BIGNUM* pa = BN_new(); - BIGNUM* pA = BN_new(); - BN_CTX *pbnCtx = BN_CTX_new(); - - SHA256_CTX pSha; - unsigned char pK[SHA256_DIGEST_LENGTH]; - BN_hex2bn(&pN, N2048); - BN_hex2bn(&pG, G2048); - CUtlBuffer bN; - CUtlBuffer bG; - bN = CUtlBuffer(BN_num_bytes(pN)); - bG = CUtlBuffer(BN_num_bytes(pG)); - BN_bn2bin(pN, bN.GetMemory()); - SHA256_Init(&pSha); - SHA256_Update(&pSha, bN.GetMemory(), bN.GetSize()); - SHA256_Update(&pSha, bG.GetMemory(), bG.GetSize()); - SHA256_Final(pK, &pSha); - - BN_rand(pa, 256, 0, 0); - BN_set_flags(pa, BN_FLG_CONSTTIME); - BN_mod_exp(pA, pG, pa, pN, pbnCtx); - - char *pszA = BN_bn2hex(pA); - - CUtlString plist = CUtlString( - "\n" - "\n" - "\n" - "\n" - "\tHeader\n" - "\t\n" - "\tVersion\n" - "\t1.0.1\n" - "\t\n" - - "\tRequest\n" - "\t\n" - - "\tA2k\n" - "\t%s\n" - - "\tps\n" - "\ts2ks2k_fo\n" - - "\tu\n" - "\t%s\n" - - "\to\n" - "\tinit\n" - - "\tcpd\n" - "\t\n" - - "\tX-Apple-I-Client-Time\n" - "\t2026-1-9T12:00:00Z\n" - "\tX-Apple-I-MD\n" - "\t%s\n" - "\tX-Apple-I-MD-LU\n" - "\t" APPLE_LOCAL_USER "\n" - "\tX-Apple-I-MD-M\n" - "\t%s\n" - "\tX-Apple-I-MD-RINFO\n" - "\t%s\n" - "\tX-Mme-Client-Info\n" - "\t<MacBookPro13,2> <macOS;13.1;22C65> <com.apple.AuthKit/1 (com.apple.dt.Xcode/3594.4.19)>\n" - "\tX-Apple-I-SRL-NO\n" - "\t0\n" - - - "\tbootstrap\n" - "\t\n" - - "\ticscrec\n" - "\t\n" - - - "\tpbe\n" - "\t\n" - - "\tprkgen\n" - "\t\n" - - "\tsvct\n" - "\tiCloud\n" - - "\tloc\n" - "\ten_US\n" - - "\t\n" - - "\t\n" - "\n" - "\n", pszA, szEmail, m_szAppleIMD.GetString(), m_szAppleIMDM.GetString(), m_szAppleIMDRINFO.GetString()); - HTTPHeaderParam_t params[] = { - {"Content-Type", "text/x-xml-plist"}, - {"Accept", "*/*"}, - {"User-Agent", "akd/1.0 CFNetwork/808.1.4"}, \ - {"X-Mme-Client-Info", " "}, \ - }; - HTTPHeader_t header = { - sizeof(params)/sizeof(HTTPHeaderParam_t), - params, - }; - V_printf("%s\n",plist.GetString()); - m_pGrandSlamClient->Post("/grandslam/GsService2", &header, plist.GetLenght(), plist); - HTTPResponse_t stResponse = m_pGrandSlamClient->GetResponse(); - V_printf("%i %i\n", stResponse.m_uCode, stResponse.m_bIsComplete); - if (stResponse.m_uCode != 200) - return APPLE_AUTH_FAILURE; - V_printf("%s\n",stResponse.m_message.GetMemory()); - IJSONObject *pObject = PropertyListManager()->ReadString(stResponse.m_message); - IJSONObject *pResponse = pObject->GetValue("Response")->GetObject(); - CUtlString szEncryptedPassword = EncryptPassword(szPassword, pResponse->GetValue("s")->GetStringValue(), pResponse->GetValue("i")->GetNumberValue(), PASSWORD_TYPE_S2K); - const char *szSalt = pResponse->GetValue("s")->GetStringValue(); - const char *szB = pResponse->GetValue("B")->GetStringValue(); - unsigned char salt[32]; - int iSaltLen = base64_decode(szSalt, salt); - - int iBLen = base64_decode(szB, NULL); - CUtlBuffer BBuffer = CUtlBuffer(iBLen); - iBLen = base64_decode(szB, BBuffer.GetMemory()); - BIGNUM *pB = BN_bin2bn(BBuffer.GetMemory(), BBuffer.GetSize(), NULL); - unsigned char M1[SHA256_DIGEST_LENGTH]; - ComputeM1(M1, pN, pG, szEmail, szPassword, salt, iSaltLen, pA, pB, pa); - - CUtlString szM1 = {}; - for ( int i = 0; i < SHA256_DIGEST_LENGTH; i++ ) - { - szM1.AppendTail(CUtlString("%02x", M1[i])); - } - - plist = CUtlString( - "\n" - "\n" - "\n" - "\n" - "\tHeader\n" - "\t\n" - "\tVersion\n" - "\t1.0.1\n" - "\t\n" - - "\tRequest\n" - "\t\n" - - "\tM1\n" - "\t%s\n" - - "\tc\n" - "\t%s\n" - - "\tps\n" - "\ts2ks2k_fo\n" - - "\tu\n" - "\t%s\n" - - "\to\n" - "\tcomplete\n" - - "\tcpd\n" - "\t\n" - - "\tX-Apple-I-Client-Time\n" - "\t2026-1-9T12:00:00Z\n" - "\tX-Apple-I-MD\n" - "\t%s\n" - "\tX-Apple-I-MD-LU\n" - "\t" APPLE_LOCAL_USER "\n" - "\tX-Apple-I-MD-M\n" - "\t%s\n" - "\tX-Apple-I-MD-RINFO\n" - "\t%s\n" - "\tX-Mme-Client-Info\n" - "\t<MacBookPro13,2> <macOS;13.1;22C65> <com.apple.AuthKit/1 (com.apple.dt.Xcode/3594.4.19)>\n" - "\tX-Apple-I-SRL-NO\n" - "\t0\n" - - - "\tbootstrap\n" - "\t\n" - - "\ticscrec\n" - "\t\n" - - - "\tpbe\n" - "\t\n" - - "\tprkgen\n" - "\t\n" - - "\tsvct\n" - "\tiCloud\n" - - "\tloc\n" - "\ten_US\n" - - "\t\n" - - "\t\n" - "\n" - "\n", szM1.GetString(), pResponse->GetValue("c")->GetStringValue(), szEmail, m_szAppleIMD.GetString(), m_szAppleIMDM.GetString(), m_szAppleIMDRINFO.GetString()); - V_printf("%s\n", plist.GetString()); - m_pGrandSlamClient->Post("/grandslam/GsService2", &header, plist.GetLenght(), plist); - stResponse = m_pGrandSlamClient->GetResponse(); - V_printf("%i %i\n", stResponse.m_uCode, stResponse.m_bIsComplete); - if (stResponse.m_uCode != 200) - return APPLE_AUTH_FAILURE; - V_printf("%s\n", stResponse.m_message.GetMemory()); - - g_pHttpClientMgr->Disconnect(m_pGrandSlamClient); - - - OPENSSL_free(pszA); - return APPLE_AUTH_SUCCESS; -} - -static void hash_bn_pad(unsigned char out[SHA256_DIGEST_LENGTH], const BIGNUM *bn) -{ - unsigned char buf[256]; - memset(buf, 0, sizeof(buf)); - - int len = BN_num_bytes(bn); - BN_bn2bin(bn, buf + (256 - len)); - - SHA256(buf, 256, out); -} - -void CAppleAuth::ComputeM1( - unsigned char M1[SHA256_DIGEST_LENGTH], - const BIGNUM *N, - const BIGNUM *g, - const char *username, - const char *password, - const unsigned char *salt, size_t salt_len, - const BIGNUM *A, - const BIGNUM *B, - const BIGNUM *a -) -{ - SHA256_CTX ctx; - unsigned char HN[SHA256_DIGEST_LENGTH], Hg[SHA256_DIGEST_LENGTH], HNxorg[SHA256_DIGEST_LENGTH]; - unsigned char HI[SHA256_DIGEST_LENGTH]; - - /* H(N) xor H(g) */ - hash_bn_pad(HN, N); - hash_bn_pad(Hg, g); - for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) - HNxorg[i] = HN[i] ^ Hg[i]; - - /* H(I) */ - SHA256((const unsigned char *)username, strlen(username), HI); - - /* x = H(s || H(I ":" P)) */ - unsigned char inner_hash[SHA256_DIGEST_LENGTH]; - SHA256_Init(&ctx); - SHA256_Update(&ctx, (const unsigned char *)username, strlen(username)); - SHA256_Update(&ctx, (const unsigned char *)":", 1); - SHA256_Update(&ctx, (const unsigned char *)password, strlen(password)); - SHA256_Final(inner_hash, &ctx); - - unsigned char x_hash[SHA256_DIGEST_LENGTH]; - SHA256_Init(&ctx); - SHA256_Update(&ctx, salt, salt_len); - SHA256_Update(&ctx, inner_hash, SHA256_DIGEST_LENGTH); - SHA256_Final(x_hash, &ctx); - - BIGNUM *x = BN_bin2bn(x_hash, SHA256_DIGEST_LENGTH, NULL); - - /* k = H(N || g) */ - unsigned char k_hash[SHA256_DIGEST_LENGTH]; - SHA256_Init(&ctx); - unsigned char bufN[256], bufg[256]; - memset(bufN, 0, 256); BN_bn2bin(N, bufN + (256 - BN_num_bytes(N))); - memset(bufg, 0, 256); BN_bn2bin(g, bufg + (256 - BN_num_bytes(g))); - SHA256_Update(&ctx, bufN, 256); - SHA256_Update(&ctx, bufg, 256); - SHA256_Final(k_hash, &ctx); - BIGNUM *k = BN_bin2bn(k_hash, SHA256_DIGEST_LENGTH, NULL); - - /* u = H(A || B) */ - unsigned char bufA[256], bufB[256], u_hash[SHA256_DIGEST_LENGTH]; - memset(bufA, 0, 256); BN_bn2bin(A, bufA + (256 - BN_num_bytes(A))); - memset(bufB, 0, 256); BN_bn2bin(B, bufB + (256 - BN_num_bytes(B))); - SHA256_Init(&ctx); - SHA256_Update(&ctx, bufA, 256); - SHA256_Update(&ctx, bufB, 256); - SHA256_Final(u_hash, &ctx); - BIGNUM *u = BN_bin2bn(u_hash, SHA256_DIGEST_LENGTH, NULL); - - /* S = (B - k * g^x)^(a + u * x) mod N */ - BN_CTX *bn_ctx = BN_CTX_new(); - BIGNUM *gx = BN_new(), *kgx = BN_new(), *B_sub = BN_new(); - BIGNUM *ux = BN_new(), *exp = BN_new(), *S = BN_new(); - - BN_mod_exp(gx, g, x, N, bn_ctx); /* g^x mod N */ - BN_mod_mul(kgx, k, gx, N, bn_ctx); /* k * g^x mod N */ - BN_mod_sub(B_sub, B, kgx, N, bn_ctx); /* B - k*g^x mod N */ - BN_mul(ux, u, x, bn_ctx); /* u*x */ - BN_add(exp, a, ux); /* a + u*x */ - BN_mod_exp(S, B_sub, exp, N, bn_ctx); /* S */ - - /* K = H(S) */ - unsigned char S_bytes[256]; - memset(S_bytes, 0, 256); - BN_bn2bin(S, S_bytes + (256 - BN_num_bytes(S))); - unsigned char K[SHA256_DIGEST_LENGTH]; - SHA256(S_bytes, 256, K); - - /* Compute M1 */ - SHA256_Init(&ctx); - SHA256_Update(&ctx, HNxorg, SHA256_DIGEST_LENGTH); - SHA256_Update(&ctx, HI, SHA256_DIGEST_LENGTH); - SHA256_Update(&ctx, salt, salt_len); - SHA256_Update(&ctx, bufA, 256); - SHA256_Update(&ctx, bufB, 256); - SHA256_Update(&ctx, K, SHA256_DIGEST_LENGTH); - SHA256_Final(M1, &ctx); - - /* Cleanup */ - BN_free(x); BN_free(k); BN_free(u); - BN_free(gx); BN_free(kgx); BN_free(B_sub); BN_free(ux); BN_free(exp); BN_free(S); - BN_CTX_free(bn_ctx); -} - -EAppleAuthStatus CAppleAuth::Submit2FA( const char *szCode ) -{ - -} -CUtlString CAppleAuth::EncryptPassword( const char *szPassword, CUtlString szSalt, uint32_t uIters, EPasswordType eType ) -{ - - unsigned char hashedPassword[SHA256_DIGEST_LENGTH]; - CUtlString szHashedPasswordHex = ""; - unsigned char encryptedPassword[32]; - CUtlString szEncryptedPasswordHex = ""; - unsigned char salt[32]; - int iSaltLen = base64_decode(szSalt, salt); - - if ( eType == PASSWORD_TYPE_S2K ) - { - for ( int i = 0; i < SHA256_DIGEST_LENGTH; i++ ) - { - szHashedPasswordHex.AppendTail(CUtlString("%02x", hashedPassword[i])); - } - PKCS5_PBKDF2_HMAC(szHashedPasswordHex, szHashedPasswordHex.GetLenght(), salt, iSaltLen, uIters, EVP_sha256(), 32, encryptedPassword); - }; - for ( int i = 0; i < SHA256_DIGEST_LENGTH; i++ ) - { - szEncryptedPasswordHex.AppendTail(CUtlString("%02x", encryptedPassword[i])); - } - V_printf("%s\n",szEncryptedPasswordHex.GetString()); - return szEncryptedPasswordHex; - -} - - -static CAppleAuth s_appleAuth; -EXPOSE_INTERFACE_GLOBALVAR(CAppleAuth, IAppleAuth, APPLE_AUTH_INTERFACE_VERSION, s_appleAuth); - diff --git a/appleauth/build.cpp b/appleauth/build.cpp deleted file mode 100644 index be90437..0000000 --- a/appleauth/build.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "helper.h" -#include "c.h" -#include "ld.h" -#include "tier1/utlstring.h" - -ADD_DEPENDENCY_BUILD_FILE(tier0, "../tier0/build.cpp") -ADD_DEPENDENCY_BUILD_FILE(tier1, "../tier1/build.cpp") -ADD_DEPENDENCY_BUILD_FILE(tier2, "../tier2/build.cpp") -ADD_DEPENDENCY_BUILD_FILE(http, "../http/build.cpp") - -DECLARE_BUILD_STAGE(appleauth) -{ - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - - compileProject.m_szName = "appleauth"; - compileProject.files = { - "auth.cpp" - }; - compileProject.includeDirectories = {"../public"}; - compileProject.bFPIC = true; - ldProject = ccompiler->Compile(&compileProject); - ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier1, "tier1")}); - ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier2, "tier2")}); - ldProject.libraries = { - "crypto", - }; - ldProject.linkType = ELINK_DYNAMIC_LIBRARY; - - CUtlString szOutputProject = linker->Link(&ldProject); - - ADD_OUTPUT_OBJECT("appleauth", szOutputProject) - - return 0; -}; - diff --git a/asmrigs/as/as.cpp b/asmrigs/as/as.cpp deleted file mode 100644 index 16ad5b2..0000000 --- a/asmrigs/as/as.cpp +++ /dev/null @@ -1,132 +0,0 @@ -#include "asmrigs/as.h" -#include "tier2/tokenizer.h" -#include "asmrigs/tokenparser.h" - -struct ObjectHeader_t -{ - uint8_t m_magic[4]; - uint32_t m_uSymbolCount; - uint32_t m_uDatasCount; -}; - -enum EDataFlags: uint32_t -{ - DATA_TYPE_DECLARE, - DATA_TYPE_USED, -}; - -struct Data_t -{ - uint64_t m_uDataSize; - uint64_t m_uDataOffsetSize; -}; - -struct Symbol_t -{ - uint32_t m_uName; - uint32_t m_uData; - EDataFlags m_eDataFlags; -}; - -enum EInstruction: uint8_t -{ - I_NOP = 0, - - I_PUSH = 3, - I_POP = 4, - - I_CMP = 5, - - I_JUMP = 6, - I_JZ = 7, - I_JNZ = 8, - I_JG = 9, - I_JGE = 10, - I_JLE = 11, - - I_LOAD = 12, - I_STORE = 13, - I_LOADPTR = 14, - I_STOREPTR = 15, - I_LOADLIT = 16, - - I_JSR = 20, - I_RET = 21, -}; - -CUtlBuffer Assemble( const char *szAssembly, AsOptions_t stOptions ) -{ - CUtlVector externalFunctions; - CUtlVector publicFunctions; - CUtlVector labels; - CUtlVector tokens = Tokenize(szAssembly); - Token_t *pTokens = tokens.GetData(); - for ( int i = 0; i < tokens.GetSize()-2; ) - { - if ( !tokens[i].m_bIsQuoted && tokens[i].m_szValue == "/" ) - if ( !tokens[i+1].m_bIsQuoted && tokens[i+1].m_szValue == "/" ) - if ( !tokens[i+2].m_bIsQuoted && tokens[i+2].m_szValue == "/" ) - { - tokens.RemoveAt(i, 3); - continue; - } - i++; - }; - CTokenParser parser; - parser.m_pTokens = tokens.GetData(); - parser.m_pTokensEnd = tokens.GetData()+tokens.GetSize(); - parser.m_pCurrentToken = tokens.GetData()-1; - parser.Continue(); - - CUtlVector commandStream; - - for (;;) - { - if (parser.IsEOF()) - break; - CUtlString szCommand = parser.PeekToken(); - parser.Continue(); - if ( szCommand == "extrn" ) - { - externalFunctions.AppendTail(parser.PeekToken()); - parser.Continue(); - continue; - } - if ( szCommand == "public" ) - { - publicFunctions.AppendTail(parser.PeekToken()); - parser.Continue(); - continue; - } - if ( szCommand == "store" ) - { - continue; - } - if ( szCommand == "load" ) - { - continue; - } - if ( szCommand == "jsr" ) - { - commandStream.AppendTail(I_JSR); - continue; - } - if ( szCommand == "ret" ) - { - commandStream.AppendTail(I_RET); - continue; - } - if (parser.IsEOF()) - break; - if (!V_strcmp(parser.PeekToken(), ":")) - { - parser.Continue(); - labels.AppendTail(""); - } - else - { - V_printf("%s is not a valid instuction or label\n", szCommand.GetString()); - } - } - return {}; -}; diff --git a/asmrigs/as/main.cpp b/asmrigs/as/main.cpp deleted file mode 100644 index 071aa1d..0000000 --- a/asmrigs/as/main.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "asmrigs/tokenparser.h" -#include "asmrigs/as.h" -#include "tier0/commandline.h" -#include "tier2/ifilesystem.h" -int main( int argc, char **argv ) -{ - CommandLine()->CreateCommandLine(argc, argv); - - CreateInterfaceFn filesystemFactory = Sys_GetFactory("filesystem_std"); - filesystem = (IFileSystem*)filesystemFactory(FILESYSTEM_INTERFACE_VERSION, NULL); - - IFileHandle *pFile = filesystem->Open(argv[1], FILEMODE_READ); - const char *szFileContents = filesystem->ReadString(pFile); - filesystem->Close(pFile); - - Assemble(szFileContents, {}); - return 0; -} diff --git a/asmrigs/brb/brb.h b/asmrigs/brb/brb.h deleted file mode 100644 index ee24086..0000000 --- a/asmrigs/brb/brb.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef BRB_H -#define BRB_H - -#include "tier2/tokenizer.h" -#include "tier3/lexer.h" - - -abstract_class IBGenerator -{ -public: - virtual void AddExternSymbol( const char *szName ) = 0; - virtual void DefineFunction( const char *szName ) = 0; - virtual void Load( uint8_t uRegister, int iValue ) = 0; - virtual void Return() = 0; - virtual CUtlString GetAssembly() = 0; -}; - -#define B_GENERATOR_INTERFACE_VERSION "BGenerator001" - -#endif diff --git a/asmrigs/brb/main.cpp b/asmrigs/brb/main.cpp deleted file mode 100644 index cdf6195..0000000 --- a/asmrigs/brb/main.cpp +++ /dev/null @@ -1,395 +0,0 @@ -#include "brb.h" -#include "asmrigs/tokenparser.h" -#include "tier0/commandline.h" -#include "tier2/ifilesystem.h" - -IBGenerator *g_pGenerator; - -class CBGenerator: public IBGenerator -{ -public: - virtual void AddExternSymbol( const char *szName ) override; - virtual void DefineFunction( const char *szName ) override; - virtual CUtlString GetAssembly() override; - CUtlVector m_externalSymbols; - CUtlString m_szAssembly; -}; -EXPOSE_INTERFACE(CBGenerator, IBGenerator, B_GENERATOR_INTERFACE_VERSION); - -void CBGenerator::AddExternSymbol( const char *szName ) -{ - m_externalSymbols.AppendTail(szName); -} - -void CBGenerator::DefineFunction( const char *szName ) -{ - m_szAssembly.AppendTail(CUtlString("public %s\n", szName)); - m_szAssembly.AppendTail(CUtlString("%s:\n", szName)); -} - -CUtlString CBGenerator::GetAssembly() -{ - return m_szAssembly; -} - -void CompileErrorExpectedToken( Token_t *pToken, const char *szToken ) -{ - if (pToken->m_bIsQuoted) - V_printf("%d:%d: expected %s but got string literal\n", pToken->m_iLine, pToken->m_iCharacter, szToken); - else - V_printf("%d:%d: expected %s but got %s\n", pToken->m_iLine, pToken->m_iCharacter, szToken, pToken->m_szValue.GetString()); - exit(1); -} - -void CompileErrorUnexpectedToken( Token_t *pToken ) -{ - if (pToken->m_bIsQuoted) - V_printf("%d:%d: unexpected string literal\n", pToken->m_iLine, pToken->m_iCharacter ); - else - V_printf("%d:%d: unexpected %s\n", pToken->m_iLine, pToken->m_iCharacter, pToken->m_szValue.GetString()); - exit(1); -} -void CompileErrorGotRValue( Token_t *pToken ) -{ - V_printf("%d:%d: got rvalue when expected lvalue\n", pToken->m_iLine, pToken->m_iCharacter ); - exit(1); -} - -enum EBValueType -{ - EBVALUE_TYPE_UNKNOWN, - EBVALUE_TYPE_INT_LITERAL, - EBVALUE_TYPE_VARIABLE, -}; - -struct BValue_t -{ - enum EBValueType m_eType; - int m_iLiteral; - const char *m_szVarName; -}; - -enum EBValueNodeOp -{ - EBVALUE_OP_NOTHING, - EBVALUE_OP_VALUE, - EBVALUE_OP_READ_PTR, - EBVALUE_OP_GET_PTR, - EBVALUE_OP_ADD, - EBVALUE_OP_SUB, - EBVALUE_OP_MUL, - EBVALUE_OP_DIV, - EBVALUE_OP_PARENTHESIS, - EBVALUE_OP_NEG, - EBVALUE_OP_NOT, -}; - -struct Node_t -{ - BValue_t m_value; - struct Node_t *m_pLeftValue; - struct Node_t *m_pRightValue; - EBValueNodeOp m_eOp; -}; - -struct ScopeVariable_t -{ - const char *szName; -}; - - -BValue_t ParseVar( CTokenParser *pParser ) -{ - const char *szToken = pParser->PeekToken(); - - if (V_isdigit(szToken[0])) - { - pParser->Continue(); - return {EBVALUE_TYPE_INT_LITERAL, atoi(szToken)}; - } - pParser->Continue(); - return {EBVALUE_TYPE_VARIABLE, 0, szToken}; -}; -Node_t *ParseExpr( CTokenParser *pParser ); -void ParseRValue( CTokenParser *pParser ); -Node_t *ParsePrimary( CTokenParser *pParser ) -{ - Node_t *pNode; - if (pParser->IsToken("(")) - { - pParser->Continue(); - pNode = ParseExpr(pParser); - if (!pParser->IsToken(")")) - CompileErrorExpectedToken(pParser->m_pCurrentToken, ")"); - pParser->Continue(); - goto lvalue; - } - pNode = new Node_t(); - pNode->m_eOp = EBVALUE_OP_VALUE; - pNode->m_value = ParseVar( pParser ); -lvalue: - if (pParser->IsToken("=")) - { - if (pNode->m_eOp == EBVALUE_OP_VALUE) - { - if ( pNode->m_value.m_eType == EBVALUE_TYPE_VARIABLE ) - goto confirmedlvalue; - }; - CompileErrorGotRValue(pParser->m_pCurrentToken); -confirmedlvalue: - pParser->Continue(); - ParseRValue(pParser); - }; - - return pNode; -} -Node_t *ParseUnary( CTokenParser *pParser ) -{ - return ParsePrimary(pParser); -} -Node_t *ParseTerm( CTokenParser *pParser ) -{ - Node_t *pNode; - Node_t *pNewNode; - - EBValueNodeOp eOp = EBVALUE_OP_NOTHING; - pNode = new Node_t(); - for (;;) - { - if (pParser->IsToken("*")) - { - pParser->Continue(); - eOp = EBVALUE_OP_MUL; - } - else if (pParser->IsToken("/")) - { - pParser->Continue(); - eOp = EBVALUE_OP_DIV; - } - else - { - pNode->m_eOp = eOp; - if (pNode->m_pLeftValue == NULL) - pNode->m_pLeftValue = ParseUnary(pParser); - else - { - if (eOp == EBVALUE_OP_NOTHING) - break; - eOp = EBVALUE_OP_NOTHING; - pNode->m_pRightValue = ParseUnary(pParser); - pNewNode = new Node_t(); - pNewNode->m_pLeftValue = pNode; - pNode = pNewNode; - } - } - } - if (pNode->m_pRightValue == NULL) - { - pNewNode = pNode->m_pLeftValue; - delete pNode; - return pNewNode; - } - return pNode; -} - -Node_t *ParseExpr( CTokenParser *pParser ) -{ - Node_t *pNode; - Node_t *pNewNode; - - EBValueNodeOp eOp = EBVALUE_OP_NOTHING; - pNode = new Node_t(); - for (;;) - { - if (pParser->IsToken("+")) - { - pParser->Continue(); - eOp = EBVALUE_OP_ADD; - } - else if (pParser->IsToken("-")) - { - pParser->Continue(); - eOp = EBVALUE_OP_SUB; - } - else - { - pNode->m_eOp = eOp; - if (pNode->m_pLeftValue == NULL) - pNode->m_pLeftValue = ParseTerm(pParser); - else - { - if (eOp == EBVALUE_OP_NOTHING) - break; - eOp = EBVALUE_OP_NOTHING; - pNode->m_pRightValue = ParseTerm(pParser); - pNewNode = new Node_t(); - pNewNode->m_pLeftValue = pNode; - pNode = pNewNode; - } - } - } - if (pNode->m_pRightValue == NULL) - { - pNewNode = pNode->m_pLeftValue; - delete pNode; - return pNewNode; - } - return pNode; -} - -void PrintExpr( Node_t *pNode ) -{ - if ( pNode->m_eOp == EBVALUE_OP_VALUE ) - { - switch ( pNode->m_value.m_eType ) - { - case EBVALUE_TYPE_INT_LITERAL: - V_printf("%i\n", pNode->m_value.m_iLiteral); - break; - case EBVALUE_TYPE_VARIABLE: - V_printf("%s\n", pNode->m_value.m_szVarName); - break; - - } - } else { - if (pNode->m_pLeftValue) - PrintExpr(pNode->m_pLeftValue); - if (pNode->m_pRightValue) - PrintExpr(pNode->m_pRightValue); - if (pNode->m_eOp == EBVALUE_OP_ADD) - V_printf("+\n"); - if (pNode->m_eOp == EBVALUE_OP_SUB) - V_printf("-\n"); - if (pNode->m_eOp == EBVALUE_OP_MUL) - V_printf("*\n"); - if (pNode->m_eOp == EBVALUE_OP_DIV) - V_printf("/\n"); - } -} - -void ParseRValue( CTokenParser *pParser ) -{ - PrintExpr(ParseExpr( pParser )); -} - -void ParseStatement( CTokenParser *pParser ) -{ - if (pParser->IsToken("return")) - { - pParser->Continue(); - ParseRValue( pParser ); - if (!pParser->IsToken(";")) - CompileErrorExpectedToken(pParser->m_pCurrentToken, ";"); - V_printf(" ret\n"); - pParser->Continue(); - } - else if (pParser->IsToken("extrn")) - { - pParser->Continue(); - for (;;) - { - const char *szName = pParser->PeekToken(); - pParser->Continue(); - if (pParser->IsToken(",")) - { - pParser->Continue(); - continue; - } - if (pParser->IsToken(";")) - { - pParser->Continue(); - break; - } - CompileErrorUnexpectedToken(pParser->m_pCurrentToken); - }; - } - else if (pParser->IsToken("auto")) - { - pParser->Continue(); - for (;;) - { - const char *szName = pParser->PeekToken(); - pParser->Continue(); - if (pParser->IsToken(",")) - { - pParser->Continue(); - continue; - } - if (pParser->IsToken(";")) - { - pParser->Continue(); - break; - } - CompileErrorUnexpectedToken(pParser->m_pCurrentToken); - }; - } - else - { - ParseRValue(pParser); - if (!pParser->IsToken(";")) - CompileErrorExpectedToken(pParser->m_pCurrentToken, ";"); - pParser->Continue(); - }; - -} - -void ParseGlobal( CTokenParser *pParser ) -{ - - for (;;) - { - if (pParser->IsEOF()) - break; - const char *szObjectName = pParser->PeekToken(); - pParser->Continue(); - - if (pParser->IsToken("(")) - { - pParser->Continue(); - if (!pParser->IsToken(")")) - CompileErrorExpectedToken(pParser->m_pCurrentToken, ")"); - pParser->Continue(); - g_pGenerator->DefineFunction(szObjectName); - - if (!pParser->IsToken("{")) - CompileErrorExpectedToken(pParser->m_pCurrentToken, "{"); - pParser->Continue(); - while (!pParser->IsToken("}")) - { - ParseStatement( pParser ); - } - pParser->Continue(); - } - else - { - CompileErrorExpectedToken(pParser->m_pCurrentToken, "("); - } - } - V_printf("%s\n", g_pGenerator->GetAssembly().GetString()); -}; - - -int main( int argc, char **argv ) -{ - CommandLine()->CreateCommandLine(argc, argv); - - CreateInterfaceFn filesystemFactory = Sys_GetFactory("filesystem_std"); - filesystem = (IFileSystem*)filesystemFactory(FILESYSTEM_INTERFACE_VERSION, NULL); - - IFileHandle *pFile = filesystem->Open(argv[1], FILEMODE_READ); - const char *szFileContents = filesystem->ReadString(pFile); - filesystem->Close(pFile); - - g_pGenerator = (IBGenerator*)CreateInterface(B_GENERATOR_INTERFACE_VERSION, NULL); - - - CUtlVector tokens = Tokenize(szFileContents); - CTokenParser parser; - parser.m_pTokens = tokens.GetData(); - parser.m_pTokensEnd = tokens.GetData()+tokens.GetSize(); - parser.m_pCurrentToken = tokens.GetData()-1; - parser.Continue(); - ParseGlobal(&parser); - - V_free((void*)szFileContents); -} diff --git a/asmrigs/build.cpp b/asmrigs/build.cpp deleted file mode 100644 index 6e30724..0000000 --- a/asmrigs/build.cpp +++ /dev/null @@ -1,101 +0,0 @@ -#include "c.h" -#include "ld.h" -#include "helper.h" - -ADD_DEPENDENCY_BUILD_FILE(tier0, "../tier0/build.cpp") -ADD_DEPENDENCY_BUILD_FILE(tier1, "../tier1/build.cpp") -ADD_DEPENDENCY_BUILD_FILE(tier2, "../tier2/build.cpp") -ADD_DEPENDENCY_BUILD_FILE(fs, "../stdfilesystems/build.cpp") - - -DECLARE_BUILD_STAGE(libbras) -{ - CProject_t stProject = {}; - LinkProject_t stLink = {}; - CUtlString szBuiltFile = {}; - - stProject.m_szName = "bras"; - stProject.files = { - "as/as.cpp", - }; - stProject.includeDirectories = { - "../public" - }; - - stLink = ccompiler->Compile(&stProject); - stLink.linkType = ELINK_STATIC_LIBRARY; - stLink.libraryObjects = { - GET_PROJECT_LIBRARY(tier0, "tier0"), - GET_PROJECT_LIBRARY(tier1, "tier1"), - GET_PROJECT_LIBRARY(tier2, "tier2"), - }; - szBuiltFile = linker->Link(&stLink); - ADD_OUTPUT_OBJECT("bras", szBuiltFile); - - return 0; -}; - -DECLARE_BUILD_STAGE(bras) -{ - CProject_t stProject = {}; - LinkProject_t stLink = {}; - CUtlString szBuiltFile = {}; - - stProject.m_szName = "bras"; - stProject.files = { - "as/main.cpp", - }; - stProject.includeDirectories = { - "../public" - }; - - stLink = ccompiler->Compile(&stProject); - stLink.libraryObjects = { - GET_PROJECT_LIBRARY(libbras, "bras"), - GET_PROJECT_LIBRARY(tier0, "tier0"), - GET_PROJECT_LIBRARY(tier1, "tier1"), - GET_PROJECT_LIBRARY(tier2, "tier2"), - }; - szBuiltFile = linker->Link(&stLink); - ADD_OUTPUT_OBJECT("bras", szBuiltFile); - - return 0; -}; - -DECLARE_BUILD_STAGE(brb) -{ - CProject_t stProject = {}; - LinkProject_t stLink = {}; - CUtlString szBuiltFile = {}; - - stProject.m_szName = "bc"; - stProject.files = { - "brb/main.cpp", - }; - stProject.includeDirectories = { - "../public" - }; - - stLink = ccompiler->Compile(&stProject); - stLink.libraryObjects = { - GET_PROJECT_LIBRARY(libbras, "bras"), - GET_PROJECT_LIBRARY(tier0, "tier0"), - GET_PROJECT_LIBRARY(tier1, "tier1"), - GET_PROJECT_LIBRARY(tier2, "tier2"), - }; - szBuiltFile = linker->Link(&stLink); - ADD_OUTPUT_OBJECT("bc", szBuiltFile); - - return 0; -}; - -DECLARE_BUILD_STAGE(install) -{ - CUtlString szBuildOutput = CUtlString("build/%s", Target_t::DefaultTarget().GetTriplet().GetString()); - filesystem2->MakeDirectory(szBuildOutput); - filesystem2->CopyFile(szBuildOutput, GET_PROJECT_OBJECT(brb, "bc")); - filesystem2->CopyFile(szBuildOutput, GET_PROJECT_OBJECT(bras, "bras")); - filesystem2->CopyFile(szBuildOutput, GET_PROJECT_LIBRARY(tier0, "tier0")); - filesystem2->CopyFile(szBuildOutput, GET_PROJECT_LIBRARY(filesystem_std, "fs")); - return 0; -} diff --git a/asmrigs/libbr/Makefile b/asmrigs/libbr/Makefile deleted file mode 100644 index e69de29..0000000 diff --git a/asmrigs/libbr/math.s b/asmrigs/libbr/math.s deleted file mode 100644 index d61e6ce..0000000 --- a/asmrigs/libbr/math.s +++ /dev/null @@ -1,26 +0,0 @@ -public min -min: - pop b - pop c - min a, b, c - ret - -public max -max: - pop b - pop c - max a, b, c - ret - -public abs -abs: - pop b - abs a, b, c - ret - -public sign -sign: - pop b - sign a, b - ret - diff --git a/asmrigs/tests/001.b b/asmrigs/tests/001.b deleted file mode 100644 index 47fcd70..0000000 --- a/asmrigs/tests/001.b +++ /dev/null @@ -1,4 +0,0 @@ -_tick() -{ - -} diff --git a/asmrigs/tests/001.s b/asmrigs/tests/001.s deleted file mode 100644 index 564452e..0000000 --- a/asmrigs/tests/001.s +++ /dev/null @@ -1,3 +0,0 @@ -public _tick -_tick: - ret diff --git a/asmrigs/tests/002.b b/asmrigs/tests/002.b deleted file mode 100644 index 34bea15..0000000 --- a/asmrigs/tests/002.b +++ /dev/null @@ -1,5 +0,0 @@ -_tick() -{ - extrn a; - a = 30; -} diff --git a/asmrigs/tests/002.s b/asmrigs/tests/002.s deleted file mode 100644 index 564452e..0000000 --- a/asmrigs/tests/002.s +++ /dev/null @@ -1,3 +0,0 @@ -public _tick -_tick: - ret diff --git a/asmrigs/tests/003.b b/asmrigs/tests/003.b deleted file mode 100644 index 203337e..0000000 --- a/asmrigs/tests/003.b +++ /dev/null @@ -1,5 +0,0 @@ -_tick() -{ - extrn a; - a = 1 + 2 * 3 * ( 4 + 5 ); -} diff --git a/asmrigs/tests/004.b b/asmrigs/tests/004.b deleted file mode 100644 index 65dec45..0000000 --- a/asmrigs/tests/004.b +++ /dev/null @@ -1,8 +0,0 @@ -main() -{ - extrn something; - auto a, b; - a = 10; - b = a + 5; - return b; -} diff --git a/asmrigs/tests/005.b b/asmrigs/tests/005.b deleted file mode 100644 index d562b56..0000000 --- a/asmrigs/tests/005.b +++ /dev/null @@ -1,9 +0,0 @@ -add(a,b) -{ - return a + b; -} - -main() -{ - return add(2,3); -} diff --git a/brv/brv.h b/brv/brv.h deleted file mode 100644 index e69de29..0000000 diff --git a/brv/build.cpp b/brv/build.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/brv/cbrv.h b/brv/cbrv.h deleted file mode 100644 index e69de29..0000000 diff --git a/brv/modern.cpp b/brv/modern.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/build.cpp b/build.cpp index 09df40a..6bbfab3 100755 --- a/build.cpp +++ b/build.cpp @@ -2,88 +2,26 @@ #include "helper.h" #include "tier1/utlstring.h" - -CUtlVector all_IncludeDirectories = { - "public", - "external", - "external/Vulkan-Headers/include", - "external/Vulkan-Utility-Libraries/include", - "external/volk", - "external/cglm/include", - "external/stb", - "external/SDL/include", - "external/steamworks/public", - "external/GameNetworkingSockets/include", -}; - auto szTarget = Target_t::DefaultTarget().GetTriplet(); -auto szOutputDir = CUtlString("build/funnygame/%s/game",szTarget.GetString()); +auto szOutputDir = CUtlString("build/funnygame/%s/game", szTarget.GetString()); -bool bStaticBuild = false; -bool bSteam = false; -CUtlString steam_lib; +ADD_DEPENDENCY_BUILD_FILE(launcher, "launcher/build.cpp"); +ADD_DEPENDENCY_BUILD_FILE(engine, "engine/build.cpp"); +ADD_DEPENDENCY_BUILD_FILE(ms, "materialsystem/build.cpp"); +ADD_DEPENDENCY_BUILD_FILE(fs, "external/funnystdlib/stdfilesystems/build.cpp"); +ADD_DEPENDENCY_BUILD_FILE(tier0, "external/funnystdlib/tier0/build.cpp"); -extern "C" void Preinit() +DECLARE_BUILD_STAGE(install) { - if (Target_t::DefaultTarget().kernel == TARGET_KERNEL_IOS || Target_t::DefaultTarget().kernel == TARGET_KERNEL_WINDOWS) + filesystem2->MakeDirectory(szOutputDir); + filesystem2->CopyFile(szOutputDir, GET_PROJECT_OBJECT(launcher, "launcher")); + filesystem2->CopyFile(szOutputDir, GET_PROJECT_OBJECT(engine, "engine")); + filesystem2->CopyFile(szOutputDir, GET_PROJECT_OBJECT(MaterialSystem, "MaterialSystem")); + filesystem2->CopyFile(szOutputDir, GET_PROJECT_OBJECT(RenderSystemVulkan, "RenderSystemVulkan")); + filesystem2->CopyFile(szOutputDir, GET_PROJECT_OBJECT(tier0, "tier0")); + filesystem2->CopyFile(szOutputDir, GET_PROJECT_OBJECT(filesystem_std, "fs")); + if (Target_t::DefaultTarget().kernel & TARGET_KERNEL_WINDOWS_DEVICES) { - bStaticBuild = true; } - - if (Target_t::DefaultTarget().kernel == TARGET_KERNEL_IOS || Target_t::DefaultTarget().kernel == TARGET_KERNEL_DARWIN) - { - all_IncludeDirectories.AppendTail("external/metal-cpp"); - } else { - all_IncludeDirectories.AppendTail("external/Vulkan-Headers/include"); - all_IncludeDirectories.AppendTail("external/VulkanMemoryAllocator/include"); - } - switch ( Target_t::DefaultTarget().kernel ) - { - case TARGET_KERNEL_WINDOWS: - bSteam = true; - steam_lib = "external/steamworks/redistributable_bin/win64/steam_api64.dll"; - break; - case TARGET_KERNEL_LINUX: - bSteam = true; - steam_lib = "external/steamworks/redistributable_bin/linux64/libsteam_api.so"; - break; - case TARGET_KERNEL_DARWIN: - bSteam = true; - break; - default: - break; - } - if (bSteam) - { - if (bStaticBuild) - { - filesystem2->MakeDirectory(CUtlString("%s/bin", szOutputDir.GetString())); - filesystem2->CopyFile(CUtlString("%s/bin", szOutputDir.GetString()), steam_lib); - } else - { - filesystem2->MakeDirectory(CUtlString("%s/bin", szOutputDir.GetString())); - filesystem2->CopyFile(CUtlString("%s/bin", szOutputDir.GetString()), steam_lib); - } - } -}; - -CUtlString tier0_lib; -CUtlString engine_lib; -CUtlString server_lib; -CUtlString client_lib; - -#include "tier0/__build.cpp" -#include "tier1/__build.cpp" -#include "tier2/__build.cpp" - -#include "game/server/__build.cpp" -#include "game/client/__build.cpp" - -#include "materialsystem/__build.cpp" - -#include "rapier/__build.cpp" -#include "engine/__build.cpp" -#include "shadercompiler/__build.cpp" - -#include "launcher/__build.cpp" -#include "funnyassets/__build.cpp" + return 0; +} diff --git a/engine/__build.cpp b/engine/__build.cpp index 3c3eb22..14b95e8 100644 --- a/engine/__build.cpp +++ b/engine/__build.cpp @@ -2,7 +2,6 @@ #include "c.h" #include "ld.h" #include "tier1/utlstring.h" -#include "tier1/commandline.h" CUtlVector engine_CompiledFiles = { "engine/engine.cpp", @@ -27,10 +26,11 @@ DECLARE_BUILD_STAGE(engine) compileProject.m_szName = "engine"; compileProject.files = engine_CompiledFiles; - compileProject.includeDirectories = all_IncludeDirectories; + compileProject.includeDirectories = {"public"}; compileProject.bFPIC = true; ldProject = ccompiler->Compile(&compileProject); + /* if (bStaticBuild) ldProject.linkType = ELINK_STATIC_LIBRARY; else @@ -41,20 +41,25 @@ DECLARE_BUILD_STAGE(engine) ldProject.objects.AppendTail((Object_t){material_lib}); if (bSteam) ldProject.objects.AppendTail((Object_t){steam_lib}); - ldProject.linkType = ELINK_DYNAMIC_LIBRARY; } + */ + ldProject.linkType = ELINK_DYNAMIC_LIBRARY; ldProject.libraries = engine_Libraries; - CUtlString outputProject = linker->Link(&ldProject); + CUtlString szOutputDir = linker->Link(&ldProject); + /* if (!bStaticBuild) { + */ filesystem2->MakeDirectory(CUtlString("%s/bin",szOutputDir.GetString())); - filesystem2->CopyFile(CUtlString("%s/bin", szOutputDir.GetString()), outputProject); + filesystem2->CopyFile(CUtlString("%s/bin", szOutputDir.GetString()), szOutputDir); + /* } else { engine_lib = outputProject; } + */ return 0; }; diff --git a/engine/build.cpp b/engine/build.cpp index 686fe2b..52fe9d7 100644 --- a/engine/build.cpp +++ b/engine/build.cpp @@ -2,15 +2,20 @@ #include "c.h" #include "ld.h" #include "tier1/utlstring.h" -#include "tier1/commandline.h" -ADD_DEPENDENCY_BUILD_FILE(MaterialSystem, "../materialsystem/") -ADD_DEPENDENCY_BUILD_FILE(tier0, "../tier0/"); -ADD_DEPENDENCY_BUILD_FILE(tier1, "../tier1/"); -ADD_DEPENDENCY_BUILD_FILE(tier2, "../tier2/"); +#define FUNNYSTDLIB "../external/funnystdlib/" +ADD_DEPENDENCY_BUILD_FILE(MaterialSystem, "../materialsystem/build.cpp") +ADD_DEPENDENCY_BUILD_FILE(tier0, FUNNYSTDLIB"tier0/build.cpp"); +ADD_DEPENDENCY_BUILD_FILE(tier1, FUNNYSTDLIB"tier1/build.cpp"); +ADD_DEPENDENCY_BUILD_FILE(tier2, FUNNYSTDLIB"tier2/build.cpp"); DECLARE_BUILD_STAGE(engine) { + bool bUsesSDL = true; + if (Target_t::DefaultTarget().cpu == TARGET_CPU_WASM32) + { + bUsesSDL = false; + } CProject_t compileProject = {}; LinkProject_t ldProject = {}; @@ -19,14 +24,16 @@ DECLARE_BUILD_STAGE(engine) "engine.cpp", "cvar.cpp", - "gamewindow_sdl.cpp", - "sv_dll.cpp", "cl_dll.cpp", }; + if (bUsesSDL) + compileProject.files.AppendTail("gamewindow_sdl.cpp"); + compileProject.includeDirectories = { "../public", "../external/SDL/include", + FUNNYSTDLIB"public", }; compileProject.bFPIC = true; ldProject = ccompiler->Compile(&compileProject); @@ -34,12 +41,29 @@ DECLARE_BUILD_STAGE(engine) ldProject.linkType = ELINK_DYNAMIC_LIBRARY; ldProject.libraryObjects = { - GET_PROJECT_LIBRARY("tier1", "tier1"), - GET_PROJECT_LIBRARY("tier2", "tier2"), + GET_PROJECT_LIBRARY(tier0, "tier0"), }; - ldProject.libraries = { - "SDL3" + ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier1, "tier1")}); + ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier2, "tier2")}); + + if (bUsesSDL) + ldProject.libraries.AppendTail("SDL3"); + if (ldProject.m_target.kernel & TARGET_KERNEL_WINDOWS_DEVICES) + { + ldProject.libraryDirectories = {"../external/windows"}; + ldProject.libraries.AppendTail("winpthread-1"); + ldProject.libraries.AppendTail("winmm"); + ldProject.libraries.AppendTail("ole32"); + ldProject.libraries.AppendTail("gdi32"); + ldProject.libraries.AppendTail("oleaut32"); + ldProject.libraries.AppendTail("setupapi"); + ldProject.libraries.AppendTail("imm32"); + ldProject.libraries.AppendTail("version"); + ldProject.libraries.AppendTail("shell32"); + ldProject.libraries.AppendTail("uuid"); + }; + CUtlString outputProject = linker->Link(&ldProject); ADD_OUTPUT_OBJECT("engine", outputProject) diff --git a/engine/engine.cpp b/engine/engine.cpp index ec38140..8a5cfbb 100644 --- a/engine/engine.cpp +++ b/engine/engine.cpp @@ -3,22 +3,26 @@ #include "igamewindow.h" #include "materialsystem/imaterialsystem.h" #include "tier1/interface.h" -#include "tier1/commandline.h" +#include "tier0/commandline.h" #include "tier0/mem.h" #include "sv_dll.h" +IRenderContext *g_pRenderContext; +IFileSystem *filesystem; + extern "C" void FunnyMain( int argc, char **argv ) { CommandLine()->CreateCommandLine(argc, argv); - void *pFilesystem = Plat_LoadLibrary("libfilesystem.so"); - CreateInterfaceFn pFilesystemFactory = Sys_GetFactory(pFilesystem); + CreateInterfaceFn pFilesystemFactory = Sys_GetFactory("filesystem_std"); filesystem = (IFileSystem*)pFilesystemFactory(FILESYSTEM_INTERFACE_VERSION, NULL); filesystem->Init(); - gamewindow->Init(); - g_pMaterialSystem->Init(); + CreateInterfaceFn pMaterialSystemFactory = Sys_GetFactory("MaterialSystem"); + CreateInterfaceFn pRenderSystemFactory = Sys_GetFactory("RenderSystemVulkan"); + g_pRenderContext = (IRenderContext*)pRenderSystemFactory(RENDER_CONTEXT_INTERFACE_VERSION, NULL); + g_pRenderContext->Init(); ServerGameDLL()->Init(); @@ -43,26 +47,25 @@ extern "C" void FunnyMain( int argc, char **argv ) pCameraInfoBuffer = g_pRenderContext->CreateConstantBuffer(64); + /* pShader = g_pRenderContext->CreateShader("funnygame/core/shaders/flat.shader_c"); pMaterial = g_pRenderContext->CreateMaterial(pShader); pMaterial->PSSetConstantsBuffer(0, pCameraInfoBuffer); + */ pOutputImage = g_pRenderContext->CreateRenderTarget( - g_pRenderContext->GetNewOutputImageWidth(), - g_pRenderContext->GetNewOutputImageHeight(), + 1280, + 720, IMAGE_FORMAT_RGBA8_UNORM, MULTISAMPLE_TYPE_NONE); IRenderCommandList *pCommandList = g_pRenderContext->CreateCommandList(); pCommandList->StartRecording(); pCommandList->SetRenderTarget(0, pOutputImage); - pCommandList->SetMaterial(pMaterial); - pCommandList->SetVertexBuffer(0, pVertices); - pCommandList->DrawPrimitives(3, 0, 1, 0); + pCommandList->SetClearColor(0, 1,0,0,0); pCommandList->EndRecording(); for (;;) { - gamewindow->UpdateWindow(); /* if (g_pRenderContext->BIsOutputImageOutdated()) { @@ -77,11 +80,7 @@ extern "C" void FunnyMain( int argc, char **argv ) */ g_pRenderContext->SubmitCommandList(pCommandList); - - g_pRenderContext->SetOutputImage(pOutputImage); - - gamewindow->UpdateWindow(); - Materials()->Frame(0); + g_pRenderContext->Frame(0); }; }; diff --git a/engine/gamemgr.cpp b/engine/gamemgr.cpp index a0effa6..43e4ac6 100644 --- a/engine/gamemgr.cpp +++ b/engine/gamemgr.cpp @@ -36,9 +36,9 @@ void CGameManager::Init() CUtlString sz; pFile = filesystem->Open("game.ini", FILEMODE_READ); - szData = CUtlBuffer(pFile->Size()); - pFile->Read(szData.GetMemory(), szData.GetSize()); - pFile->Close(); + szData = CUtlBuffer(filesystem->Size(pFile)); + filesystem->Read(pFile, szData.GetMemory(), szData.GetSize()); + filesystem->Close(pFile); g_pGameParameters= INIManager()->ReadString(szData); pMainGame = g_pGameParameters->GetSection("MainGame"); diff --git a/engine/gamewindow_sdl.cpp b/engine/gamewindow_sdl.cpp index 5370e44..0d5154d 100644 --- a/engine/gamewindow_sdl.cpp +++ b/engine/gamewindow_sdl.cpp @@ -17,48 +17,22 @@ class CSDLGameWindow: public IGameWindow public: virtual void Init() override; virtual void Shutdown() override; - virtual void UpdateWindow() override; + virtual void Tick( float fDelta ) override; + virtual void Frame( float fDelta ) override; + virtual uint32_t GetRenderWidth() override; + virtual uint32_t GetRenderHeight() override; - // Rendering info - virtual void SetRenderImage( IImage *pImage ) override; - virtual bool BIsRenderResolutionUpdated() override; - virtual void GetRenderWidth() override; - virtual void GetRenderHeight() override; - - // Vulkan stuff - virtual int GetVulkanInstanceExtensionCount() override; - virtual const char **GetVulkanInstanceExtensions() override; - - virtual void CreateVulkanSurface( void *pInstance, void *pDevice ) override; - virtual void DestroyVulkanSurface( void *pInstance, void *pDevice ) override; - - virtual void *GetVulkanSurface() override; - virtual void *GetVulkanFence( int iFrame ) override; - virtual void *GetVulkanDrawSemaphore( int iFrame ) override; - virtual void *GetVulkanPresentSemaphore( int iFrame ) override; - virtual IImage *GetVulkanSwapchainImage( int iFrame ) override; + virtual void *CreateVulkanSurface( void *pInstance ) override; + virtual void DestroyVulkanSurface( void *pInstance ) override; private: + + VkSurfaceKHR m_hSurface; SDL_Window *m_pWindow; - EGraphicsAPI m_ePreferredGraphicsAPI; - - uint32_t m_uRenderWidth; - uint32_t m_uRenderHeight; - bool m_bIsRenderResolutionUpdated; - - void *m_pVulkanSurface; - CUtlVector m_vulkanImages; - void *m_pVulkanFences[VULKAN_FRAMES_IN_FLIGHT]; - void *m_pVulkanPresentSemaphores[VULKAN_FRAMES_IN_FLIGHT]; }; -CSDLGameWindow g_sdlGameWindow; -IGameWindow *gamewindow = &g_sdlGameWindow; - void CSDLGameWindow::Init() { - m_ePreferredGraphicsAPI = GRAPHICS_API_VULKAN; - if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS | SDL_INIT_GAMEPAD)) Plat_FatalErrorFunc("SDL_Init: %s\n", SDL_GetError()); @@ -72,18 +46,14 @@ void CSDLGameWindow::Shutdown() } -void CSDLGameWindow::UpdateWindow() +void CSDLGameWindow::Frame( float fDelta ) { SDL_Event event; - m_bIsRenderResolutionUpdated = false; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: - m_bIsRenderResolutionUpdated = true; - m_uRenderWidth = event.window.data1; - m_uRenderWidth = event.window.data2; break; case SDL_EVENT_QUIT: SDL_Quit(); @@ -94,46 +64,92 @@ void CSDLGameWindow::UpdateWindow() } } } -EGraphicsAPI CSDLGameWindow::GetGraphicsAPI() +void CSDLGameWindow::Tick( float fDelta ) { - return GRAPHICS_API_VULKAN; + +}; + +uint32_t CSDLGameWindow::GetRenderWidth() +{ + return 0; } -int CSDLGameWindow::GetVulkanInstanceExtensionCount() +uint32_t CSDLGameWindow::GetRenderHeight() { - if ( m_ePreferredGraphicsAPI != GRAPHICS_API_VULKAN ) - return -1; + return 0; +} + +void *CSDLGameWindow::CreateVulkanSurface( void *pInstance ) +{ + SDL_Vulkan_CreateSurface(m_pWindow, (VkInstance)pInstance, NULL, (VkSurfaceKHR*)&m_hSurface); + return (void*)m_hSurface; +} + +void CSDLGameWindow::DestroyVulkanSurface( void *pInstance ) +{ + SDL_Vulkan_DestroySurface((VkInstance)pInstance, (VkSurfaceKHR)m_hSurface, NULL); +} + +class CSDLGameWindowManager: public IGameWindowManager +{ + + virtual void Init() override; + virtual void Tick( float fDelta ) override; + virtual void Frame( float fDelta ) override; + virtual void Shutdown() override; + + virtual IGameWindow *CreateWindow() override; + virtual void DestroyWindow( IGameWindow* pWindow ) override; + + virtual int GetVulkanInstanceExtensionCount() override; + virtual const char **GetVulkanInstanceExtensions() override; +}; + +void CSDLGameWindowManager::Init() +{ + +} + +void CSDLGameWindowManager::Tick( float fDelta ) +{ + +} + +void CSDLGameWindowManager::Frame( float fDelta ) +{ + +} + +void CSDLGameWindowManager::Shutdown() +{ + +} + + +IGameWindow *CSDLGameWindowManager::CreateWindow() +{ + +} + +void CSDLGameWindowManager::DestroyWindow( IGameWindow* pWindow ) +{ + +} + + +int CSDLGameWindowManager::GetVulkanInstanceExtensionCount() +{ uint32_t nCount; SDL_Vulkan_GetInstanceExtensions(&nCount); return nCount; } -const char **CSDLGameWindow::GetVulkanInstanceExtensions() +const char **CSDLGameWindowManager::GetVulkanInstanceExtensions() { - if ( m_ePreferredGraphicsAPI != GRAPHICS_API_VULKAN ) - return 0; uint32_t nCount; return (const char **)SDL_Vulkan_GetInstanceExtensions(&nCount); } -void CSDLGameWindow::CreateVulkanSurface( void *pInstance ) -{ - if ( m_ePreferredGraphicsAPI != GRAPHICS_API_VULKAN ) - return; - - SDL_Vulkan_CreateSurface(m_pWindow, (VkInstance)pInstance, NULL, (VkSurfaceKHR*)&m_pVulkanSurface); -} - -void CSDLGameWindow::DestroyVulkanSurface( void *pInstance ) -{ - SDL_Vulkan_DestroySurface((VkInstance)pInstance, (VkSurfaceKHR)m_pVulkanSurface, NULL); -} - -void *CSDLGameWindow::GetVulkanSurface() -{ - return m_pVulkanSurface; -} - diff --git a/external/funnystdlib b/external/funnystdlib new file mode 160000 index 0000000..07089ff --- /dev/null +++ b/external/funnystdlib @@ -0,0 +1 @@ +Subproject commit 07089ffe1ca77ecfcd45dd498b9006498ca1836a diff --git a/fpc/.fpccfg b/fpc/.fpccfg deleted file mode 100644 index da89455..0000000 --- a/fpc/.fpccfg +++ /dev/null @@ -1 +0,0 @@ -[i386-unknown-linux] diff --git a/fpc/Makefile b/fpc/Makefile deleted file mode 100644 index be0d70b..0000000 --- a/fpc/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -# We want to build just enough to use other stuff -TIER0_FILES := ../tier0/lib.cpp ../tier0/mem.cpp ../tier0/platform.cpp ../tier0/commandline.cpp ../tier0/rand.cpp -TIER1_FILES := ../tier1/utlbuffer.cpp ../tier1/interface.cpp ../tier1/utlstring.cpp ../tier1/utlvector.cpp ../tier1/utlmap.cpp -TIER2_FILES := ../tier2/filesystem.cpp ../tier2/fileformats/ini.cpp ../tier2/tokenizer.cpp ../tier2/fileformats/json.cpp -FILESYSTEM_FILES := ../stdfilesystems/filesystem_libc.cpp -TIER1_OBJS := $(TIER1_FILES:.cpp=.o) -TIER2_OBJS := $(TIER2_FILES:.cpp=.o) -FPC_FILES := library/helper.cpp library/target.cpp library/builder.cpp library/runner.cpp library/c.cpp library/ld.cpp library/clang/c.cpp library/clang/ld.cpp -CC = clang++ - -ifneq ($(FPC_ARCH),) -ifneq ($(FPC_OS),) -ifneq ($(FPC_ABI),) -REAL_TARGET := -target $(FPC_ARCH)-$(FPC_OS)-$(FPC_ABI) -DFPC_ARCH=\"$(FPC_ARCH)\" -DFPC_OS=\"$(FPC_OS)\" -DFPC_ABI=\"$(FPC_ABI)\" -else -REAL_TARGET := -target $(FPC_ARCH)-$(FPC_OS) -DFPC_ARCH=\"$(FPC_ARCH)\" -DFPC_OS=\"$(FPC_OS)\" -endif -endif -endif - -CCFLAGS = $(REAL_TARGET) -g -I../public -Ipublic - -UNAME_S := $(shell uname -s) -ifeq ($(UNAME_S),Darwin) -CCFLAGS += -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -std=c++11 -Wl,-export_dynamic -endif -ifeq ($(UNAME_S),Linux) -endif - -recompile: ../build/tools/fpc - build/fpc build - -install: ../build/tools/fpc build/libfpcbuild.a build/libfpc.so build/libtier0.so build/libtier1.a build/libtier2.a build/libfilesystem_std.so install_temp builddir - $(CC) -fPIC main.cpp library/helper.cpp library/target.cpp library/builder.cpp -lc -lstdc++ $(CCFLAGS) -o build/fpc -ltier0 -Lbuild build/libtier1.a build/libtier2.a -Wl,--disable-new-dtags -Wl,-rpath,'$$ORIGIN' - build/fpc build -fpcdebug - mv build/fpc_temp build/fpc - mv build/libfpc_temp.so build/libfpc.so - build/fpc build -fpcdebug - mv build/fpc_temp build/fpc - mv build/libfpc_temp.so build/libfpc.so - -build/libtier0.so: $(TIER0_FILES) builddir - $(CC) $(CCFLAGS) -fPIC -shared -o build/libtier0.so $(TIER0_FILES) - -%.o: %.cpp - $(CC) $(CCFLAGS) -fPIC -c $< -o $@ - -build/libtier1.a: $(TIER1_OBJS) builddir build/libtier0.so - ar rcs build/libtier1.a $(TIER1_OBJS) - -build/libtier2.a: $(TIER2_OBJS) builddir build/libtier1.a - ar rcs build/libtier2.a $(TIER2_OBJS) - -build/libfilesystem_std.so: $(FILESYSTEM_FILES) build/libtier1.a build/libtier0.so builddir - $(CC) $(CCFLAGS) -fPIC -shared -o build/libfilesystem_std.so $(FILESYSTEM_FILES) build/libtier1.a -ltier0 -Lbuild - -build/libfpcbuild.a: buildfile/interfaces.o builddir - ar rcs build/libfpcbuild.a buildfile/interfaces.o - -build/libfpc.so: $(FPC_FILES) builddir build/libfpcbuild.a build/libtier1.a build/libtier2.a - $(CC) $(CCFLAGS) $(FPC_FILES) library/libfpc.cpp -fPIC -shared -o build/libfpc.so build/libtier1.a build/libtier2.a - -builddir: - mkdir -p build - -../build/tools/fpc: - mkdir -p ../build/tools/fpc - -install_fpc: ../build/tools/fpc - cp -r build/* ../build/tools/fpc - -install_temp: builddir - cp -r public build - cp -r ../public/tier0 build/public - cp -r ../public/tier1 build/public - cp -r ../public/tier2 build/public - -auto: install install_fpc - diff --git a/fpc/README b/fpc/README deleted file mode 100644 index 9138fc4..0000000 --- a/fpc/README +++ /dev/null @@ -1,34 +0,0 @@ - funny project compiler - -fpc is a simple project manager written in C++ without usage of STL. -Instead it uses C++ files for building stuff with quite simple API. -It also generates compile_commands.json. - - basics cheat sheet - -With this toolset it should be sufficient enough to build any simple application. - -DECLARE_BUILD_STAGE( stage_name, function ) - Declares build stage - -CProject - compiler output base; -CShaderProject - shader compiler output base (NOT IMPLEMENTED) - -CCProject - C, C++, Objective-C, Objective-C++ compiler -CLDProject - linker - -IFileSystem2 - simple filesystem for creating, deleting and copying stuff - - usage parameters cheat sheet - --os - sets target kernel - windows - linux - macos - ios - android - --arch - sets target arch - x86_64 - aarch64 - --fpcdebug - shows shell command used to run the command diff --git a/fpc/apple/build.cpp b/fpc/apple/build.cpp deleted file mode 100644 index ccb51da..0000000 --- a/fpc/apple/build.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "c.h" -#include "swift.h" -#include "ld.h" -#include "helper.h" -#include "tier0/platform.h" -#include "tier1/interface.h" - -ADD_DEPENDENCY_BUILD_FILE(tier1, "../../tier1/build.cpp"); - -DECLARE_BUILD_STAGE(xtool) -{ - if (!linker->IsLibraryExists("swiftCore")) - { - V_printf("Swift is not installed\n"); - return 0; - } - - - CUtlString outputProject = CUtlString("fpcxtool/.build/%s/debug/libfpcxtool.so",Target_t::HostTarget().GetTriplet().GetString()); - V_printf("SWIFT %s\n", outputProject.GetString()); - - CUtlVector args = {"build"}; - runner->Run("swift","fpcxtool", args); - runner->Wait(); - - ADD_OUTPUT_OBJECT("xtool", outputProject); - - return 0; -}; - -DECLARE_BUILD_STAGE(xtool_cpp) -{ - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - CUtlString szOutputProject = ""; - - compileProject.m_szName = "xtool"; - compileProject.files = { - "fpcxtool/fpcxtool.cpp" - }; - compileProject.includeDirectories = {"../public","../../public"}; - compileProject.bFPIC = true; - ldProject = ccompiler->Compile(&compileProject); - - ldProject.linkType = ELINK_DYNAMIC_LIBRARY; - ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(xtool, "xtool")}); - ldProject.libraryObjects = { - GET_PROJECT_LIBRARY(tier1, "tier1"), - }; - - szOutputProject = linker->Link(&ldProject); - ADD_OUTPUT_OBJECT("xtool", szOutputProject); - return 0; -} diff --git a/fpc/build.cpp b/fpc/build.cpp deleted file mode 100644 index 32befd4..0000000 --- a/fpc/build.cpp +++ /dev/null @@ -1,160 +0,0 @@ -#include "c.h" -#include "ld.h" -#include "helper.h" -#include "tier0/platform.h" -#include "tier1/interface.h" - -ADD_DEPENDENCY_BUILD_FILE(tier0, "../tier0/build.cpp"); -ADD_DEPENDENCY_BUILD_FILE(tier1, "../tier1/build.cpp"); -ADD_DEPENDENCY_BUILD_FILE(tier2, "../tier2/build.cpp"); -ADD_DEPENDENCY_BUILD_FILE(appleauth, "../appleauth/build.cpp"); - - -CUtlVector g_fpcFiles = { - - "main.cpp", - "library/helper.cpp", - "library/target.cpp", - "library/builder.cpp", -}; - -CUtlVector g_libFpcFiles = { - "library/libfpc.cpp", - "library/helper.cpp", - "library/target.cpp", - "library/builder.cpp", - "library/runner.cpp", - "library/winerunner.cpp", - "library/deploy.cpp", - - "library/c.cpp", - "library/ld.cpp", - "library/swift.cpp", - - "library/android/apktool.cpp", - "library/apple/appletool.cpp", - - "library/clang/c.cpp", - "library/clang/ld.cpp", - - "library/windows/c.cpp", - "library/windows/ld.cpp", - - "library/apple/swift.cpp", - -}; - -CUtlVector g_IncludeDirectories = { - "public", - "../public", -}; - -DECLARE_BUILD_STAGE(libfpcbuild) -{ - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - - compileProject.m_szName = "fpcbuild"; - compileProject.files = g_libFpcFiles; - compileProject.includeDirectories = g_IncludeDirectories; - compileProject.bFPIC = true; - ldProject = ccompiler->Compile(&compileProject); - ldProject.linkType = ELINK_STATIC_LIBRARY; - - CUtlString outputProject = linker->Link(&ldProject); - - - ADD_OUTPUT_OBJECT("fpcbuild", outputProject) - - return 0; -} -DECLARE_BUILD_STAGE(libfpc) -{ - if (linker->IsLibraryExists("clang")) - g_libFpcFiles.AppendTail("library/clang/c_libclang.cpp"); - else - V_printf("Warning: to support included files libclang must be installed.\n"); - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - - compileProject.m_szName = "fpc"; - compileProject.files = g_libFpcFiles; - compileProject.includeDirectories = g_IncludeDirectories; - compileProject.bFPIC = true; - compileProject.macros = { - {"FPC_ARCH", CUtlString("\"%s\"",Target_t::StringFromCPU(compileProject.m_target.cpu))}, - {"FPC_OS", CUtlString("\"%s\"",Target_t::StringFromKernel(compileProject.m_target.kernel))}, - {"FPC_ABI", CUtlString("\"%s\"",Target_t::StringFromABI(compileProject.m_target.abi))}, - }; - ldProject = ccompiler->Compile(&compileProject); - ldProject.linkType = ELINK_DYNAMIC_LIBRARY; - ldProject.libraryObjects = { - GET_PROJECT_LIBRARY(tier0, "tier0"), - GET_PROJECT_LIBRARY(tier1, "tier1"), - GET_PROJECT_LIBRARY(tier2, "tier2"), - }; - - if (linker->IsLibraryExists("clang")) - ldProject.libraries.AppendTail("clang"); - - CUtlString outputProject = linker->Link(&ldProject); - - - ADD_OUTPUT_OBJECT("fpc", outputProject) - - return 0; -}; - -DECLARE_BUILD_STAGE(fpc) -{ - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - - compileProject.m_szName = "fpc"; - compileProject.files = g_fpcFiles; - compileProject.bFPIC = true; - compileProject.includeDirectories = g_IncludeDirectories; - compileProject.macros = { - {"FPC_ARCH", CUtlString("\"%s\"",Target_t::StringFromCPU(compileProject.m_target.cpu))}, - {"FPC_OS", CUtlString("\"%s\"",Target_t::StringFromKernel(compileProject.m_target.kernel))}, - {"FPC_ABI", CUtlString("\"%s\"",Target_t::StringFromABI(compileProject.m_target.abi))}, - }; - ldProject = ccompiler->Compile(&compileProject); - ldProject.libraryObjects = { - GET_PROJECT_LIBRARY(tier0, "tier0"), - GET_PROJECT_LIBRARY(tier1, "tier1"), - GET_PROJECT_LIBRARY(tier2, "tier2"), - }; - - CUtlString outputProject = linker->Link(&ldProject); - - - ADD_OUTPUT_OBJECT("fpc", outputProject); - - return 0; -}; - - -DECLARE_BUILD_STAGE(install) -{ - CUtlString szExe = GET_PROJECT_LIBRARY(fpc, "fpc"); - CUtlString szLibFpc = GET_PROJECT_LIBRARY(libfpc, "fpc"); - CUtlString szTier0 = GET_PROJECT_LIBRARY(tier0, "tier0"); - CUtlString szTier1 = GET_PROJECT_LIBRARY(tier1, "tier1"); - CUtlString szTier2 = GET_PROJECT_LIBRARY(tier2, "tier2"); - CUtlString szHttp = GET_PROJECT_LIBRARY(funnyhttp, "funnyhttp"); - CUtlString szAppleAuth = GET_PROJECT_LIBRARY(appleauth, "appleauth"); - - filesystem2->CopyFile("build/fpc_temp", szExe); - filesystem2->CopyFile("build/libfpc_temp.so", szLibFpc); - filesystem2->CopyFile("build", szHttp); - filesystem2->CopyFile("build", szAppleAuth); - - /* - filesystem2->CopyFile("build/libtier1.a", szTier1); - filesystem2->CopyFile("build/libtier2.a", szTier2); - filesystem2->CopyFile("build/libtier0_temp.so", szTier0); - */ - - return 0; -}; diff --git a/fpc/buildfile/interfaces.cpp b/fpc/buildfile/interfaces.cpp deleted file mode 100644 index fbf587d..0000000 --- a/fpc/buildfile/interfaces.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "tier1/interface.h" -#include "helper.h" - -static BuildFileInfo_t buildfileinfo = {}; -CBuildStage *g_pCurrentStage = NULL; -GetProjectObjectFn g_pfnGetProjectObject = NULL; - -BuildFileInfo_t *GetBuildFileInfo() -{ - return &buildfileinfo; -} - - -CBuildStage::CBuildStage( const char *psz, int(*pMainFn)() ) -{ - m_psz = psz; - m_pMainFn = pMainFn; - if (psz == 0 || pMainFn == 0) - Plat_FatalErrorFunc("Name and function pointer must be set\n"); - - GetBuildFileInfo()->m_stages.AppendTail(this); -}; - -CBuildDependentFile::CBuildDependentFile( const char *psz ) -{ - // TODO: This doesn't affect recursion, which is bad - - GetBuildFileInfo()->m_dependantFiles.AppendTail(psz); -} - -CUtlString FPC_GetProjectObject( const char *szName, const char *szObjectName ) -{ - CUtlString szOutputString; - szOutputString = g_pfnGetProjectObject(szName, szObjectName); - return szOutputString; -} - - -EXPOSE_INTERFACE_GLOBALVAR(BuildFileInfo_t, BuildFileInfo_t, BUILD_FILE_INFO_INTERFACE_VERSION, buildfileinfo); -EXPOSE_INTERFACE_GLOBALVAR(CBuildStage, CBuildStage, BUILD_CURRENT_STAGE_INTERFACE_VERSION, g_pCurrentStage); -EXPOSE_INTERFACE_GLOBALVAR(GetProjectObjectFn, GetProjectObjectFn, BUILD_GET_PROJECT_OBJECT_INTERFACE_VERSION, g_pfnGetProjectObject); diff --git a/fpc/external/build.cpp b/fpc/external/build.cpp deleted file mode 100644 index e95e5a8..0000000 --- a/fpc/external/build.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include "c.h" -#include "ld.h" -#include "helper.h" -#include "tier0/platform.h" -#include "tier1/interface.h" -#include "tier2/ifilesystem.h" - -DECLARE_BUILD_STAGE(zsign) -{ - if (!filesystem) - { - void *pFilesystem = Plat_LoadLibrary("libfilesystem_std.so"); - CreateInterfaceFn pFilesystemFactory = Sys_GetFactory(pFilesystem); - - filesystem = (IFileSystem*)pFilesystemFactory(FILESYSTEM_INTERFACE_VERSION, NULL); - } - IDirectoryHandle *pDir = filesystem->OpenDir("zsign"); - if (!pDir) - return 0; - filesystem->CloseDir(pDir); - - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - CUtlString szOutputProject = ""; - - compileProject.m_szName = "zsign"; - compileProject.m_target = Target_t::HostTarget(); - compileProject.bFPIC = true; - compileProject.files = { - "zsign/src/common/archive.cpp", - "zsign/src/common/base64.cpp", - "zsign/src/common/fs.cpp", - "zsign/src/common/json.cpp", - "zsign/src/common/log.cpp", - "zsign/src/common/sha.cpp", - "zsign/src/common/timer.cpp", - "zsign/src/common/util.cpp", - "zsign/src/archo.cpp", - "zsign/src/bundle.cpp", - "zsign/src/macho.cpp", - "zsign/src/openssl.cpp", - "zsign/src/signing.cpp", - "zsign/src/zsign.cpp", - }; - compileProject.includeDirectories = { - "zsign/src/common", - "zsign/src", - }; - ldProject = ccompiler->Compile(&compileProject); - - ldProject.linkType = ELINK_DYNAMIC_LIBRARY; - szOutputProject = linker->Link(&ldProject); - - ADD_OUTPUT_OBJECT("zsign", szOutputProject); - - return 0; -} diff --git a/fpc/external/zsign b/fpc/external/zsign deleted file mode 160000 index cb49b1d..0000000 --- a/fpc/external/zsign +++ /dev/null @@ -1 +0,0 @@ -Subproject commit cb49b1d34e8e0e02aac82f3579dbd7936232499b diff --git a/fpc/generators/make/make.cpp b/fpc/generators/make/make.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/fpc/library/android/apktool.cpp b/fpc/library/android/apktool.cpp deleted file mode 100644 index 63904b3..0000000 --- a/fpc/library/android/apktool.cpp +++ /dev/null @@ -1,207 +0,0 @@ -#include "apktool.h" -#include "helper.h" -#include "tier0/lib.h" -#include "tier0/platform.h" -#include "tier0/commandline.h" -#include "tier1/interface.h" -#include "runner.h" -#include "tier1/utlstring.h" -#include "tier1/utlvector.h" - -void AndroidManifest_t::SetPackageVersion( CUtlString szVersion ) -{ - m_szVersion = szVersion; -} - -void AndroidManifest_t::SetPackageBuild( uint64_t nBuild ) -{ - m_nBuild = nBuild; -} - -void AndroidManifest_t::SetPackageID( CUtlString szPackageID ) -{ - m_szPackageID = szPackageID; -} - -void AndroidManifest_t::SetPackageName( CUtlString szPackageName ) -{ - m_szPackageName = szPackageName; -} - -void AndroidManifest_t::SetTargetSDKVersion( uint64_t nTargetVersion ) -{ - m_nTargetVersion = nTargetVersion; -} - -void AndroidManifest_t::SetMinSDKVersion( uint64_t nMinVersion ) -{ - m_nMinVersion = nMinVersion; -} - -void AndroidManifest_t::AddUserFeature( CUtlString szName, bool bIsRequired, uint64_t nVersion ) -{ - -} - -void AndroidManifest_t::AddUserLibrary( CUtlString szPath ) -{ - -} - -CUtlString AndroidManifest_t::BuildManifest() -{ - CPUProject_t project = {}; - project.m_szName = m_szPackageName; - unsigned int hash = project.GenerateProjectHash(); - CUtlString szOutputDir = CUtlString("%s/android/%u_%s/",FPC_TEMPORAL_DIRNAME, hash, m_szPackageID.GetString()); - filesystem2->MakeDirectory(szOutputDir); - filesystem2->MakeDirectory(CUtlString("%s/res", szOutputDir.GetString())); - - CUtlString szAndroidManifestPath = CUtlString("%s/AndroidManifest.xml", szOutputDir.GetString()); - FILE *pAndroidManifest = V_fopen(szAndroidManifestPath, "wb"); - - V_fprintf(pAndroidManifest, "\n"); - V_fprintf(pAndroidManifest, "\n", m_szPackageID.GetString()); - V_fprintf(pAndroidManifest, "\n",m_nMinVersion, m_nTargetVersion); - V_fprintf(pAndroidManifest, "\n", m_szPackageName.GetString()); - V_fprintf(pAndroidManifest, "\n", m_szPackageName.GetString()); - V_fprintf(pAndroidManifest, "\n"); - V_fprintf(pAndroidManifest, "\n"); - V_fprintf(pAndroidManifest, "\n"); - V_fprintf(pAndroidManifest, "\n"); - V_fprintf(pAndroidManifest, "\n"); - V_fprintf(pAndroidManifest, "\n"); - V_fprintf(pAndroidManifest, "\n"); - V_fprintf(pAndroidManifest, "\n"); - - V_fclose(pAndroidManifest); - return szOutputDir; -}; - - - -class CAPKTool : public IAPKTool -{ -public: - virtual CUtlString BuildPackage( AndroidManifest_t manifest, CUtlString szManifestDir ) override; - virtual CUtlString SignPackage( const char *szApk, LegalInfo_t *pLegalInfo, const char *szAlias, const char *szStorePassword, const char *szKeyPassword ) override; -private: -}; - - - -CUtlString CAPKTool::BuildPackage( AndroidManifest_t manifest, CUtlString szManifestDir ) -{ - - V_printf(" APKTOOL %s\n", manifest.m_szPackageID.GetString()); - - IINISection *pSection = NULL; - const char *szBuildTools; - pSection = g_pConfig->GetSection("Android_Build_Tools"); - if (!pSection) - Plat_FatalErrorFunc("build_tools are required for this target"); - szBuildTools = pSection->GetStringValue("path"); - CUtlVector args = { - "package", - "-f", - "-M", - "AndroidManifest.xml", - "-S", - "res", - "-I", - CUtlString("%s/../../platforms/android-%lu/android.jar", szBuildTools, manifest.m_nTargetVersion), - "-F", - CUtlString("%s.unaligned.apk", manifest.m_szPackageID.GetString()), - }; - runner->Run(CUtlString("%s/aapt",szBuildTools),szManifestDir,args); - runner->Wait(); - - args = { - "-u", - CUtlString("%s.unaligned.apk", manifest.m_szPackageID.GetString()), - "lib/x86_64/libnative-app.so", - }; - runner->Run("zip",szManifestDir, args); - runner->Wait(); - - args = { - "-f", - "-v", - "4", - CUtlString("%s.unaligned.apk", manifest.m_szPackageID.GetString()), - CUtlString("%s.apk", manifest.m_szPackageID.GetString()), - }; - runner->Run(CUtlString("%s/zipalign",szBuildTools),szManifestDir,args); - runner->Wait(); - - return CUtlString("%s/%s.apk",szManifestDir.GetString(), manifest.m_szPackageID.GetString()); -} - -CUtlString CAPKTool::SignPackage( const char *szApk, LegalInfo_t *pLegalInfo, const char *szAlias, const char *szStorePassword, const char *szKeyPassword ) -{ - V_printf(" APKSIGN %s\n", szApk ); - CUtlString szOutput = CUtlString("%s.signed", szApk); - LegalInfo_t stLegalInfo = {}; - CUtlVector args = {}; - - CPUProject_t project = {}; - project.m_szName = szAlias; - unsigned int hash = project.GenerateProjectHash(); - CUtlString szOutputDir = CUtlString("%s/android/%u_%s/",FPC_TEMPORAL_DIRNAME, hash, szAlias); - filesystem2->MakeDirectory(szOutputDir); - CUtlString szKeystoreDir = CUtlString("%s/%s.jks",szOutputDir.GetString(),szAlias); - CUtlString szDname = ""; - - IINISection *pSection = NULL; - const char *szBuildTools; - pSection = g_pConfig->GetSection("Android_Build_Tools"); - if (!pSection) - Plat_FatalErrorFunc("build_tools are required for this target"); - szBuildTools = pSection->GetStringValue("path"); - - // We need to have a name at least - stLegalInfo.FirstName = "Gordon"; - stLegalInfo.LastName = "Freeman"; - - if (pLegalInfo != NULL) - stLegalInfo = *pLegalInfo; - - if (!stLegalInfo.FirstName) - Plat_FatalErrorFunc("First name wasn't provided\n"); - if (!stLegalInfo.LastName) - Plat_FatalErrorFunc("Last name wasn't provided\n"); - szDname.AppendTail(CUtlString("CN=%s %s", stLegalInfo.FirstName, stLegalInfo.LastName)); - - args = { - "-genkeypair", - "-keystore", szKeystoreDir, - "-alias", szAlias, - "-keyalg", "RSA", - "-keysize", "2048", - "-validity", "10000", - "-storepass", szStorePassword, - "-keypass", szKeyPassword, - "-dname", szDname, - }; - runner->Run("keytool", args); - runner->Wait(); - - args = { - "sign", - "--ks", szKeystoreDir, - "--ks-key-alias", szAlias, - "--ks-pass", CUtlString("pass:%s",szStorePassword), - "--key-pass", CUtlString("pass:%s",szKeyPassword), - szApk, - }; - runner->Run(CUtlString("%s/apksigner",szBuildTools), args); - runner->Wait(); - - return szApk; -}; - -IAPKTool *APKTool() -{ - static CAPKTool s_apktool = {}; - return &s_apktool; -} diff --git a/fpc/library/android/signtool.cpp b/fpc/library/android/signtool.cpp deleted file mode 100644 index 63704fa..0000000 --- a/fpc/library/android/signtool.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "signtool.h" -#include "tier0/platform.h" -#include "tier1/interface.h" - -class CAndroidSignTool : public ISignTool -{ -public: - virtual void SignFile( CUtlString szFile ) override; - virtual void SignDirectory( CUtlString szDirectory ) override; -}; - -EXPOSE_INTERFACE(CAndroidSignTool, ISignTool, ANDROID_SIGN_TOOL_INTERFACE_NAME); - -void CAndroidSignTool::SignFile( CUtlString szFile ) -{ - -} - -void CAndroidSignTool::SignDirectory( CUtlString szDirectory ) -{ - V_printf("Android doesn't support signing of directories\n"); -} - diff --git a/fpc/library/apple/appletool.cpp b/fpc/library/apple/appletool.cpp deleted file mode 100644 index ba16694..0000000 --- a/fpc/library/apple/appletool.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include "appletool.h" -#include "helper.h" -#include "runner.h" -#include "appleauth/iauth.h" - -void AppleManifest_t::SetPackageID( CUtlString szPackageID ) -{ - m_szPackageID = szPackageID; -} - -void AppleManifest_t::SetPackageName( CUtlString szPackageName ) -{ - m_szPackageName = szPackageName; -} - -void AppleManifest_t::SetPackageExecutable( CUtlString szPackageExecutable ) -{ - m_szPackageExecutable = szPackageExecutable; -} - -CUtlString AppleManifest_t::BuildManifest() -{ - CPUProject_t project = {}; - project.m_szName = m_szPackageName; - unsigned int hash = project.GenerateProjectHash(); - CUtlString szOutputDir = CUtlString("%s/apple/%u_%s/app/",FPC_TEMPORAL_DIRNAME, hash, m_szPackageID.GetString()); - filesystem2->MakeDirectory(szOutputDir); - filesystem2->CopyFile(szOutputDir, m_szPackageExecutable); - CUtlString szInfoPlist = CUtlString("%s/Info.plist", szOutputDir.GetString()); - FILE *pInfoPlistFile = V_fopen(szInfoPlist, "wb"); - - V_fprintf(pInfoPlistFile, "\n"); - V_fprintf(pInfoPlistFile, "\n"); - V_fprintf(pInfoPlistFile, "\n"); - V_fprintf(pInfoPlistFile, "\n"); - V_fprintf(pInfoPlistFile, "CFBundleIdentifier\n"); - V_fprintf(pInfoPlistFile, "%s\n", m_szPackageID.GetString()); - V_fprintf(pInfoPlistFile, "CFBundleName\n"); - V_fprintf(pInfoPlistFile, "%s\n", m_szPackageName.GetString()); - V_fprintf(pInfoPlistFile, "CFBundleDisplayName\n"); - V_fprintf(pInfoPlistFile, "%s\n", m_szPackageName.GetString()); - V_fprintf(pInfoPlistFile, "CFBundleExecutable\n"); - V_fprintf(pInfoPlistFile, "%s\n", m_szPackageExecutable.GetFileName().GetString()); - V_fprintf(pInfoPlistFile, "CFBundlePackageType\n"); - V_fprintf(pInfoPlistFile, "APPL\n"); - V_fprintf(pInfoPlistFile, "CFBundleVersion\n"); - V_fprintf(pInfoPlistFile, "1.0\n"); - V_fprintf(pInfoPlistFile, "CFBundleShortVersionString\n"); - V_fprintf(pInfoPlistFile, "1.0\n"); - V_fprintf(pInfoPlistFile, "LSRequiresIPhoneOS\n"); - V_fprintf(pInfoPlistFile, "\n"); - V_fprintf(pInfoPlistFile, "UIDeviceFamily\n"); - V_fprintf(pInfoPlistFile, "\n"); - V_fprintf(pInfoPlistFile, "1\n"); - V_fprintf(pInfoPlistFile, "2\n"); - V_fprintf(pInfoPlistFile, "\n"); - V_fprintf(pInfoPlistFile, "\n"); - - V_fclose(pInfoPlistFile); - return szOutputDir; -} - - -class CAppleTool: public IAppleTool -{ -public: - virtual CUtlString BuildPackage( AppleManifest_t manifest, CUtlString szManifestDir ) override; - virtual CUtlString SignPackage( const char *szIpa, const char *szPassword ) override; -}; - -CUtlString CAppleTool::BuildPackage( AppleManifest_t manifest, CUtlString szManifestDir ) -{ - CUtlVector args = {}; - args = { - "-r", - CUtlString("../%s.ipa", manifest.m_szPackageName.GetString()), - CUtlString("."), - }; - runner->Run("zip",szManifestDir, args); - runner->Wait(); - return CUtlString("../%s.ipa", manifest.m_szPackageName.GetString()); -} - -static IAppleAuth *g_pAppleAuth; -CUtlString CAppleTool::SignPackage( const char *szIpa, const char *szPassword ) -{ - CreateInterfaceFn fnFactory = Sys_GetFactory("appleauth"); - if (fnFactory == NULL) - Plat_FatalErrorFunc("Couldn't get xtool\n"); - - g_pAppleAuth = (IAppleAuth*)fnFactory(APPLE_AUTH_INTERFACE_VERSION, NULL); - g_pAppleAuth->Init(); - char *szGSAEmail = CommandLine()->ParamValue("-apple-login"); - char *szGSAPassword = CommandLine()->ParamValue("-apple-password"); - if (szGSAEmail && szGSAPassword) - g_pAppleAuth->SubmitLoginData(szGSAEmail, szGSAPassword); - return szIpa; -} - - -IAppleTool *AppleTool() -{ - static CAppleTool s_tool; - return &s_tool; -} diff --git a/fpc/library/apple/swift.cpp b/fpc/library/apple/swift.cpp deleted file mode 100644 index 8d2ec89..0000000 --- a/fpc/library/apple/swift.cpp +++ /dev/null @@ -1,135 +0,0 @@ -#include "swift.h" - -class CSwiftCompiler: public ISwiftCompiler -{ -public: - - // Compiles all files into objects, returns linker project, - // which can be linked into executable or library. - //virtual LinkProject_t Compile( SwiftProject_t *pProject ); - - //virtual void GenerateLinterData() ; - -protected: - // Compiler internals - - virtual CUtlVector BuildCommandLine( SwiftProject_t *pProject, const char *szFileName, const char *szOutputFileName ) override; - - // Returns executable which should the OS run - virtual const char *GetCompilerExecutable( SwiftProject_t *pProject ) override; - - // returns object file format, eg .obj or .o - virtual const char *GetOutputObjectFormat() override; - - virtual void IncludeDirectory( CUtlVector &cmd, const char *szName ) override; - virtual void IncludeFile( CUtlVector &cmd, const char *szName ) override; - virtual void Macro( CUtlVector &cmd, const char *szName ) override; - virtual void Macro( CUtlVector &cmd, const char *szName, const char *szValue ) override; - - virtual void SetTarget( CUtlVector &cmd, SwiftProject_t *pProject ) override; - virtual void SetSysroot( CUtlVector &cmd, SwiftProject_t *pProject , const char *szSysroot ) override; - virtual void SetOutputFile( CUtlVector &cmd, const char *szName ) override; - - virtual void CompileFile( CUtlVector &cmd, const char *szName ) override; - - virtual void EnableDebugSymbols( CUtlVector &cmd ) override; - virtual void EnablePIE( CUtlVector &cmd ) override; - virtual void EnablePIC( CUtlVector &cmd ) override; -}; - -const char *CSwiftCompiler::GetOutputObjectFormat() -{ - return ".o"; -} - -CUtlVector CSwiftCompiler::BuildCommandLine( SwiftProject_t *pProject, const char *szFileName, const char *szOutputFileName ) -{ - CUtlVector cmd; - cmd = ISwiftCompiler::BuildCommandLine(pProject, szFileName, szOutputFileName); - cmd.AppendHead("-c"); - return cmd; -} - - -const char *CSwiftCompiler::GetCompilerExecutable( SwiftProject_t *pProject ) -{ - return "swiftc"; -} - - -void CSwiftCompiler::IncludeDirectory( CUtlVector &cmd, const char *szName ) -{ - cmd.AppendTail("-I"); - cmd.AppendTail(szName); -} - -void CSwiftCompiler::IncludeFile( CUtlVector &cmd, const char *szName ) -{ -} - -void CSwiftCompiler::Macro( CUtlVector &cmd, const char *szName ) -{ -} - -void CSwiftCompiler::Macro( CUtlVector &cmd, const char *szName, const char *szValue ) -{ - cmd.AppendTail("-D"); - cmd.AppendTail(CUtlString("%s=%s", (char*)szName, (char*)szValue)); -} - -void CSwiftCompiler::EnableDebugSymbols( CUtlVector &cmd ) -{ - cmd.AppendTail("-g"); -} - -void CSwiftCompiler::SetTarget( CUtlVector &cmd, SwiftProject_t *pProject ) -{ - cmd.AppendTail("-target"); - cmd.AppendTail(pProject->m_target.GetTriplet()); -} - -void CSwiftCompiler::CompileFile( CUtlVector &cmd, const char *szName ) -{ - cmd.AppendTail(szName); -} -void CSwiftCompiler::SetOutputFile( CUtlVector &cmd, const char *szName ) -{ - cmd.AppendTail("-o"); - cmd.AppendTail(szName); -} -void CSwiftCompiler::EnablePIE( CUtlVector &cmd ) -{ - cmd.AppendTail("-fPIE"); -} - -void CSwiftCompiler::EnablePIC( CUtlVector &cmd ) -{ - cmd.AppendTail("-fPIC"); -} -void CSwiftCompiler::SetSysroot( CUtlVector &cmd, SwiftProject_t *pProject, const char *szName ) -{ - if (szName != NULL) - { - cmd.AppendTail("--sysroot"); - cmd.AppendTail(szName); - return; - } - - if (!g_pConfig) - return; - - - IINISection *pSection = g_pConfig->GetSection(pProject->m_target.GetTriplet()); - if (!pSection) - return; - - const char *szSysroot = pSection->GetStringValue("sysroot"); - if (szSysroot) - { - cmd.AppendTail("--sysroot"); - cmd.AppendTail(szSysroot); - } -} - -EXPOSE_INTERFACE(CSwiftCompiler, ISwiftCompiler, SWIFT_COMPILER_INTERFACE_VERSION) - diff --git a/fpc/library/builder.cpp b/fpc/library/builder.cpp deleted file mode 100644 index ee40597..0000000 --- a/fpc/library/builder.cpp +++ /dev/null @@ -1,131 +0,0 @@ -#include "builder.h" -#include "ld.h" -#include "c.h" - -CUtlVector buildFileInfos = {}; - - -class CProjectBuilder : public IProjectBuilder -{ -public: - virtual BuildFile_t *BuildProject( const char *szProjectName, const char *szPath ) override; - - BuildFile_t *m_pBuildFiles = NULL; -}; - - -static CProjectBuilder s_projectBuilder; - -EXPOSE_INTERFACE_GLOBALVAR(CProjectBuilder, IProjectBuilder, PROJECT_BUILDER_INTERFACE_NAME, s_projectBuilder) - -IProjectBuilder *ProjectBuilder() -{ - return &s_projectBuilder; -}; - -CUtlString FPC_GetProjectObject( const char *szName, const char *szObjectName ) -{ - for (auto b: buildFileInfos) - { - for (auto s: b.m_stages) - { - if (strcmp(s->m_psz, szName)) - continue; - for (auto o: s->m_outputs) - { - if (strcmp(o.m_szName, szObjectName)) - continue; - - return o.m_szPath; - } - } - } - return NULL; -} - -BuildFile_t *CProjectBuilder::BuildProject( const char *szProjectName, const char *szPath ) -{ - CProject_t stCompileProject = {}; - LinkProject_t stLinkProject = {}; - CUtlString szBuildLibrary; - void *pLibrary; - CreateInterfaceFn pBuildFactory; - BuildFileInfo_t *pBuildFileInfo; - BuildFileInfo_t stBuildFileInfo; - BuildFile_t *pBuildFile = NULL; - CBuildStage **ppExecutedBuildStage = NULL; - GetProjectObjectFn *pfnGetProjectObject = NULL; - CUtlString szWd = CUtlString(szPath).GetDirectory(); - - Plat_SetWorkingDir(szWd); - - - stCompileProject.m_szName = szProjectName; - stCompileProject.files = { - szPath, - }; - stCompileProject.includeDirectories = {CUtlString("%s/public",filesystem2->OwnDirectory())}; - stCompileProject.bFPIC = true; - stCompileProject.m_target = Target_t::HostTarget(); - - stLinkProject = ccompiler->Compile(&stCompileProject); - stLinkProject.linkType = ELINK_DYNAMIC_LIBRARY; - stLinkProject.m_target = Target_t::HostTarget(); - stLinkProject.objects.AppendHead({CUtlString("%s/libfpcbuild.a",filesystem2->OwnDirectory())}); - stLinkProject.libraryObjects.AppendHead({CUtlString("%s/libfpc.so",filesystem2->OwnDirectory())}); - stLinkProject.libraryObjects.AppendHead({CUtlString("%s/libtier2.a",filesystem2->OwnDirectory())}); - stLinkProject.libraryObjects.AppendHead({CUtlString("%s/libtier1.a",filesystem2->OwnDirectory())}); - szBuildLibrary = linker->Link(&stLinkProject); - - pLibrary = Plat_LoadLibrary(szBuildLibrary); - if ( !pLibrary ) - return NULL; - - pBuildFactory = Sys_GetFactory(pLibrary); - if (!pBuildFactory) - { - V_printf("Failed to find CreateInterface\n"); - Plat_UnloadLibrary(szBuildLibrary); - return NULL; - } - - pBuildFileInfo = (BuildFileInfo_t*)pBuildFactory(BUILD_FILE_INFO_INTERFACE_VERSION, NULL); - ppExecutedBuildStage = (CBuildStage**)pBuildFactory(BUILD_CURRENT_STAGE_INTERFACE_VERSION, NULL); - pfnGetProjectObject = (GetProjectObjectFn*)pBuildFactory(BUILD_GET_PROJECT_OBJECT_INTERFACE_VERSION, NULL); - if (!pBuildFileInfo || !ppExecutedBuildStage || !pfnGetProjectObject) - { - V_printf("Required interfaces are not present\n"); - Plat_UnloadLibrary(szBuildLibrary); - return NULL; - } - stBuildFileInfo = *pBuildFileInfo; - buildFileInfos.AppendTail(stBuildFileInfo); - *pfnGetProjectObject = FPC_GetProjectObject; - for (auto a: stBuildFileInfo.m_dependantFiles) - { - BuildProject("something", CUtlString("%s/%s",szWd.GetString(),a)); - } - - Plat_SetWorkingDir(szWd); - - - for (auto &build: stBuildFileInfo.m_stages) - { - *ppExecutedBuildStage = build; - build->m_pMainFn(); - for ( auto &o: build->m_outputs) - { - o.m_szPath.AppendHead("/"); - o.m_szPath.AppendHead(Plat_GetWorkingDir()); - }; - }; - - pBuildFile = new BuildFile_t; - pBuildFile->m_szOutputFile = szBuildLibrary; - pBuildFile->m_pLibrary = pLibrary; - pBuildFile->m_pNext = m_pBuildFiles; - m_pBuildFiles = pBuildFile; - - - return pBuildFile; -} diff --git a/fpc/library/c.cpp b/fpc/library/c.cpp deleted file mode 100644 index 54776e8..0000000 --- a/fpc/library/c.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "c.h" -#include "target.h" -#include - -ICCompiler *ccompiler; - -CUtlString ICCompiler::GetOutputObjectName( CProject_t *pProject, unsigned int hash, CUtlString szFileName ) -{ - CUtlString szTarget = pProject->m_target.GetTriplet(); - - return CUtlString( - "%s/%s/cc/%u_%s/%s/%s%s", - FPC_TEMPORAL_DIRNAME, - szTarget.GetString(), - hash, - pProject->m_szName.GetString(), - filesystem2->BuildDirectory(), - szFileName.GetString(), - GetOutputObjectFormat()); -}; - -CUtlVector ICCompiler::BuildCommandLine( CProject_t *pProject, const char *szFileName, const char *szOutputFileName ) -{ - - CUtlVector cmd; - - EnableDebugSymbols(cmd); - if (pProject->bFPIC) - EnablePIC(cmd); - if (pProject->bFPIE) - EnablePIE(cmd); - SetTarget(cmd, pProject); - SetOutputFile(cmd, szOutputFileName); - SetSysroot(cmd, pProject, NULL); - CompileFile(cmd, szFileName); - for (auto ¯o: pProject->macros) - Macro(cmd, macro.szName, macro.szValue.GetString()); - for (auto &dir: pProject->includeDirectories) - IncludeDirectory(cmd, dir); - - return cmd; -} - -LinkProject_t ICCompiler::Compile( CProject_t *pProject ) -{ - if (pProject->m_szName == 0) - { - Plat_FatalErrorFunc("m_szName must be present\n"); - } - - LinkProject_t proj = {}; - proj.m_szName = pProject->m_szName; - proj.m_target = pProject->m_target; - proj.m_androidmanifest = pProject->m_androidmanifest; - unsigned int hash = pProject->GenerateProjectHash(); - - - // Get output directories - for (auto &file: pProject->files) - { - CUtlString szOutputFile = GetOutputObjectName(pProject, hash, file); - CUtlString szOutputDir = szOutputFile; - szOutputDir = dirname(szOutputDir); - filesystem2->MakeDirectory(szOutputDir); - } - - // Run CC - for (auto &file: pProject->files) - { - CUtlString szOutputFile = GetOutputObjectName(pProject, hash, file); - CUtlVector args; - - args = BuildCommandLine(pProject, file, szOutputFile); - if (!filesystem2->ShouldRecompile(file, szOutputFile)) - goto skipcompile; - else - V_printf(" CC %s\n", file.GetString()); - runner->Run(GetCompilerExecutable(pProject), args); -skipcompile: - proj.objects.AppendTail((Object_t){szOutputFile}); - } - runner->Wait(); - return proj; -} diff --git a/fpc/library/clang/c.cpp b/fpc/library/clang/c.cpp deleted file mode 100644 index 6dc1ae9..0000000 --- a/fpc/library/clang/c.cpp +++ /dev/null @@ -1,284 +0,0 @@ -#include "c.h" -#include "c_libclang.h" -#include "helper.h" -#include "obj.h" -#include "target.h" -#include "tier0/lib.h" -#include "tier0/platform.h" -#include "tier0/commandline.h" -#include "tier1/interface.h" -#include "tier1/utlstring.h" -#include "tier1/utlvector.h" -#include "tier2/fileformats/json.h" -#include "libgen.h" -#include "ctype.h" - -struct ClangFile_t -{ - CUtlString m_szName; - CUtlVector m_szArguments; -}; - -class CClangCompiler : public ICCompiler -{ -public: - virtual LinkProject_t Compile( CProject_t *pProject ) override; - - virtual void GenerateLinterData() override; -protected: - - virtual CUtlVector BuildCommandLine( CProject_t *pProject, const char *szFileName, const char *szOutputFileName ) override; - - // Returns executable which should the OS run - virtual const char *GetCompilerExecutable( CProject_t *pProject ) override; - - // returns object file format, eg .obj or .o - virtual const char *GetOutputObjectFormat() override; - - virtual void IncludeDirectory( CUtlVector &cmd, const char *szName ) override; - virtual void IncludeFile( CUtlVector &cmd, const char *szName ) override; - virtual void Macro( CUtlVector &cmd, const char *szName ) override; - virtual void Macro( CUtlVector &cmd, const char *szName, const char *szValue ) override; - - virtual void SetTarget( CUtlVector &cmd, CProject_t *pProject ) override; - virtual void CompileFile( CUtlVector &cmd, const char *szName ) override; - virtual void SetOutputFile( CUtlVector &cmd, const char *szName ) override; - - virtual void EnableDebugSymbols( CUtlVector &cmd ) override; - virtual void EnablePIE( CUtlVector &cmd ) override; - virtual void EnablePIC( CUtlVector &cmd ) override; - - virtual void SetSysroot( CUtlVector &cmd, CProject_t *pProject, const char *szSysroot ) override; -}; - -const char *CClangCompiler::GetOutputObjectFormat() -{ - return ".o"; -} - -CUtlVector CClangCompiler::BuildCommandLine( CProject_t *pProject, const char *szFileName, const char *szOutputFileName ) -{ - CUtlVector cmd; - cmd = ICCompiler::BuildCommandLine(pProject, szFileName, szOutputFileName); - cmd.AppendHead("-c"); - return cmd; -} - - -const char *CClangCompiler::GetCompilerExecutable( CProject_t *pProject ) -{ - return "clang"; -} - - -void CClangCompiler::IncludeDirectory( CUtlVector &cmd, const char *szName ) -{ - cmd.AppendTail("-I"); - cmd.AppendTail(szName); -} - -void CClangCompiler::IncludeFile( CUtlVector &cmd, const char *szName ) -{ -} - -void CClangCompiler::Macro( CUtlVector &cmd, const char *szName ) -{ -} - -void CClangCompiler::Macro( CUtlVector &cmd, const char *szName, const char *szValue ) -{ - cmd.AppendTail("-D"); - cmd.AppendTail(CUtlString("%s=%s", (char*)szName, (char*)szValue)); -} - -void CClangCompiler::EnableDebugSymbols( CUtlVector &cmd ) -{ - cmd.AppendTail("-g"); -} - -void CClangCompiler::SetTarget( CUtlVector &cmd, CProject_t *pProject ) -{ - cmd.AppendTail("-target"); - cmd.AppendTail(pProject->m_target.GetTriplet()); -} - -void CClangCompiler::CompileFile( CUtlVector &cmd, const char *szName ) -{ - cmd.AppendTail(szName); -} -void CClangCompiler::SetOutputFile( CUtlVector &cmd, const char *szName ) -{ - cmd.AppendTail("-o"); - cmd.AppendTail(szName); -} -void CClangCompiler::EnablePIE( CUtlVector &cmd ) -{ - cmd.AppendTail("-fPIE"); -} - -void CClangCompiler::EnablePIC( CUtlVector &cmd ) -{ - cmd.AppendTail("-fPIC"); -} -void CClangCompiler::SetSysroot( CUtlVector &cmd, CProject_t *pProject, const char *szName ) -{ - if (szName != NULL) - { - cmd.AppendTail("--sysroot"); - cmd.AppendTail(szName); - return; - } - - if (!g_pConfig) - return; - - - IINISection *pSection = g_pConfig->GetSection(pProject->m_target.GetTriplet()); - if (!pSection) - return; - - const char *szSysroot = pSection->GetStringValue("sysroot"); - if (szSysroot) - { - cmd.AppendTail("--sysroot"); - cmd.AppendTail(szSysroot); - } -} - - - -EXPOSE_INTERFACE(CClangCompiler, ICCompiler, CLANG_C_COMPILER_INTERFACE_NAME); - -CUtlVector g_clangFiles; -IClangBackend *clangbackend = NULL; - -LinkProject_t CClangCompiler::Compile( CProject_t *pProject ) -{ - if (!clangbackend && CommandLine()->CheckParam("-experimental_header_include")) - clangbackend = (IClangBackend*)CreateInterface(CLANG_BACKEND_INTERFACE_NAME, NULL); - - if (pProject->m_szName == 0) - { - Plat_FatalErrorFunc("m_szName must be present\n"); - } - - LinkProject_t proj = {}; - proj.m_szName = pProject->m_szName; - proj.m_target = pProject->m_target; - proj.m_androidmanifest = pProject->m_androidmanifest; - unsigned int hash = pProject->GenerateProjectHash(); - - // Get output directories - for (auto &file: pProject->files) - { - CUtlString szOutputFile = GetOutputObjectName(pProject, hash, file); - CUtlString szOutputDir = szOutputFile; - szOutputDir = dirname(szOutputDir); - filesystem2->MakeDirectory(szOutputDir); - } - - // Run CC - for (auto &file: pProject->files) - { - - bool bAreDependenciesUpdated = false; - CUtlString szOutputFile = GetOutputObjectName(pProject, hash, file); - CUtlVector args; - /* - CUtlString szTarget = pProject->m_target.GetTriplet(); - CUtlString szCompiledTarget = szTarget; - if (pProject->m_target.kernel == TARGET_KERNEL_ANDROID) - { - szCompiledTarget = CUtlString("%s%u", szTarget.GetString(), pProject->m_androidmanifest.m_nTargetVersion); - } - CUtlString szOutputFile = CUtlString("%s/%s/cc/%u_%s/%s/%s.o",FPC_TEMPORAL_DIRNAME, szTarget.GetString(), hash, pProject->m_szName.GetString(), filesystem2->BuildDirectory(), file.GetString()); - - args = { - "-target", - szCompiledTarget, - }; - */ - - /* - if (!strcmp(Plat_GetExtension(file),"cpp")) - args.AppendTail("-std=c++17"); - else if (!strcmp(Plat_GetExtension(file),"mm")) - ; - else - args.AppendTail("-std=c99"); - */ - - args = BuildCommandLine(pProject, file, szOutputFile); - - /* - if (pProject->m_target.kernel == TARGET_KERNEL_DARWIN) - { - args.AppendTail("-isysroot"); - args.AppendTail("/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk"); - } else if (pProject->m_target.kernel == TARGET_KERNEL_IOS) - { - args.AppendTail("-isysroot"); - args.AppendTail("/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk"); - args.AppendTail("-miphoneos-version-min=18.0 "); - args.AppendTail("-fembed-bitcode"); - } - */ - - if (!filesystem2->ShouldRecompile(file, szOutputFile)) - goto skipcompile; - else - V_printf(" CC %s\n", file.GetString()); - - runner->Run(GetCompilerExecutable(pProject), args); -skipcompile: - proj.objects.AppendTail((Object_t){szOutputFile}); - - ClangFile_t cfile = {}; - cfile.m_szName = file; - cfile.m_szArguments = args; - cfile.m_szArguments.AppendHead(GetCompilerExecutable(pProject)); - - g_clangFiles.AppendTail(cfile); - } - runner->Wait(); - return proj; -} - -void CClangCompiler::GenerateLinterData() -{ - CUtlVector jsonValues = {}; - FILE* f = V_fopen("compile_commands.json", "wb"); - for ( auto &f: g_clangFiles ) - { - IJSONObject *pFileObject = JSONManager()->CreateObject(); - IJSONValue *pFileValue = JSONManager()->CreateValue(); - IJSONArray *pArgumentFiles = JSONManager()->CreateArray(); - IJSONValue *pArgumentsValue = JSONManager()->CreateValue(); - IJSONValue *pFileNameValue = JSONManager()->CreateValue(); - IJSONValue *pDirectoryValue = JSONManager()->CreateValue(); - CUtlVector values; - - for (auto &arg: f.m_szArguments) - { - IJSONValue *pFileValue = JSONManager()->CreateValue(); - pFileValue->SetStringValue(arg.GetString()); - values.AppendTail(pFileValue); - } - pArgumentFiles->SetArray(values.GetSize(), values.GetData()); - pArgumentsValue->SetArrayValue(pArgumentFiles); - pFileNameValue->SetStringValue(f.m_szName.GetString()); - pDirectoryValue->SetStringValue(filesystem2->BuildDirectory()); - pFileObject->SetValue("arguments", pArgumentsValue); - pFileObject->SetValue("file", pFileNameValue); - pFileObject->SetValue("directory", pDirectoryValue); - pFileValue->SetObjectValue(pFileObject); - jsonValues.AppendTail(pFileValue); - }; - IJSONArray *pArray = JSONManager()->CreateArray(); - pArray->SetArray(jsonValues.GetSize(), jsonValues.GetData()); - IJSONValue *pRoot = JSONManager()->CreateValue(); - pRoot->SetArrayValue(pArray); - CUtlString szCommands = JSONManager()->WriteString(pRoot); - V_fprintf(f, szCommands.GetString()); - V_fclose(f); -}; diff --git a/fpc/library/clang/c_clang_cl.cpp b/fpc/library/clang/c_clang_cl.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/fpc/library/clang/c_libclang.cpp b/fpc/library/clang/c_libclang.cpp deleted file mode 100644 index c3c5b6d..0000000 --- a/fpc/library/clang/c_libclang.cpp +++ /dev/null @@ -1,65 +0,0 @@ - -#include "c_libclang.h" -#include "helper.h" -#include "tier1/interface.h" - -#include "clang-c/Index.h" -#include -#include - -class CClangBackend: public IClangBackend -{ -public: - virtual bool AreFileDependenciesUpdated( CUtlString szFile, CUtlString szOutputFile, CUtlString szHashFile, CUtlVector arguments ) override; - - bool bAnyOutdated; - CUtlString szCurrentFile; - CUtlString szHashFile; - -private: - static void InclusionVisitor( CXFile included_file, CXSourceLocation *include_stack, unsigned include_len, CXClientData client_data ); -}; - -EXPOSE_INTERFACE(CClangBackend, IClangBackend, CLANG_BACKEND_INTERFACE_NAME); - -bool CClangBackend::AreFileDependenciesUpdated( CUtlString szFile, CUtlString szOutputFile, CUtlString szHashFile, CUtlVector arguments ) -{ - szCurrentFile = szOutputFile; - bAnyOutdated = false; - - CUtlVector cArguments = {}; - for (auto &arg: arguments) - cArguments.AppendTail(arg); - - CXIndex index = clang_createIndex(0, 0); - CXTranslationUnit tu; - CXErrorCode err = clang_parseTranslationUnit2(index, szFile.GetString(), cArguments.GetData(), cArguments.GetSize(), NULL, 0, 0, &tu); - - if (err != CXError_Success) { - printf("clang_parseTranslationUnit2 failed with error code %d\n", err); - return false; - } - - clang_getInclusions(tu, CClangBackend::InclusionVisitor, NULL); - - clang_disposeTranslationUnit(tu); - clang_disposeIndex(index); - return bAnyOutdated; -} - -void CClangBackend::InclusionVisitor( CXFile included_file, CXSourceLocation *include_stack, unsigned include_len, CXClientData client_data ) -{ - if (((CClangBackend*)clangbackend)->bAnyOutdated) - return; - CXString filename = clang_getFileName(included_file); - - bool bUpdate = - filesystem2->ShouldRecompile(clang_getCString(filename), ((CClangBackend*)clangbackend)->szCurrentFile); - if (bUpdate) - { - ((CClangBackend*)clangbackend)->bAnyOutdated = true; - } - - clang_disposeString(filename); -} - diff --git a/fpc/library/clang/c_libclang.h b/fpc/library/clang/c_libclang.h deleted file mode 100644 index e726cd6..0000000 --- a/fpc/library/clang/c_libclang.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef C_LIBCLANG_H -#define C_LIBCLANG_H - -#include "tier0/platform.h" -#include "tier1/utlstring.h" - -#define CLANG_BACKEND_INTERFACE_NAME "ClangBackend001" - -abstract_class IClangBackend -{ -public: - virtual bool AreFileDependenciesUpdated( CUtlString szFile, CUtlString szOutputFile, CUtlString szHashFile, CUtlVector arguments ) = 0; -}; - -extern IClangBackend *clangbackend; - -#endif diff --git a/fpc/library/clang/ld.cpp b/fpc/library/clang/ld.cpp deleted file mode 100644 index b2c1802..0000000 --- a/fpc/library/clang/ld.cpp +++ /dev/null @@ -1,413 +0,0 @@ -#include "ld.h" -#include "helper.h" -#include "libgen.h" -#include "target.h" -#include "tier0/platform.h" -#include "tier1/interface.h" -#include "tier1/utlstring.h" - -class CClangLinker : public ILinker -{ -public: - //virtual CUtlString Link( LinkProject_t *pProject ) override; - virtual bool IsLibraryExists( CUtlString szName ) override; -protected: - //virtual CUtlVector BuildLinkCommandLine( LinkProject_t *pProject, const char *szFileName, const char *szOutputFileName ); - //virtual CUtlVector BuildArchiveCommandLine( LinkProject_t *pProject, const char *szFileName, const char *szOutputFileName ); - - // Returns executable which should the OS run - virtual const char *GetCompilerExecutable( LinkProject_t *pProject ) override; - - virtual void SetTarget( CUtlVector &cmd, LinkProject_t *pProject ) override; - virtual void SetSysroot( CUtlVector &cmd, LinkProject_t *pProject , const char *szSysroot ) override; - virtual void SetOutputFile( CUtlVector &cmd, const char *szName ) override; - - - // sets rpath - // for windows should be ignored - virtual void SetDefaultLibraryPaths( CUtlVector &cmd, LinkProject_t *pProject ) override; - - virtual void UseStdLib( CUtlVector &cmd, bool bUse ) override; - - // windows doesn't use it as well - virtual void UseDynamicLookup( CUtlVector &cmd, bool bUse ) override; - - // includes whole file - virtual void UseFullFile( CUtlVector &cmd, LinkProject_t *pProject ) override; - - // includes used stuff in a file - virtual void UsePartialFile( CUtlVector &cmd, LinkProject_t *pProject ) override; - - virtual void LinkFile( CUtlVector &cmd, const char *szName ) override; - virtual void LinkLibraryObject( CUtlVector &cmd, const char *szName ) override; - virtual void LinkLibrary( CUtlVector &cmd, const char *szName ) override; - virtual void LinkLibraryPath( CUtlVector &cmd, const char *szName ) override; -}; - - - -const char *CClangLinker::GetCompilerExecutable( LinkProject_t *pProject ) -{ - IINISection *pSection = NULL; - const char *szLinker = "clang++"; - if (!g_pConfig) - return szLinker; - - - pSection = g_pConfig->GetSection(pProject->m_target.GetTriplet()); - if (!pSection) - return szLinker; - - - szLinker = pSection->GetStringValue("CLANG_LINKER_INTERFACE_NAME"); - if (szLinker == NULL) - return "clang++"; - return szLinker; -} - - - -void CClangLinker::SetTarget( CUtlVector &cmd, LinkProject_t *pProject ) -{ - if (pProject->linkType == ELINK_DYNAMIC_LIBRARY) - cmd.AppendTail("-shared"); - - if (pProject->m_target.kernel == TARGET_KERNEL_IOS) - cmd.AppendTail("-fuse-ld=lld"); - - cmd.AppendTail("-target"); - cmd.AppendTail(pProject->m_target.GetTriplet()); -} - -void CClangLinker::SetSysroot( CUtlVector &cmd, LinkProject_t *pProject , const char *szName ) -{ - if (szName != NULL) - { - cmd.AppendTail("--sysroot"); - cmd.AppendTail(szName); - return; - } - - if (!g_pConfig) - return; - - - IINISection *pSection = g_pConfig->GetSection(pProject->m_target.GetTriplet()); - if (!pSection) - return; - - const char *szSysroot = pSection->GetStringValue("sysroot"); - if (szSysroot) - { - cmd.AppendTail("--sysroot"); - cmd.AppendTail(szSysroot); - } -} - -void CClangLinker::SetOutputFile( CUtlVector &cmd, const char *szName ) -{ - cmd.AppendTail("-o"); - cmd.AppendTail(szName); -} - -void CClangLinker::SetDefaultLibraryPaths( CUtlVector &cmd, LinkProject_t *pProject ) -{ - if (pProject->m_target.kernel & TARGET_KERNEL_LINUX) - { - cmd.AppendTail("-Wl,--disable-new-dtags"); - cmd.AppendTail("-Wl,-rpath,$ORIGIN"); - } -} - - -void CClangLinker::UseStdLib( CUtlVector &cmd, bool bUse ) -{ - if (!bUse) - cmd.AppendTail("-nostdlib"); -} - - -void CClangLinker::UseDynamicLookup( CUtlVector &cmd, bool bUse ) -{ - -} - - -void CClangLinker::UseFullFile( CUtlVector &cmd, LinkProject_t *pProject ) -{ - if (pProject->m_target.kernel != TARGET_KERNEL_IOS) - cmd.AppendTail("-Wl,--whole-archive"); -} - - -void CClangLinker::UsePartialFile( CUtlVector &cmd, LinkProject_t *pProject ) -{ - if (pProject->m_target.kernel != TARGET_KERNEL_IOS) - cmd.AppendTail("-Wl,--no-whole-archive"); -} - - -void CClangLinker::LinkFile( CUtlVector &cmd, const char *szName ) -{ - cmd.AppendTail(szName); -} - -void CClangLinker::LinkLibraryObject( CUtlVector &cmd, const char *szName ) -{ - CUtlString szDir = CUtlString(szName).GetDirectory(); - CUtlString szFileName = CUtlString(szName).GetFileName(); - if (!V_strncmp(szFileName, "lib",3)) - szFileName.RemoveHead(3); - if (!V_strncmp(szFileName.GetFileExtension(), "so",2)) - szFileName.RemoveTail(3); - if (!V_strncmp(szFileName.GetFileExtension(), "a",1)) - szFileName.RemoveTail(2); - cmd.AppendTail("-L"); - cmd.AppendTail(szDir); - cmd.AppendTail("-l"); - cmd.AppendTail(szFileName); -} - -void CClangLinker::LinkLibrary( CUtlVector &cmd, const char *szName ) -{ - cmd.AppendTail("-l"); - cmd.AppendTail(szName); -} - -void CClangLinker::LinkLibraryPath( CUtlVector &cmd, const char *szName ) -{ - cmd.AppendTail("-L"); - cmd.AppendTail(szName); -} - -EXPOSE_INTERFACE(CClangLinker, ILinker, CLANG_LINKER_INTERFACE_NAME); -/* -CUtlString CClangLinker::Link( LinkProject_t *pProject ) -{ - if (pProject->m_szName == 0) - { - Plat_FatalErrorFunc("m_szName must be present\n"); - } - - // Find a name for the file - CUtlString szFileName; - unsigned int hash = pProject->GenerateProjectHash(); - switch(pProject->linkType) - { - case ELINK_EXECUTABLE: - if (pProject->m_target.kernel == TARGET_KERNEL_WINDOWS) - szFileName = CUtlString("%s.exe", pProject->m_szName.GetString()); - else if (pProject->m_target.kernel == TARGET_KERNEL_ANDROID) - szFileName = CUtlString("lib%s.so", pProject->m_szName.GetString()); - else - szFileName = CUtlString("%s", pProject->m_szName.GetString()); - break; - case ELINK_STATIC_LIBRARY: - szFileName = CUtlString("lib%s.a", pProject->m_szName.GetString()); - break; - case ELINK_DYNAMIC_LIBRARY: - if (pProject->m_target.kernel == TARGET_KERNEL_DARWIN) - szFileName = CUtlString("lib%s.dylib", pProject->m_szName.GetString()); - if (pProject->m_target.kernel == TARGET_KERNEL_LINUX) - szFileName = CUtlString("lib%s.so", pProject->m_szName.GetString()); - break; - case ELINK_KERNEL_DRIVER: - Plat_FatalErrorFunc("TODO: not supported\n"); - break; - } - - CUtlString szTarget = pProject->m_target.GetTriplet(); - CUtlString szOutputFile = CUtlString("%s/%s/ld/%u_%s/%s",FPC_TEMPORAL_DIRNAME, szTarget.GetString(), hash, pProject->m_szName.GetString(), szFileName.GetString()); - CUtlString szOutputDir = szOutputFile; - szOutputDir = dirname(szOutputDir); - filesystem2->MakeDirectory(szOutputDir); - if (pProject->linkType == ELINK_STATIC_LIBRARY) - { - V_printf(" AR %s\n", pProject->m_szName.GetString()); - bool shouldRecompile = false; - CUtlVector args; - for (auto object: pProject->objects) - { - if (filesystem2->ShouldRecompile(object.m_szObjectFile,szOutputFile)) - { - shouldRecompile = true; - break; - } - } - if (!shouldRecompile) - goto compiled; - args = { - "rcs", - szOutputFile - }; - for (auto object: pProject->objects) - args.AppendTail(object.m_szObjectFile); - runner->Run("ar", args); - runner->Wait(); - - } else { - V_printf(" LINK %s\n", pProject->m_szName.GetString()); - bool shouldRecompile = false; - CUtlVector args; - - // Check if any of the files have changed - for (auto object: pProject->objects) - { - if (filesystem2->ShouldRecompile(object.m_szObjectFile,szOutputFile)) - { - shouldRecompile = true; - break; - } - } - if (!shouldRecompile) - goto compiled; - - - CUtlString szTarget = pProject->m_target.GetTriplet(); - CUtlString szCompiledTarget = szTarget; - if (pProject->m_target.kernel == TARGET_KERNEL_ANDROID) - { - szCompiledTarget = CUtlString("%s%u", szTarget.GetString(), pProject->m_androidmanifest.m_nTargetVersion); - } - args = { - "-o", - szOutputFile, - "-target", - szCompiledTarget, - }; - - // Disable stdlib - if (pProject->bNoStdLib) - { - args.AppendTail("-nostdlib"); - } - - // Sysroots - if (pProject->m_target.kernel == TARGET_KERNEL_DARWIN) - { - args.AppendTail("-isysroot"); - args.AppendTail("/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk"); - - // Shouldn't be here - args.AppendTail("-Wl,-export_dynamic"); - args.AppendTail("-undefined"); - args.AppendTail("dynamic_lookup"); - } - else if (pProject->m_target.kernel == TARGET_KERNEL_IOS) - { - args.AppendTail("-isysroot"); - args.AppendTail("/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk"); - // Shouldn't be here ? - args.AppendTail("-fembed-bitcode"); - args.AppendTail("-Wl,-rpath,@executable_path"); - args.AppendTail("-Wl,-all_load"); - args.AppendTail("-w"); - args.AppendTail("-miphoneos-version-min=18.0 "); - } - else if (pProject->m_target.kernel == TARGET_KERNEL_ANDROID) - { - // args.AppendTail(CUtlString("--sysroot=%s/sysroot", pProject->m_target.szSysroot)); - - // Shouldn't be here ? - args.AppendTail("-static-libstdc++"); - } - else if (pProject->m_target.szSysroot) - { - // args.AppendTail(CUtlString("--sysroot=%s", pProject->m_target.szSysroot)); - } - - // Magic for the systems - if (pProject->m_target.kernel == TARGET_KERNEL_WINDOWS) - { - args.AppendTail("-fuse-ld=ld"); - } - if (pProject->m_target.kernel == TARGET_KERNEL_LINUX || pProject->m_target.kernel == TARGET_KERNEL_ANDROID) - { - args.AppendTail("-Wl,--disable-new-dtags"); - args.AppendTail("-Wl,-rpath,$ORIGIN"); - } - - // Dynamic libraries - // Android can't run executables - if (pProject->linkType == ELINK_DYNAMIC_LIBRARY || pProject->m_target.kernel == TARGET_KERNEL_ANDROID) - { - args.AppendTail("-shared"); - } - - // All the objects - if (pProject->m_target.kernel == TARGET_KERNEL_WINDOWS || pProject->m_target.kernel == TARGET_KERNEL_LINUX || pProject->m_target.kernel == TARGET_KERNEL_ANDROID) - args.AppendTail("-Wl,--whole-archive"); - for (auto object: pProject->objects) - args.AppendTail(object.m_szObjectFile); - if (pProject->m_target.kernel == TARGET_KERNEL_WINDOWS || pProject->m_target.kernel == TARGET_KERNEL_LINUX || pProject->m_target.kernel == TARGET_KERNEL_ANDROID) - args.AppendTail("-Wl,--no-whole-archive"); - for (auto object: pProject->libraryObjects) - args.AppendTail(object); - - // Libraries - for (auto lib: pProject->libraries) - { - args.AppendTail("-l"); - args.AppendTail(lib); - } - for (auto lib: pProject->libraryDirectories) - { - args.AppendTail("-L"); - args.AppendTail(lib); - } - - // Apple frameworks - for (auto &directory: pProject->frameworkDirectories) - { - args.AppendTail("-F"); - args.AppendTail(directory); - } - for (auto &framework: pProject->frameworks) - { - args.AppendTail("-framework"); - args.AppendTail(framework); - } - - IINISection *pSection = NULL; - const char *szLinker; - const char *szSysroot; - if (!g_pConfig) - goto use_default_linker; - - - pSection = g_pConfig->GetSection(pProject->m_target.GetTriplet()); - if (!pSection) - goto use_default_linker; - szSysroot = pSection->GetStringValue("sysroot"); - if (szSysroot) - { - args.AppendTail("--sysroot"); - args.AppendTail(szSysroot); - } - - szLinker = pSection->GetStringValue("CLANG_LINKER_INTERFACE_NAME"); - if (szLinker) - { - runner->Run(szLinker, args); - } - - runner->Wait(); - - goto compiled; -use_default_linker: - runner->Run("clang++", args); - runner->Wait(); - } -compiled: - return szOutputFile; -}; -*/ -bool CClangLinker::IsLibraryExists( CUtlString szName ) -{ - szName = CUtlString("lib%s.so", szName.GetString()); - void *pLib = Plat_LoadLibrary(szName.GetString()); - if (!pLib) - return false; - Plat_UnloadLibrary(pLib); - return true; -} diff --git a/fpc/library/deploy.cpp b/fpc/library/deploy.cpp deleted file mode 100644 index 0e1bb2b..0000000 --- a/fpc/library/deploy.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "deploy.h" - - -class CDeployDeviceManager: public IDeployDeviceManager -{ -public: - virtual void AddDevice( IDeployDevice *pDevice ) override; - virtual IDeployDevice *FindDeviceByName( const char *szDeviceName ) override; - virtual const CUtlVector &ListDevices() override; -private: - CUtlVector m_devices; -}; - -static CDeployDeviceManager s_deviceManager; - -void CDeployDeviceManager::AddDevice( IDeployDevice *pDevice ) -{ - m_devices.AppendTail(pDevice); -} - -IDeployDevice *CDeployDeviceManager::FindDeviceByName( const char *szDeviceName ) -{ - for ( auto device: m_devices ) - { - if ( !V_strcmp(device->GetName(), szDeviceName) ) - return device; - } - return NULL; -} - -const CUtlVector &CDeployDeviceManager::ListDevices() -{ - return m_devices; -} - - -IDeployDeviceManager *DeployDeviceManager() -{ - return &s_deviceManager; -} diff --git a/fpc/library/helper.cpp b/fpc/library/helper.cpp deleted file mode 100644 index 50efd67..0000000 --- a/fpc/library/helper.cpp +++ /dev/null @@ -1,139 +0,0 @@ -#include "helper.h" -#include "runner.h" -#include "tier0/platform.h" -#include "tier1/utlvector.h" -#include "tier1/utlstring.h" -#include "unistd.h" -#include "libgen.h" -#include "sys/stat.h" -#include "tier1/interface.h" -#ifdef __APPLE__ -#include -#endif - -unsigned int g_hashState = 102851263; -unsigned int BaseProject_t::GenerateProjectHash( void ) -{ - unsigned int hash = 5381+g_hashState; - int c; - char *szName = m_szName; - - while( (c = *szName++) ) - hash = (hash * 33) + c; - - g_hashState = g_hashState * 1664525 + 1013904223; - - return hash; -}; - -static char path[1024]; -#ifdef __linux__ -static ssize_t pathSize = readlink("/proc/self/exe", path, sizeof(path) - 1); -#endif -#ifdef __APPLE__ -static uint32_t pathSize = sizeof(path); -static int pathResult = _NSGetExecutablePath(path, &pathSize); -#endif -static char *szPathDir = dirname(path); -static char *s_szBuildDir = 0; -EXPOSE_INTERFACE_GLOBALVAR(szBuildDir, char*, FILE_SYSTEM_2_BUILD_DIRECTORY_INTERFACE_VERSION, s_szBuildDir); - -class CPOSIXFileSystem2: public IFileSystem2 -{ -public: - virtual char *OwnDirectory() override; - virtual char *BuildDirectory() override; - virtual void MakeDirectory( const char *psz ) override; - virtual void CopyFile( const char *szDestination, const char *szOrigin ) override; - virtual void CopyDirectory( const char *szDestination, const char *szOrigin ) override; - virtual bool ShouldRecompile( const char *szSource, const char *szOutput ) override; - virtual char *GetWindowsPath( const char *szPath ) override; - virtual char *GetPOSIXPath( const char *szPath ) override; -}; - -char *CPOSIXFileSystem2::GetWindowsPath( const char *szPath ) -{ - char *szNewPath = (char*)V_malloc(V_strlen(szPath)+1); - int i = 0; - V_strcpy(szNewPath, szPath); - while(szNewPath[i]) - { - if (szNewPath[i] == '/') - szNewPath[i] = '\\'; - i++; - } - return szNewPath; -} - -char *CPOSIXFileSystem2::GetPOSIXPath( const char *szPath ) -{ - char *szNewPath = (char*)V_malloc(V_strlen(szPath)+1); - int i = 0; - V_strcpy(szNewPath, szPath); - while(szNewPath[i]) - { - if (szNewPath[i] == '\\') - szNewPath[i] = '/'; - i++; - } - return szNewPath; -} - -EXPOSE_INTERFACE(CPOSIXFileSystem2, IFileSystem2, FILE_SYSTEM_2_INTERFACE_NAME); -IFileSystem2 *filesystem2; - -char *CPOSIXFileSystem2::OwnDirectory() -{ - return szPathDir; -}; -char *CPOSIXFileSystem2::BuildDirectory() -{ - return s_szBuildDir; -}; - -void CPOSIXFileSystem2::CopyFile( const char *szDestination, const char *szOrigin ) -{ - CUtlVector args = { - szOrigin, - szDestination, - }; - runner->Run(CUtlString("cp"), args); - runner->Wait(); -} -void CPOSIXFileSystem2::CopyDirectory( const char *szDestination, const char *szOrigin ) -{ - CUtlVector args = { - "-r", - szOrigin, - szDestination, - }; - runner->Run("cp", args); - runner->Wait(); -} - -void CPOSIXFileSystem2::MakeDirectory( const char *psz ) -{ - CUtlVector args = { - "-p", - CUtlString(psz), - }; - runner->Run("mkdir", args); - runner->Wait(); -}; - -bool CPOSIXFileSystem2::ShouldRecompile(const char *szSource, const char *szOutput) -{ - struct stat srcbuf; - struct stat outbuf; - if (stat(szSource, &srcbuf) != 0) { - return true; - } - if (stat(szOutput, &outbuf) != 0) { - return true; - } - return outbuf.st_mtime < srcbuf.st_mtime; -}; - - -IINIFile *g_pConfig; -EXPOSE_INTERFACE_GLOBALVAR(IINIFile, IINIFile, LIBFPC_CONFIG_INTERFACE_VERSION, g_pConfig); diff --git a/fpc/library/ld.cpp b/fpc/library/ld.cpp deleted file mode 100644 index dea45e9..0000000 --- a/fpc/library/ld.cpp +++ /dev/null @@ -1,140 +0,0 @@ -#include "ld.h" - -ILinker *linker; - -void LinkProject_t::AddObject( Object_t object ) -{ - objects.AppendTail(object); -}; -CUtlString ILinker::GetOutputObjectName( LinkProject_t *pProject, unsigned int hash, CUtlString szFileName ) -{ - CUtlString szTarget = pProject->m_target.GetTriplet(); - CUtlString szFileNameFormat; - switch (pProject->linkType) - { - case ELINK_EXECUTABLE: - szFileNameFormat = CUtlString(pProject->m_target.GetExecutableFileFormat(),pProject->m_szName.GetString()); - break; - case ELINK_DYNAMIC_LIBRARY: - szFileNameFormat = CUtlString(pProject->m_target.GetDynamicLibraryFileFormat(),pProject->m_szName.GetString()); - break; - case ELINK_STATIC_LIBRARY: - szFileNameFormat = CUtlString(pProject->m_target.GetStaticLibraryFileFormat(),pProject->m_szName.GetString()); - break; - default: - break; - } - - return CUtlString( - "%s/%s/ld/%u_%s/%s", - FPC_TEMPORAL_DIRNAME, - szTarget.GetString(), - hash, - pProject->m_szName.GetString(), - szFileNameFormat.GetString()); -} - -CUtlString ILinker::Link( LinkProject_t *pProject ) -{ - if (pProject->m_szName == 0) - { - Plat_FatalErrorFunc("m_szName must be present\n"); - } - LinkProject_t stLinkProject = *pProject; - if (pProject->m_target.kernel == TARGET_KERNEL_ANDROID) - stLinkProject.linkType = ELINK_DYNAMIC_LIBRARY; - - unsigned int hash = pProject->GenerateProjectHash(); - CUtlString szOutputFile = GetOutputObjectName(&stLinkProject, hash, NULL); - filesystem2->MakeDirectory(szOutputFile.GetDirectory()); - - if (stLinkProject.linkType == ELINK_STATIC_LIBRARY) - { - CUtlVector args; - bool shouldRecompile = false; - for (auto object: pProject->objects) - { - if (filesystem2->ShouldRecompile(object.m_szObjectFile,szOutputFile)) - { - shouldRecompile = true; - break; - } - } - if (!shouldRecompile) - goto compiled; - - V_printf(" AR %s\n", pProject->m_szName.GetString()); - args = { - "rcs", - szOutputFile - }; - for (auto object: pProject->objects) - args.AppendTail(object.m_szObjectFile); - runner->Run("ar", args); - runner->Wait(); - } else { - bool shouldRecompile = false; - for (auto object: pProject->objects) - { - if (filesystem2->ShouldRecompile(object.m_szObjectFile,szOutputFile)) - { - shouldRecompile = true; - break; - } - } - for (auto object: pProject->libraryObjects) - { - if (filesystem2->ShouldRecompile(object,szOutputFile)) - { - shouldRecompile = true; - break; - } - } - if (!shouldRecompile) - goto compiled; - - V_printf(" LINK %s\n", pProject->m_szName.GetString()); - CUtlVector args; - args = BuildLinkCommandLine(pProject, szOutputFile); - runner->Run(GetCompilerExecutable(pProject), args); - runner->Wait(); - } -compiled: - return szOutputFile; -} - -CUtlVector ILinker::BuildLinkCommandLine( LinkProject_t *pProject, const char *szOutputFileName ) -{ - CUtlVector cmd; - SetTarget(cmd, pProject); - SetOutputFile(cmd, szOutputFileName); - SetSysroot(cmd, pProject, NULL); - SetDefaultLibraryPaths(cmd, pProject); - UseFullFile(cmd, pProject); - for (auto &o: pProject->objects) - { - LinkFile(cmd, o.m_szObjectFile); - } - UsePartialFile(cmd, pProject); - - for (auto &o: pProject->libraryObjects) - { - LinkLibraryObject(cmd, o); - }; - for (auto &o: pProject->libraries) - { - LinkLibrary(cmd, o); - }; - for (auto &o: pProject->libraryDirectories) - { - LinkLibraryPath(cmd, o); - }; - return cmd; - -} - -CUtlVector ILinker::BuildArchiveCommandLine( LinkProject_t *pProject, const char *szOutputFileName ) -{ - CUtlVector cmd; -} - diff --git a/fpc/library/libfpc.cpp b/fpc/library/libfpc.cpp deleted file mode 100644 index e7e481c..0000000 --- a/fpc/library/libfpc.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "helper.h" -#include "runner.h" -#include "c.h" -#include "ld.h" -#include "tier2/ifilesystem.h" - -IFileSystem *filesystem; - -void *LibFpcInit() -{ - filesystem2 = (IFileSystem2*)CreateInterface(FILE_SYSTEM_2_INTERFACE_NAME, NULL); - runner = (IRunner*)CreateInterface(RUNNER_INTERFACE_NAME, NULL); - ccompiler = (ICCompiler*)CreateInterface(CLANG_C_COMPILER_INTERFACE_NAME, NULL); - linker = (ILinker*)CreateInterface(CLANG_LINKER_INTERFACE_NAME, NULL); - - void *pFilesystem = Plat_LoadLibrary("libfilesystem_std.so"); - CreateInterfaceFn pFilesystemFactory = Sys_GetFactory(pFilesystem); - filesystem = (IFileSystem*)pFilesystemFactory(FILESYSTEM_INTERFACE_VERSION, NULL); - filesystem->Init(); - return NULL; -} - -EXPOSE_INTERFACE_FN(LibFpcInit, LibFpcInit, LIBFPC_INIT_INTERFACE_VERSION); diff --git a/fpc/library/runner.cpp b/fpc/library/runner.cpp deleted file mode 100644 index ef31573..0000000 --- a/fpc/library/runner.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include "runner.h" -#include "tier0/platform.h" -#include "tier1/interface.h" -#include "tier1/utlstring.h" -#include "tier1/utlvector.h" -#include "unistd.h" -#include "sys/wait.h" -#include "tier0/commandline.h" - -#include "winerunner.h" - - -CUtlVector m_processes; -class CPOSIXRunner: public IRunner -{ -public: - virtual int Run( CUtlString szName, CUtlVector& args ) override; - virtual int Run( CUtlString szName, CUtlString szDirectory, CUtlVector& args ) override; - virtual int Run( CUtlString szName, CUtlString szDirectory, CUtlVector& args, CUtlVector& environment ) override; - virtual int Wait( void ) override; -}; - -EXPOSE_INTERFACE(CPOSIXRunner, IRunner, RUNNER_INTERFACE_NAME); -IRunner *runner; -IWineRunner *winerunner; - -int CPOSIXRunner::Run(CUtlString szName, CUtlVector& args) -{ - pid_t pid = fork(); - if (pid < 0) - Plat_FatalErrorFunc("Failed to fork"); - /* child */ - if (pid == 0) - { - CUtlVector execargs; - execargs.AppendTail(szName); - if (CommandLine()->CheckParam("-fpcdebug")) - V_printf("%s",szName.GetString()); - for (auto &arg: args) - { - execargs.AppendTail(arg); - if (CommandLine()->CheckParam("-fpcdebug")) - V_printf(" %s",arg.GetString()); - } - if (CommandLine()->CheckParam("-fpcdebug")) - V_printf("\n"); - execargs.AppendTail(0); - if ( execvp(szName, (char *const*)execargs.GetData()) == -1 ) - { - V_printf("Failed to launch %s\n",szName.GetString()); - _exit(0); - } - } - m_processes.AppendTail(pid); - return 0; -} - -int CPOSIXRunner::Run(CUtlString szName, CUtlString szDirectory, CUtlVector& args) -{ - pid_t pid = fork(); - if (pid < 0) - Plat_FatalErrorFunc("Failed to fork"); - /* child */ - if (pid == 0) - { - CUtlVector execargs; - execargs.AppendTail(szName); - if (CommandLine()->CheckParam("-fpcdebug")) - V_printf("%s",szName.GetString()); - for (auto &arg: args) - { - execargs.AppendTail(arg); - if (CommandLine()->CheckParam("-fpcdebug")) - V_printf(" %s",arg.GetString()); - } - if (CommandLine()->CheckParam("-fpcdebug")) - V_printf("\n"); - execargs.AppendTail(0); - chdir(szDirectory.GetString()); - if ( execvp(szName, (char *const*)execargs.GetData()) == -1 ) - { - V_printf("Failed to launch %s\n",szName.GetString()); - _exit(0); - } - } - m_processes.AppendTail(pid); - /* parent */ - return 0; -} - -int CPOSIXRunner::Run(CUtlString szName, CUtlString szDirectory, CUtlVector& args, CUtlVector& environment) -{ - -} - -int CPOSIXRunner::Wait( void ) -{ - for (int i = 0; im_target.GetTriplet(); - - return CUtlString( - "%s/%s/swift/%u_%s/%s/%s%s", - FPC_TEMPORAL_DIRNAME, - szTarget.GetString(), - hash, - pProject->m_szName.GetString(), - filesystem2->BuildDirectory(), - szFileName.GetString(), - GetOutputObjectFormat()); -}; - -CUtlVector ISwiftCompiler::BuildCommandLine( SwiftProject_t *pProject, const char *szFileName, const char *szOutputFileName ) -{ - - CUtlVector cmd; - - EnableDebugSymbols(cmd); - if (pProject->bFPIC) - EnablePIC(cmd); - if (pProject->bFPIE) - EnablePIE(cmd); - SetTarget(cmd, pProject); - SetOutputFile(cmd, szOutputFileName); - SetSysroot(cmd, pProject, NULL); - CompileFile(cmd, szFileName); - for (auto ¯o: pProject->macros) - Macro(cmd, macro.szName, macro.szValue.GetString()); - for (auto &dir: pProject->includeDirectories) - IncludeDirectory(cmd, dir); - - return cmd; -} - -LinkProject_t ISwiftCompiler::Compile( SwiftProject_t *pProject ) -{ - if (pProject->m_szName == 0) - { - Plat_FatalErrorFunc("m_szName must be present\n"); - } - - LinkProject_t proj = {}; - proj.m_szName = pProject->m_szName; - proj.m_target = pProject->m_target; - proj.m_androidmanifest = pProject->m_androidmanifest; - unsigned int hash = pProject->GenerateProjectHash(); - - - // Get output directories - for (auto &file: pProject->files) - { - CUtlString szOutputFile = GetOutputObjectName(pProject, hash, file); - CUtlString szOutputDir = szOutputFile.GetDirectory(); - filesystem2->MakeDirectory(szOutputDir); - } - - // Run CC - for (auto &file: pProject->files) - { - CUtlString szOutputFile = GetOutputObjectName(pProject, hash, file); - CUtlVector args; - - args = BuildCommandLine(pProject, file, szOutputFile); - if (!filesystem2->ShouldRecompile(file, szOutputFile)) - goto skipcompile; - else - V_printf(" SWIFT %s\n", file.GetString()); - runner->Run(GetCompilerExecutable(pProject), args); -skipcompile: - proj.objects.AppendTail((Object_t){szOutputFile}); - } - runner->Wait(); - return proj; -} - -ISwiftCompiler *swiftcompiler = NULL; diff --git a/fpc/library/target.cpp b/fpc/library/target.cpp deleted file mode 100644 index e85885d..0000000 --- a/fpc/library/target.cpp +++ /dev/null @@ -1,257 +0,0 @@ -#include "target.h" -#include "tier0/commandline.h" -#include "tier1/utlstring.h" -#include "sys/utsname.h" - -// see Target_t::HostTarget -#if defined(__i386__) && defined(POSIX) -static utsname s_uname; -static int s_iuNameRes = uname(&s_uname); -#endif - -//----------------------------------------------------------------------------- -// Generates triplet suitable for most compilers. -//----------------------------------------------------------------------------- -CUtlString Target_t::GetTriplet() -{ - CUtlString triplet = ""; - - triplet.AppendTail(StringFromCPU(cpu)); - triplet.AppendTail("-"); - triplet.AppendTail(StringFromKernel(kernel)); - - if ( abi != TARGET_ABI_UNDEFINED && abi != TARGET_ABI_DEFAULT ) - { - triplet.AppendTail("-"); - triplet.AppendTail(StringFromABI(abi)); - } - - - return triplet; -} - -const char *Target_t::GetExecutableFileFormat() -{ - if (kernel & TARGET_KERNEL_POSIX) - return "%s"; - - if (kernel & TARGET_KERNEL_WINDOWS_DEVICES) - { - return "%s.exe"; - } - return NULL; -} - -const char *Target_t::GetStaticLibraryFileFormat() -{ - if (kernel & TARGET_KERNEL_POSIX) - return "lib%s.a"; - - if (kernel & TARGET_KERNEL_WINDOWS_DEVICES) - { - switch(abi) - { - case TARGET_ABI_MSVC: - return "%s.lib"; - default: - return "lib%s.a"; - } - } - return NULL; -} -const char *Target_t::GetDynamicLibraryFileFormat() -{ - if (kernel & TARGET_KERNEL_LINUX_DEVICES) - return "lib%s.so"; - if (kernel & TARGET_KERNEL_APPLE_DEVICES) - return "lib%s.dylib"; - if (kernel & TARGET_KERNEL_WINDOWS_DEVICES) - return "lib%s.dylib"; - return NULL; -} -//---------------------------------------------------------------------------- -// Returns target on which fpc is being run -// -// For targets such as i386, i486, i586 -//---------------------------------------------------------------------------- -Target_t Target_t::HostTarget() -{ - ETargetKernel kernel = TARGET_KERNEL_UNDEFINED; -#if defined(__linux__) - kernel = TARGET_KERNEL_LINUX; -#elif defined(__APPLE__) - kernel TARGET_KERNEL_DARWIN; -#endif -ETargetCPU cpu = TARGET_CPU_UNDEFINED; -#if defined(__x86_64__) - cpu = TARGET_CPU_AMD64; -#endif -#if defined(__i386__) - cpu = TARGET_CPU_80386; -#endif -// POSIX doesn't know about these -// use uname to get them -#if defined(__i386__) && defined(POSIX) - if (!V_strcmp("i486", s_uname.machine)) - cpu = TARGET_CPU_80486; - if (!V_strcmp("i586", s_uname.machine)) - cpu = TARGET_CPU_80586; - if (!V_strcmp("i686", s_uname.machine)) - cpu = TARGET_CPU_80686; -#endif - ETargetABI abi = TARGET_ABI_GNU; - -#ifdef FPC_ARCH - cpu = CPUFromString(FPC_ARCH); -#endif -#ifdef FPC_OS - kernel = KernelFromString(FPC_OS); -#endif -#ifdef FPC_ABI - abi = ABIFromString(FPC_ABI); -#endif - - - return { - .kernel = kernel, - .cpu = cpu, - .abi = abi, - .optimization = TARGET_DEBUG, - }; -}; - -//----------------------------------------------------------------------------- -// Returns default target for build, by default it will be host target -//----------------------------------------------------------------------------- -Target_t Target_t::DefaultTarget() -{ - CUtlString szDevice = CommandLine()->ParamValue("-device"); - CUtlString szOS = CommandLine()->ParamValue("-os"); - CUtlString szArch = CommandLine()->ParamValue("-arch"); - CUtlString szAbi = CommandLine()->ParamValue("-abi"); - - ETargetKernel kernel = KernelFromString(szOS); - ETargetCPU cpu = CPUFromString(szArch); - ETargetABI abi = ABIFromString(szAbi); - if (cpu == TARGET_CPU_UNDEFINED) - cpu = HostTarget().cpu; - if (kernel == TARGET_KERNEL_UNDEFINED) - kernel = HostTarget().kernel; - if (abi == TARGET_ABI_UNDEFINED) - abi = HostTarget().abi; - - - return { - .kernel = kernel, - .cpu = cpu, - .abi = abi, - .optimization = TARGET_DEBUG, - }; -} -const char *Target_t::StringFromCPU( ETargetCPU cpu ) -{ - if ( cpu == TARGET_CPU_AMD64 ) - return "x86_64"; - if ( cpu == TARGET_CPU_80386 ) - return "i386"; - if ( cpu == TARGET_CPU_80486 ) - return "i486"; - if ( cpu == TARGET_CPU_80586 ) - return "i586"; - if ( cpu == TARGET_CPU_80686 ) - return "i686"; - if ( cpu == TARGET_CPU_AARCH64 ) - return "aarch64"; - if ( cpu == TARGET_CPU_WASM32 ) - return "wasm32"; - return NULL; -} - -const char *Target_t::StringFromKernel( ETargetKernel kernel ) -{ - if ( kernel == TARGET_KERNEL_UNKNOWN ) - return "unknown-unknown"; - if ( kernel == TARGET_KERNEL_UNKNOWN_LINUX ) - return "unknown-linux"; - if ( kernel == TARGET_KERNEL_PC_LINUX ) - return "pc-linux"; - if ( kernel == TARGET_KERNEL_ALPINE_LINUX ) - return "alpine-linux"; - if ( kernel == TARGET_KERNEL_WINDOWS ) - return "pc-windows"; - if ( kernel == TARGET_KERNEL_DARWIN ) - return "apple-darwin"; - if ( kernel == TARGET_KERNEL_IOS ) - return "apple-ios"; - if ( kernel == TARGET_KERNEL_ANDROID ) - return "linux-android"; - if ( kernel == TARGET_KERNEL_WASI ) - return "unknown-wasi"; - if ( kernel == TARGET_KERNEL_EMSCRIPTEN ) - return "unknown-emscripten"; - return NULL; -} - -const char *Target_t::StringFromABI( ETargetABI abi ) -{ - if ( abi == TARGET_ABI_GNU ) - return "gnu"; - if ( abi == TARGET_ABI_MUSL ) - return "musl"; - return NULL; -} - -ETargetCPU Target_t::CPUFromString( const char *szName ) -{ - CUtlString szUtlName = szName; - if ( szUtlName == "x86_64" ) - return TARGET_CPU_AMD64; - else if ( szUtlName == "i386" ) - return TARGET_CPU_80386; - else if ( szUtlName == "i486" ) - return TARGET_CPU_80486; - else if ( szUtlName == "i586" ) - return TARGET_CPU_80586; - else if ( szUtlName == "i686" ) - return TARGET_CPU_80686; - else if ( szUtlName == "aarch64" ) - return TARGET_CPU_AARCH64; - else if ( szUtlName == "wasm32" ) - return TARGET_CPU_WASM32; - return TARGET_CPU_UNDEFINED; -} - -ETargetKernel Target_t::KernelFromString( const char *szName ) -{ - CUtlString szUtlName = szName; - if ( szUtlName == "unknown" ) - return TARGET_KERNEL_UNKNOWN; - else if ( szUtlName == "windows" ) - return TARGET_KERNEL_WINDOWS; - else if ( szUtlName == "linux" ) - return TARGET_KERNEL_LINUX; - else if ( szUtlName == "unknown-linux" ) - return TARGET_KERNEL_UNKNOWN_LINUX; - else if ( szUtlName == "pc-linux" ) - return TARGET_KERNEL_PC_LINUX; - else if ( szUtlName == "alpine-linux" ) - return TARGET_KERNEL_ALPINE_LINUX; - else if ( szUtlName == "macos" ) - return TARGET_KERNEL_DARWIN; - else if ( szUtlName == "ios" ) - return TARGET_KERNEL_IOS; - else if ( szUtlName == "android" ) - return TARGET_KERNEL_ANDROID; - return TARGET_KERNEL_UNDEFINED; -} - -ETargetABI Target_t::ABIFromString( const char *szName ) -{ - CUtlString szUtlName = szName; - if ( szUtlName == "gnu" ) - return TARGET_ABI_GNU; - else if ( szUtlName == "musl" ) - return TARGET_ABI_MUSL; - return TARGET_ABI_UNDEFINED; -} - diff --git a/fpc/library/windows/c.cpp b/fpc/library/windows/c.cpp deleted file mode 100644 index 8e4395f..0000000 --- a/fpc/library/windows/c.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include "tier0/mem.h" -#include "winerunner.h" -#include "c.h" -#include "helper.h" -#include "obj.h" -#include "target.h" -#include "tier0/lib.h" -#include "tier0/mem.h" -#include "tier0/platform.h" -#include "tier0/commandline.h" -#include "tier1/interface.h" -#include "tier1/utlstring.h" -#include "tier1/utlvector.h" -#include "libgen.h" -#include "ctype.h" - -struct ClangFile_t -{ - CUtlString m_szName; - CUtlVector m_szArguments; -}; - -class CMSVCCompiler : public ICCompiler -{ -public: - - virtual void GenerateLinterData() override; -protected: - - virtual CUtlVector BuildCommandLine( CProject_t *pProject, const char *szFileName, const char *szOutputFileName ) override; - - // Returns executable which should the OS run - virtual const char *GetCompilerExecutable( CProject_t *pProject ) override; - - // returns object file format, eg .obj or .o - virtual const char *GetOutputObjectFormat() override; - - virtual void IncludeDirectory( CUtlVector &cmd, const char *szName ) override; - virtual void IncludeFile( CUtlVector &cmd, const char *szName ) override; - virtual void Macro( CUtlVector &cmd, const char *szName ) override; - virtual void Macro( CUtlVector &cmd, const char *szName, const char *szValue ) override; - - virtual void SetTarget( CUtlVector &cmd, CProject_t *pProject ) override; - virtual void SetSysroot( CUtlVector &cmd, CProject_t *pProject , const char *szSysroot ) override; - virtual void SetOutputFile( CUtlVector &cmd, const char *szName ) override; - virtual void CompileFile( CUtlVector &cmd, const char *szName ) override; - - virtual void EnableDebugSymbols( CUtlVector &cmd ) override; - virtual void EnablePIE( CUtlVector &cmd ) override; - virtual void EnablePIC( CUtlVector &cmd ) override; -}; - -const char *CMSVCCompiler::GetOutputObjectFormat() -{ - return ".o"; -} - -CUtlVector CMSVCCompiler::BuildCommandLine( CProject_t *pProject, const char *szFileName, const char *szOutputFileName ) -{ - CUtlVector cmd; - cmd = ICCompiler::BuildCommandLine(pProject, szFileName, szOutputFileName); - cmd.AppendHead("/c"); - return cmd; -} - - -const char *CMSVCCompiler::GetCompilerExecutable( CProject_t *pProject ) -{ - if (!g_pConfig) - Plat_FatalErrorFunc(".fpccfg was not found\n"); - static IINISection *pSection = g_pConfig->GetSection("MSVC_C_COMPILER_INTERFACE_NAME"); - if (!pSection) - Plat_FatalErrorFunc("MSVC_C_COMPILER_INTERFACE_NAME was not found in .fpccfg\n"); - static CUtlString szExePath = pSection->GetStringValue("exe"); - return szExePath; -} - - -void CMSVCCompiler::IncludeDirectory( CUtlVector &cmd, const char *szName ) -{ - cmd.AppendTail(CUtlString("/I%s",szName)); -} - -void CMSVCCompiler::IncludeFile( CUtlVector &cmd, const char *szName ) -{ -} - -void CMSVCCompiler::Macro( CUtlVector &cmd, const char *szName ) -{ -} - -void CMSVCCompiler::Macro( CUtlVector &cmd, const char *szName, const char *szValue ) -{ - cmd.AppendTail(CUtlString("/D%s=%s", (char*)szName, (char*)szValue)); -} - -void CMSVCCompiler::EnableDebugSymbols( CUtlVector &cmd ) -{ -} - -void CMSVCCompiler::SetTarget( CUtlVector &cmd, CProject_t *pProject ) -{ - -} - -void CMSVCCompiler::SetSysroot( CUtlVector &cmd, CProject_t *pProject , const char *szSysroot ) -{ - -} - -void CMSVCCompiler::CompileFile( CUtlVector &cmd, const char *szName ) -{ - cmd.AppendTail(szName); -} -void CMSVCCompiler::SetOutputFile( CUtlVector &cmd, const char *szName ) -{ - cmd.AppendTail("/Fo"); - cmd.AppendTail(szName); -} -void CMSVCCompiler::EnablePIE( CUtlVector &cmd ) -{ -} - -void CMSVCCompiler::EnablePIC( CUtlVector &cmd ) -{ -} - - -EXPOSE_INTERFACE(CMSVCCompiler, ICCompiler, MSVC_C_COMPILER_INTERFACE_NAME); - -void CMSVCCompiler::GenerateLinterData() -{ - /* - FILE* f = V_fopen("compile_commands.json", "wb"); - V_fprintf(f, "[\n"); - uint32_t i = 0; - for (auto &file: g_clangFiles) - { - V_fprintf(f, "\t{\n"); - V_fprintf(f, "\t\t\"arguments\": [\n"); - for (auto &arg: file.m_szArguments) - V_fprintf(f, "\t\t\t\"%s\",\n",arg.GetString()); - - V_fseek(f, -2, SEEK_CUR); - V_fprintf(f, "\n\t\t],\n"); - V_fprintf(f, "\t\t\"file\": \"%s\",\n", file.m_szName.GetString()); - V_fprintf(f, "\t\t\"directory\": \"%s\"\n", filesystem2->BuildDirectory()); - V_fprintf(f, "\t},\n"); - }; - V_fseek(f, -2, SEEK_CUR); - V_fprintf(f, "\n]\n"); - V_fclose(f); - */ -}; - diff --git a/fpc/library/windows/ld.cpp b/fpc/library/windows/ld.cpp deleted file mode 100644 index db4f9f3..0000000 --- a/fpc/library/windows/ld.cpp +++ /dev/null @@ -1,264 +0,0 @@ -#include "ld.h" -#include "helper.h" -#include "libgen.h" -#include "target.h" -#include "tier0/platform.h" -#include "tier1/interface.h" -#include "tier1/utlstring.h" -#include "tier2/fileformats/ini.h" -#include "winerunner.h" - -class CMSVCLinker : public ILinker -{ -public: - virtual CUtlString Link( LinkProject_t *pProject ) override; - virtual bool IsLibraryExists( CUtlString szName ) override; -protected: - // Returns executable which should the OS run - virtual const char *GetCompilerExecutable( LinkProject_t *pProject ) override; - - virtual void SetTarget( CUtlVector &cmd, LinkProject_t *pProject ) override; - virtual void SetSysroot( CUtlVector &cmd, LinkProject_t *pProject , const char *szSysroot ) override; - virtual void SetOutputFile( CUtlVector &cmd, const char *szOutput) override; - - - // sets rpath - // for windows should be ignored - virtual void SetDefaultLibraryPaths( CUtlVector &cmd, LinkProject_t *pProject ) override; - - virtual void UseStdLib( CUtlVector &cmd, bool bUse ) override; - - // windows doesn't use it as well - virtual void UseDynamicLookup( CUtlVector &cmd, bool bUse ) override; - - // includes whole file - virtual void UseFullFile( CUtlVector &cmd, LinkProject_t *pProject ) override; - - // includes used stuff in a file - virtual void UsePartialFile( CUtlVector &cmd, LinkProject_t *pProject ) override; - - virtual void LinkFile( CUtlVector &cmd, const char *szName ) override; - virtual void LinkLibraryObject( CUtlVector &cmd, const char *szName ) override; - virtual void LinkLibrary( CUtlVector &cmd, const char *szName ) override; - virtual void LinkLibraryPath( CUtlVector &cmd, const char *szName ) override; -}; - -const char *CMSVCLinker::GetCompilerExecutable( LinkProject_t *pProject ) -{ - -} - -void CMSVCLinker::SetTarget( CUtlVector &cmd, LinkProject_t *pProject ) -{ - -} - -void CMSVCLinker::SetSysroot( CUtlVector &cmd, LinkProject_t *pProject , const char *szSysroot ) -{ - -} - -void CMSVCLinker::SetOutputFile( CUtlVector &cmd, const char *szName ) -{ - -} - -void CMSVCLinker::SetDefaultLibraryPaths( CUtlVector &cmd, LinkProject_t *pProject ) -{ - -} - - -void CMSVCLinker::UseStdLib( CUtlVector &cmd, bool bUse ) -{ - -} - - -void CMSVCLinker::UseDynamicLookup( CUtlVector &cmd, bool bUse ) -{ - -} - - -void CMSVCLinker::UseFullFile( CUtlVector &cmd, LinkProject_t *pProject ) -{ - -} - - -void CMSVCLinker::UsePartialFile( CUtlVector &cmd, LinkProject_t *pProject ) -{ - -} - - -void CMSVCLinker::LinkFile( CUtlVector &cmd, const char *szName ) -{ - -} - -void CMSVCLinker::LinkLibraryObject( CUtlVector &cmd, const char *szName ) -{ - -} - -void CMSVCLinker::LinkLibrary( CUtlVector &cmd, const char *szName ) -{ - -} - -void CMSVCLinker::LinkLibraryPath( CUtlVector &cmd, const char *szName ) -{ - -} - -EXPOSE_INTERFACE(CMSVCLinker, ILinker, MSVC_LINKER_INTERFACE_NAME); - -CUtlString CMSVCLinker::Link( LinkProject_t *pProject ) -{ - if (pProject->m_szName == 0) - { - Plat_FatalErrorFunc("m_szName must be present\n"); - } - - if (pProject->m_target.kernel != TARGET_KERNEL_WINDOWS) - { - Plat_FatalErrorFunc("target must be TARGET_KERNEL_WINDOWS\n"); - } - - // Find a name for the file - CUtlString szFileName; - unsigned int hash = pProject->GenerateProjectHash(); - switch(pProject->linkType) - { - case ELINK_EXECUTABLE: - szFileName = CUtlString("%s.exe", pProject->m_szName.GetString()); - case ELINK_STATIC_LIBRARY: - szFileName = CUtlString("lib%s.a", pProject->m_szName.GetString()); - break; - case ELINK_DYNAMIC_LIBRARY: - szFileName = CUtlString("%s.dll", pProject->m_szName.GetString()); - break; - case ELINK_KERNEL_DRIVER: - szFileName = CUtlString("%s.sys", pProject->m_szName.GetString()); - break; - } - - CUtlString szTarget = pProject->m_target.GetTriplet(); - CUtlString szOutputFile = CUtlString("%s/%s/ld/%u_%s/%s",FPC_TEMPORAL_DIRNAME, szTarget.GetString(), hash, pProject->m_szName.GetString(), szFileName.GetString()); - CUtlString szOutputDir = szOutputFile; - szOutputDir = dirname(szOutputDir); - filesystem2->MakeDirectory(szOutputDir); - - if (!g_pConfig) - Plat_FatalErrorFunc(".fpccfg was not found\n"); - IINISection *pSection = g_pConfig->GetSection("MSVC_LINKER_INTERFACE_NAME"); - if (!pSection) - Plat_FatalErrorFunc("MSVC_LINKER_INTERFACE_NAME was not found in .fpccfg\n"); - CUtlString szExePath = pSection->GetStringValue("exe"); - if (!pSection) - Plat_FatalErrorFunc("exe was not found in MSVC_LINKER_INTERFACE_NAME\n"); - - if (pProject->linkType == ELINK_STATIC_LIBRARY) - { - V_printf(" AR %s\n", pProject->m_szName.GetString()); - bool shouldRecompile = false; - CUtlVector args; - for (auto object: pProject->objects) - { - if (filesystem2->ShouldRecompile(object.m_szObjectFile,szOutputFile)) - { - shouldRecompile = true; - break; - } - } - if (!shouldRecompile) - goto compiled; - args = { - "rcs", - szOutputFile - }; - for (auto object: pProject->objects) - args.AppendTail(object.m_szObjectFile); - runner->Run("ar", args); - runner->Wait(); - - } else { - V_printf(" LINK %s\n", pProject->m_szName.GetString()); - bool shouldRecompile = false; - CUtlVector args; - - // Check if any of the files have changed - for (auto object: pProject->objects) - { - if (filesystem2->ShouldRecompile(object.m_szObjectFile,szOutputFile)) - { - shouldRecompile = true; - break; - } - } - if (!shouldRecompile) - goto compiled; - - - CUtlString szTarget = pProject->m_target.GetTriplet(); - CUtlString szCompiledTarget = szTarget; - if (pProject->m_target.kernel == TARGET_KERNEL_ANDROID) - { - szCompiledTarget = CUtlString("%s%u", szTarget.GetString(), pProject->m_androidmanifest.m_nTargetVersion); - } - - args = { - "/nologo" - }; - - const char *szWindowsPath = filesystem2->GetWindowsPath(szOutputFile); - args.AppendTail(CUtlString("/out:%s", szWindowsPath)); - V_free((void*)szWindowsPath); - - if (pProject->linkType == ELINK_KERNEL_DRIVER) - { - args.AppendTail("/driver"); - args.AppendTail(CUtlString("/entry:%s", pProject->szEntry)); - } - switch (pProject->m_eWindowsSubsystem) - { - case WINDOWS_SUBSYSTEM_NATIVE: - args.AppendTail("/subsystem:native"); - default: - break; - } - - // Disable stdlib - if (pProject->bNoStdLib) - { - } - - for (auto object: pProject->objects) - args.AppendTail(object.m_szObjectFile); - - for (auto lib: pProject->libraries) - { - /* - args.AppendTail("-l"); - args.AppendTail(lib); - */ - } - - winerunner->Run(szExePath, args); - winerunner->Wait(); - } -compiled: - return szOutputFile; -}; - -bool CMSVCLinker::IsLibraryExists( CUtlString szName ) -{ - szName = CUtlString("%s.dll", szName.GetString()); - void *pLib = Plat_LoadLibrary(szName.GetString()); - if (!pLib) - return false; - Plat_UnloadLibrary(pLib); - return true; -} diff --git a/fpc/library/windows/runner.cpp b/fpc/library/windows/runner.cpp deleted file mode 100644 index 3eeeb50..0000000 --- a/fpc/library/windows/runner.cpp +++ /dev/null @@ -1,101 +0,0 @@ -#include "runner.h" -#include "tier0/platform.h" -#include "tier0/commandline.h" -#include "tier1/interface.h" -#include "tier1/utlstring.h" -#include "tier1/utlvector.h" -#include "windows.h" - - -class CWindowsRunner: public IRunner -{ -public: - virtual int Run( CUtlString szName, CUtlVector& args ) override; - virtual int Run( CUtlString szName, CUtlString szDirectory, CUtlVector& args ) override; - virtual int Run( CUtlString szName, CUtlString szDirectory, CUtlVector& args, CUtlVector& environment ) override; - virtual int Wait( void ) override; - CUtlVector s_processes = {}; -}; - -EXPOSE_INTERFACE(CWindowsRunner, IRunner, POSIX_RUNNER_INTERFACE_NAME); -IRunner *runner; - -int CWindowsRunner::Run(CUtlString szName, CUtlVector& args) -{ - pid_t pid = fork(); - if (pid < 0) - Plat_FatalErrorFunc("Failed to fork"); - /* child */ - if (pid == 0) - { - CUtlVector execargs; - execargs.AppendTail(szName); - if (CommandLine()->CheckParam("-fpcdebug")) - V_printf("%s",szName.GetString()); - for (auto &arg: args) - { - execargs.AppendTail(arg); - if (CommandLine()->CheckParam("-fpcdebug")) - V_printf(" %s",arg.GetString()); - } - if (CommandLine()->CheckParam("-fpcdebug")) - V_printf("\n"); - execargs.AppendTail(0); - if ( execvp(szName, (char *const*)execargs.GetData()) == -1 ) - { - V_printf("Failed to launch %s\n",szName.GetString()); - _exit(0); - } - } - s_processes.AppendTail(pid); - return 0; -} - -int CWindowsRunner::Run(CUtlString szName, CUtlString szDirectory, CUtlVector& args) -{ - pid_t pid = fork(); - if (pid < 0) - Plat_FatalErrorFunc("Failed to fork"); - /* child */ - if (pid == 0) - { - CUtlVector execargs; - execargs.AppendTail(szName); - if (CommandLine()->CheckParam("-fpcdebug")) - V_printf("%s",szName.GetString()); - for (auto &arg: args) - { - execargs.AppendTail(arg); - if (CommandLine()->CheckParam("-fpcdebug")) - V_printf(" %s",arg.GetString()); - } - if (CommandLine()->CheckParam("-fpcdebug")) - V_printf("\n"); - execargs.AppendTail(0); - chdir(szDirectory.GetString()); - if ( execvp(szName, (char *const*)execargs.GetData()) == -1 ) - { - V_printf("Failed to launch %s\n",szName.GetString()); - _exit(0); - } - } - s_processes.AppendTail(pid); - /* parent */ - return 0; -} - -int CWindowsRunner::Run(CUtlString szName, CUtlString szDirectory, CUtlVector& args, CUtlVector& environment) -{ - -} - -int CWindowsRunner::Wait( void ) -{ - for (auto &process: s_processes) - { - int status; - pid_t wpid = waitpid(process, &status, 0); - } - s_processes = {}; - return 0; -}; diff --git a/fpc/library/windows/windres.cpp b/fpc/library/windows/windres.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/fpc/library/winerunner.cpp b/fpc/library/winerunner.cpp deleted file mode 100644 index 7602f0a..0000000 --- a/fpc/library/winerunner.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include "runner.h" -#include "winerunner.h" -#include "tier0/platform.h" -#include "tier1/interface.h" -#include "tier1/utlstring.h" -#include "tier1/utlvector.h" -#include "unistd.h" -#include "sys/wait.h" -#include "tier0/commandline.h" - -class CWineRunner: public IWineRunner -{ -public: - CWineRunner(); - ~CWineRunner(); - - virtual int Run( CUtlString szName, CUtlVector& args ) override; - virtual int Run( CUtlString szName, CUtlString szDirectory, CUtlVector& args ) override; - virtual int Run( CUtlString szName, CUtlString szDirectory, CUtlVector& args, CUtlVector& environment ) override; - virtual int Wait( void ) override; -private: - pid_t m_wineServerPID; -}; - -EXPOSE_INTERFACE(CWineRunner, IWineRunner, WINE_RUNNER_INTERFACE_NAME); - -CWineRunner::CWineRunner() -{ - -} -CWineRunner::~CWineRunner() -{ - -} - -int CWineRunner::Run(CUtlString szName, CUtlVector& args) -{ - return runner->Run(szName, args); -} - -int CWineRunner::Run(CUtlString szName, CUtlString szDirectory, CUtlVector& args) -{ - CUtlVector args2 = args; - args2.AppendHead(szName); - return runner->Run("wine", szDirectory, args2); -} - -int CWineRunner::Run(CUtlString szName, CUtlString szDirectory, CUtlVector& args, CUtlVector& environment) -{ - CUtlVector args2 = args; - args2.AppendHead(szName); - return runner->Run("wine", szDirectory, args2, environment); -} - -int CWineRunner::Wait( void ) -{ - return runner->Wait(); -}; diff --git a/fpc/main.cpp b/fpc/main.cpp deleted file mode 100644 index 7d9cb6c..0000000 --- a/fpc/main.cpp +++ /dev/null @@ -1,173 +0,0 @@ -#include "tier0/platform.h" -#include "tier0/rand.h" -#include "tier0/commandline.h" -#include "tier1/interface.h" -#include "tier1/utlvector.h" -#include "tier1/utlstring.h" -#include "tier2/ifilesystem.h" -#include "tier2/fileformats/ini.h" -#include "public/c.h" -#include "public/helper.h" -#include "public/ld.h" -#include "public/target.h" -#include "runner.h" -#include "winerunner.h" -#include "c.h" -#include "signal.h" -#include "libgen.h" -#include "builder.h" - -CUtlString owndir; -static char **pszBuildDir; - -void build_tier0() -{ - -}; - -int build() -{ - BuildFile_t *pBuildFile = ProjectBuilder()->BuildProject("main",CUtlString("%s/build.cpp",*pszBuildDir)); - - /* - - LinkProject_t linkScriptProject = ccompiler->Compile(&compileScriptProject); - linkScriptProject.linkType = ELINK_DYNAMIC_LIBRARY; - linkScriptProject.m_target = Target_t::HostTarget(); - - CUtlString script = linker->Link(&linkScriptProject); - - - void *scriptDLL = Plat_LoadLibrary(script); - pBuildFactory = Sys_GetFactory(scriptDLL); - - - pBuildFactory = NULL; - pBuildFileInfo = (BuildFileInfo_t*)pBuildFactory(BUILD_FILE_INFO_INTERFACE_NAME, NULL); - if (!pBuildFactory) - Plat_FatalErrorFunc("Failed to find build file info interface\n"); - - auto PreinitFn = (void(*)())Plat_GetProc(scriptDLL, "Preinit"); - if (PreinitFn) - PreinitFn(); - - for (auto &build: pBuildFileInfo->m_stages) - { - build->m_pMainFn(); - }; - */ - - ccompiler->GenerateLinterData(); - - return 0; -}; - - -void IEngine_Signal(int sig) -{ - switch (sig) - { - case SIGSEGV: - case SIGILL: - case SIGABRT: - Plat_Backtrace(); - Plat_FatalErrorFunc("Fault\n"); - break; - case SIGINT: - Plat_Exit(0); - break; - default: - break; - }; - Plat_Exit(0); -}; - -IRunner *runner; -IWineRunner *winerunner; -ICCompiler *ccompiler; -ILinker *linker; - - -int main(int c, char **v) -{ - - char path[1024]; - - CUtlString buildcppDir = Plat_GetWorkingDir(); - owndir = buildcppDir; - char *szBuildcppDir = buildcppDir.GetString(); - -findbuild: - FILE* file = V_fopen("build.cpp", "rb"); - if (!file) - { - buildcppDir = buildcppDir.GetDirectory(); - if (buildcppDir=="/") - { - V_printf("build.cpp not found\n"); - return 0; - } - Plat_SetWorkingDir(szBuildcppDir); - goto findbuild; - } else { - V_fclose(file); - } - - #ifdef __linux - signal(SIGHUP, IEngine_Signal); - signal(SIGINT, IEngine_Signal); - signal(SIGQUIT, IEngine_Signal); - signal(SIGILL, IEngine_Signal); - signal(SIGTRAP, IEngine_Signal); - signal(SIGIOT, IEngine_Signal); - signal(SIGBUS, IEngine_Signal); - signal(SIGFPE, IEngine_Signal); - signal(SIGSEGV, IEngine_Signal); - signal(SIGTERM, IEngine_Signal); - #endif - - - void *pLibFPC = Plat_LoadLibrary("libfpc.so"); - CreateInterfaceFn pLibFPCFactory = Sys_GetFactory(pLibFPC); - - filesystem2 = (IFileSystem2*)pLibFPCFactory(FILE_SYSTEM_2_INTERFACE_NAME, NULL); - pszBuildDir = (char**)pLibFPCFactory(FILE_SYSTEM_2_BUILD_DIRECTORY_INTERFACE_VERSION, NULL); - *pszBuildDir = szBuildcppDir; - runner = (IRunner*)pLibFPCFactory(RUNNER_INTERFACE_NAME, NULL); - winerunner = (IWineRunner*)pLibFPCFactory(WINE_RUNNER_INTERFACE_NAME, NULL); - ccompiler = (ICCompiler*)pLibFPCFactory(CLANG_C_COMPILER_INTERFACE_NAME, NULL); - linker = (ILinker*)pLibFPCFactory(CLANG_LINKER_INTERFACE_NAME, NULL); - - - - pLibFPCFactory(LIBFPC_INIT_INTERFACE_VERSION, NULL); - - - void *pFilesystem = Plat_LoadLibrary("libfilesystem_std.so"); - CreateInterfaceFn pFilesystemFactory = Sys_GetFactory(pFilesystem); - - filesystem = (IFileSystem*)pFilesystemFactory(FILESYSTEM_INTERFACE_VERSION, NULL); - filesystem->Init(); - - g_pConfig = INIManager()->ReadFile(".fpccfg"); - - IINIFile **ppConfig = (IINIFile**)pLibFPCFactory(LIBFPC_CONFIG_INTERFACE_VERSION, NULL); - *ppConfig = g_pConfig; - - CommandLine()->CreateCommandLine(c, v); - Plat_InitRandom(); - - if (CommandLine()->CheckParam("-v") || CommandLine()->CheckParam("--version")) - { - V_printf("fpc version v1\n"); - V_printf("built " __DATE__ " " __TIME__ "\n"); - V_printf("built for %s\n", Target_t::HostTarget().GetTriplet().GetString()); - return 0; - } - - if (CommandLine()->CheckParam("build")) - build(); - const char *szDeployDevice = CommandLine()->ParamValue("deploy"); - Plat_ShutdownRandom(); - return 0; -}; diff --git a/fpc/public/apktool.h b/fpc/public/apktool.h deleted file mode 100644 index 8a64624..0000000 --- a/fpc/public/apktool.h +++ /dev/null @@ -1,45 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Set Android metadata aboth the package. -//===========================================================================// - -#ifndef APK_TOOL_H -#define APK_TOOL_H - -#include "tier0/platform.h" -#include "tier1/utlstring.h" -#include "legal.h" - -struct AndroidManifest_t -{ -public: - void SetPackageVersion( CUtlString szVersion ); - void SetPackageBuild( uint64_t nBuild ); - void SetPackageID( CUtlString szPackageID ); - void SetPackageName( CUtlString szPackageName ); - - void SetTargetSDKVersion( uint64_t nTargetVersion ); - void SetMinSDKVersion( uint64_t nMinVersion ); - - void AddUserFeature( CUtlString szName, bool bIsRequired, uint64_t nVersion ); - void AddUserLibrary( CUtlString szPath ); - CUtlString BuildManifest(); - - CUtlString m_szPackageName; - CUtlString m_szPackageID; - uint64_t m_nBuild; - CUtlString m_szVersion; - - uint64_t m_nTargetVersion; - uint64_t m_nMinVersion; -}; - -abstract_class IAPKTool -{ -public: - virtual CUtlString BuildPackage( AndroidManifest_t manifest, CUtlString szManifestDir ) = 0; - virtual CUtlString SignPackage( const char *szApk, LegalInfo_t *pLegalInfo, const char *szAlias, const char *szStorePassword, const char *szKeyPassword ) = 0; -}; - -IAPKTool *APKTool(); - -#endif diff --git a/fpc/public/appletool.h b/fpc/public/appletool.h deleted file mode 100644 index 18f0040..0000000 --- a/fpc/public/appletool.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef Apple_TOOL_H -#define Apple_TOOL_H - -#include "tier0/platform.h" -#include "tier1/utlstring.h" -#include "legal.h" - -struct AppleManifest_t -{ -public: - void SetPackageID( CUtlString szPackageID ); - void SetPackageName( CUtlString szPackageName ); - void SetPackageExecutable( CUtlString szPackageExecutable ); - - CUtlString BuildManifest(); - - CUtlString m_szPackageName; - CUtlString m_szPackageID; - CUtlString m_szPackageExecutable; -}; - -abstract_class IAppleTool -{ -public: - virtual CUtlString BuildPackage( AppleManifest_t manifest, CUtlString szManifestDir ) = 0; - virtual CUtlString SignPackage( const char *szIpa, const char *szPassword ) = 0; -}; - - -IAppleTool *AppleTool(); - -#endif - diff --git a/fpc/public/builder.h b/fpc/public/builder.h deleted file mode 100644 index c9f75d7..0000000 --- a/fpc/public/builder.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef BUILDER_H -#define BUILDER_H - -#include "tier1/interface.h" -#include "tier1/utlvector.h" -#include "tier1/utlstring.h" - -struct BuildOutput_t -{ - const char *m_szName; -}; - -struct BuildOutputs_t -{ - const char *m_szBuildStageName; - CUtlVector m_buildOutputs; -}; - -struct BuildFile_t -{ - CUtlString m_szOutputFile; - void *m_pLibrary; - CUtlVector m_compiledProjects; - - struct BuildFile_t *m_pNext; -}; - -abstract_class IProjectBuilder -{ -public: - virtual BuildFile_t *BuildProject( const char *szProjectName, const char *szPath ) = 0; -}; - -IProjectBuilder *ProjectBuilder(); - -#define PROJECT_BUILDER_INTERFACE_NAME "ProjectBuilder001" - -#endif diff --git a/fpc/public/c.h b/fpc/public/c.h deleted file mode 100644 index ae996e3..0000000 --- a/fpc/public/c.h +++ /dev/null @@ -1,128 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: C, C++, Objective-C and Objective-C++ compiler interface. -//===========================================================================// - -#ifndef C_H -#define C_H - -#include "tier0/platform.h" -#include "tier1/utlstring.h" -#include "tier1/utlvector.h" -#include "runner.h" -#include "ld.h" -#include "target.h" -#include "helper.h" - -struct C_Macro_t -{ - CUtlString szName; - CUtlString szValue; -}; - - -// Target C version -enum ECVersion -{ - CVERSION_89, - CVERSION_99 = 0, - CVERSION_11, - CVERSION_17, - CVERSION_23, - CVERSION_2Y, -}; - -// Target C++ version -enum ECPPVersion -{ - CPPVERSION_98 = 0, - CPPVERSION_11 = 1, - CPPVERSION_14 = 2, - CPPVERSION_17 = 3, - CPPVERSION_20 = 4, - CPPVERSION_23 = 5, - CPPVERSION_2C = 6, -}; - -//---------------------------------------------------------------------------- -// C project settings used in compilation -// Example usage: -// CProject_t compileProject = {}; -// LinkProject_t ldProject = {}; -// -// compileProject.m_szName = "your project name"; -// compileProject.files = g_CompiledFiles; -// compileProject.includeDirectories = g_IncludeDirectories; -// ldProject = ccompiler->Compile(&compileProject); -//---------------------------------------------------------------------------- -struct CProject_t : public CPUProject_t -{ -public: - // Compiled files - CUtlVector files = {}; - - // Included directories - CUtlVector includeDirectories = {}; - - // Included files - // They are included on top of the file - CUtlVector includeFiles = {}; - - // Defined macros - CUtlVector macros = {}; - - // Target C version - ECVersion cVersion; - - // Target C++ version - ECPPVersion cppVersion; -}; - -// Basic interface name -#define C_COMPILER_INTERFACE_NAME "CCompiler001" -#define CLANG_C_COMPILER_INTERFACE_NAME "Clang" C_COMPILER_INTERFACE_NAME -#define GNU_C_COMPILER_INTERFACE_NAME "GNU" C_COMPILER_INTERFACE_NAME -#define MSVC_C_COMPILER_INTERFACE_NAME "MSVC" C_COMPILER_INTERFACE_NAME - -class ICCompiler -{ -public: - - // Compiles all files into objects, returns linker project, - // which can be linked into executable or library. - virtual LinkProject_t Compile( CProject_t *pProject ); - - virtual void GenerateLinterData() = 0; -protected: - // Compiler internals - - // Returns file name of the - CUtlString GetOutputObjectName( CProject_t *pProject, unsigned int hash, CUtlString szFileName ); - - virtual CUtlVector BuildCommandLine( CProject_t *pProject, const char *szFileName, const char *szOutputFileName ); - - // Returns executable which should the OS run - virtual const char *GetCompilerExecutable( CProject_t *pProject ) = 0; - - // returns object file format, eg .obj or .o - virtual const char *GetOutputObjectFormat() = 0; - - virtual void IncludeDirectory( CUtlVector &cmd, const char *szName ) = 0; - virtual void IncludeFile( CUtlVector &cmd, const char *szName ) = 0; - virtual void Macro( CUtlVector &cmd, const char *szName ) = 0; - virtual void Macro( CUtlVector &cmd, const char *szName, const char *szValue ) = 0; - - virtual void SetTarget( CUtlVector &cmd, CProject_t *pProject ) = 0; - virtual void SetSysroot( CUtlVector &cmd, CProject_t *pProject , const char *szSysroot ) = 0; - virtual void SetOutputFile( CUtlVector &cmd, const char *szName ) = 0; - - virtual void CompileFile( CUtlVector &cmd, const char *szName ) = 0; - - virtual void EnableDebugSymbols( CUtlVector &cmd ) = 0; - virtual void EnablePIE( CUtlVector &cmd ) = 0; - virtual void EnablePIC( CUtlVector &cmd ) = 0; - -}; - -extern ICCompiler *ccompiler; - -#endif diff --git a/fpc/public/deploy.h b/fpc/public/deploy.h deleted file mode 100644 index 9cb4f7e..0000000 --- a/fpc/public/deploy.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef DEPLOY_H -#define DEPLOY_H - -#include "tier0/platform.h" -#include "tier1/utlstring.h" - -abstract_class IDeployDevice -{ -public: - virtual const char *GetName() = 0; - virtual void *Install( const char *szPath ) = 0; -}; - -abstract_class IDeployDeviceManager -{ -public: - virtual void AddDevice( IDeployDevice *pDevice ) = 0; - virtual IDeployDevice *FindDeviceByName( const char *szDeviceName ) = 0; - virtual const CUtlVector &ListDevices() = 0; -}; - -IDeployDeviceManager *DeployDeviceManager(); - - -#endif diff --git a/fpc/public/generator.h b/fpc/public/generator.h deleted file mode 100644 index e69de29..0000000 diff --git a/fpc/public/helper.h b/fpc/public/helper.h deleted file mode 100644 index 6bce7f8..0000000 --- a/fpc/public/helper.h +++ /dev/null @@ -1,164 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Helper functions for compilers, filesystem2 and build stages. -//===========================================================================// - -#ifndef HELPER_H -#define HELPER_H - -#include "apktool.h" -#include "tier1/utlstring.h" -#include "target.h" -#include "tier2/fileformats/ini.h" -#include "tier1/interface.h" - -#define FPC_TEMPORAL_DIRNAME ".fpc" - -//----------------------------------------------------------------------------- -// A base for all projects -//----------------------------------------------------------------------------- -struct BaseProject_t -{ -public: - CUtlString m_szName; - // Creates a hash for the project - unsigned int GenerateProjectHash( void ); -}; - -//----------------------------------------------------------------------------- -// A base for cpu projects -//----------------------------------------------------------------------------- -struct CPUProject_t : public BaseProject_t -{ -public: - Target_t m_target = Target_t::DefaultTarget(); - - // Is compiled as position independent executable - bool bFPIE = false; - - // Is compiled as position independent code - // Use for shared libraries - bool bFPIC = false; - - // TODO: rework manifests - // Android manifest - AndroidManifest_t m_androidmanifest = {}; -}; - -//----------------------------------------------------------------------------- -// A base for shader projects -//----------------------------------------------------------------------------- -struct ShaderProject_t : public BaseProject_t -{ -public: - EShaderTarget m_eTarget; -}; - -//----------------------------------------------------------------------------- -// File system manager. -//----------------------------------------------------------------------------- -#define FILE_SYSTEM_2_INTERFACE_NAME "FileSystem2_001" -#define FILE_SYSTEM_2_BUILD_DIRECTORY_INTERFACE_VERSION "FileSystem2BuildDirectory_001" - -abstract_class IFileSystem2 -{ -public: - // Returns a directory of fpc executable - virtual char *OwnDirectory() = 0; - - // Returns directory of build.cpp - virtual char *BuildDirectory() = 0; - - // Creates new directory at path - virtual void MakeDirectory( const char *psz ) = 0; - - // UNIX-style file copy - virtual void CopyFile( const char *szDestination, const char *szOrigin ) = 0; - - // UNIX-style recursive directory copy - virtual void CopyDirectory( const char *szDestination, const char *szOrigin ) = 0; - - // Compares timestamps of 2 files - virtual bool ShouldRecompile( const char *szSource, const char *szOutput ) = 0; - - virtual char *GetWindowsPath( const char *szPath ) = 0; - virtual char *GetPOSIXPath( const char *szPath ) = 0; -}; - -extern IFileSystem2 *filesystem2; - -struct StageOutput_t -{ - const char *m_szName; - CUtlString m_szPath; -}; - -//----------------------------------------------------------------------------- -// Build stage. -//----------------------------------------------------------------------------- -class CBuildStage -{ -public: - CBuildStage( const char *psz, int(*pMainFn)() ); - const char *m_psz; - CUtlString m_szPath; - CUtlVector m_outputs; - int(*m_pMainFn)(); -}; - - -class CBuildDependentFile -{ -public: - CBuildDependentFile( const char *psz ); -}; - -//----------------------------------------------------------------------------- -// Declares new build stage. -// example: -// DECLARE_BUILD_STAGE(your_build_stage_name) -// { -// return 0; -// } -//----------------------------------------------------------------------------- -#define DECLARE_BUILD_STAGE(sz) \ -static int __build_stage_##sz(); \ -static CBuildStage __##sz##_build_stage(#sz, __build_stage_##sz); \ -static int __build_stage_##sz() - -#define ADD_DEPENDENCY_BUILD_FILE(name, path) \ -static CBuildDependentFile __##name##DependencyFile(path); - -#define ADD_OUTPUT_OBJECT(sz, path) \ - g_pCurrentStage->m_outputs.AppendTail((StageOutput_t){sz, path}); - -#define DEPEND_ON_PROJECT(sz) \ - -#define GET_PROJECT_LIBRARY(sz, szLib) \ - FPC_GetProjectObject(#sz, szLib) - - -struct BuildFileInfo_t -{ - CUtlVector m_dependantFiles; - CUtlVector m_stages; -}; - -BuildFileInfo_t *GetBuildFileInfo(); -extern CBuildStage *g_pCurrentStage; - -CUtlString FPC_GetProjectObject( const char *szName, const char *szObjectName ); - - -#define BUILD_FILE_INFO_INTERFACE_VERSION "BuildFileInfo001" -#define BUILD_CURRENT_STAGE_INTERFACE_VERSION "BuildCurrentStage001" - -typedef CUtlString(*GetProjectObjectFn)( const char *szName, const char *szObjectName ); -#define BUILD_GET_PROJECT_OBJECT_INTERFACE_VERSION "GetProjectObject001" - -#define LIBFPC_INIT_INTERFACE_VERSION "LibFPCInit001" - - -extern IINIFile *g_pConfig; -#define LIBFPC_CONFIG_INTERFACE_VERSION "LibFPCConfig001" - -#endif diff --git a/fpc/public/iostool.h b/fpc/public/iostool.h deleted file mode 100644 index d6004ea..0000000 --- a/fpc/public/iostool.h +++ /dev/null @@ -1,26 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Automatic signature generator for iOS, Android and other devices, -// which require signed executables, files etc. -//===========================================================================// - -#ifndef SIGN_TOOL_H -#define SIGN_TOOL_H - -#include "tier0/platform.h" -#include "tier1/utlstring.h" - -#define APPLE_SIGN_TOOL_INTERFACE_NAME "SignToolApple001" -#define ANDROID_SIGN_TOOL_INTERFACE_NAME "SignToolAndroid001" - -abstract_class ISignTool -{ -public: - virtual void SetSignPassword( CUtlString szPassword ) = 0; - virtual void SignFile( CUtlString szFile ) = 0; - virtual void SignDirectory( CUtlString szDirectory ) = 0; -}; - -extern ISignTool *signtool_android; -extern ISignTool *signtool_apple; - -#endif diff --git a/fpc/public/ld.h b/fpc/public/ld.h deleted file mode 100644 index f4d1de7..0000000 --- a/fpc/public/ld.h +++ /dev/null @@ -1,135 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Linker interface. -//===========================================================================// - -#ifndef LD_H -#define LD_H - - -#include "runner.h" -#include "helper.h" -#include "obj.h" -#include "tier0/platform.h" -#include "tier1/utlstring.h" - -enum ELinkType -{ - ELINK_EXECUTABLE, - ELINK_DYNAMIC_LIBRARY, - ELINK_STATIC_LIBRARY, - - // drivers - ELINK_KERNEL_DRIVER -}; - -enum EWindowsSubsystem -{ - WINDOWS_SUBSYSTEM_NATIVE, -}; - -//---------------------------------------------------------------------------- -// C project settings used in compilation -// Example usage: -// CProject_t compileProject = {}; -// LinkProject_t ldProject = {}; -// CUtlString szOutputFile; -// -// compileProject.m_szName = "your_project_name"; -// compileProject.files = g_CompiledFiles; -// compileProject.includeDirectories = g_IncludeDirectories; -// -// ldProject = ccompiler->Compile(&compileProject); -// ldProject.linkType = ELINK_EXECUTABLE -// szOutputFile = linker->Link(&ldProject); -// -//---------------------------------------------------------------------------- -struct LinkProject_t: public CPUProject_t -{ -public: - void AddObject( Object_t object ); - - // output file - ELinkType linkType; - - // objects, they could be libraries and compiled files - CUtlVector objects = {}; - - // system libraries - CUtlVector libraries ={}; - - // directories for libraries - CUtlVector libraryDirectories = {}; - - // not used - CUtlVector libraryObjects = {}; - - // Apple framework directories - CUtlVector frameworkDirectories = {}; - - const char *szEntry = ""; - - // Disables C standart library - bool bNoStdLib; - - // Apple frameworks - CUtlVector frameworks = {}; - - // Windows subsystem - EWindowsSubsystem m_eWindowsSubsystem; -}; - -// Basic interface name -#define LINKER_INTERFACE_NAME "Linker001" -#define CLANG_LINKER_INTERFACE_NAME "Clang" LINKER_INTERFACE_NAME -#define MSVC_LINKER_INTERFACE_NAME "MSVC" LINKER_INTERFACE_NAME - -abstract_class ILinker -{ -public: - - // Links project - virtual CUtlString Link( LinkProject_t *pProject ); - - virtual bool IsLibraryExists( CUtlString szName ) = 0; - -protected: - // Link - // Returns file name of the - CUtlString GetOutputObjectName( LinkProject_t *pProject, unsigned int hash, CUtlString szFileName ); - - virtual CUtlVector BuildLinkCommandLine( LinkProject_t *pProject, const char *szOutputFileName ); - virtual CUtlVector BuildArchiveCommandLine( LinkProject_t *pProject, const char *szOutputFileName ); - - // Returns executable which should the OS run - virtual const char *GetCompilerExecutable( LinkProject_t *pProject ) = 0; - - virtual void SetTarget( CUtlVector &cmd, LinkProject_t *pProject ) = 0; - virtual void SetSysroot( CUtlVector &cmd, LinkProject_t *pProject , const char *szSysroot ) = 0; - virtual void SetOutputFile( CUtlVector &cmd, const char *szName ) = 0; - - - // sets rpath - // for windows should be ignored - virtual void SetDefaultLibraryPaths( CUtlVector &cmd, LinkProject_t *pProject ) = 0; - - virtual void UseStdLib( CUtlVector &cmd, bool bUse ) = 0; - - // windows doesn't use it as well - virtual void UseDynamicLookup( CUtlVector &cmd, bool bUse ) = 0; - - // includes whole file - virtual void UseFullFile( CUtlVector &cmd, LinkProject_t *pProject ) = 0; - - // includes used stuff in a file - virtual void UsePartialFile( CUtlVector &cmd, LinkProject_t *pProject ) = 0; - - virtual void LinkFile( CUtlVector &cmd, const char *szName ) = 0; - virtual void LinkLibraryObject( CUtlVector &cmd, const char *szName ) = 0; - virtual void LinkLibrary( CUtlVector &cmd, const char *szName ) = 0; - virtual void LinkLibraryPath( CUtlVector &cmd, const char *szName ) = 0; - -}; - -extern ILinker *linker; - -#endif diff --git a/fpc/public/legal.h b/fpc/public/legal.h deleted file mode 100644 index 9097751..0000000 --- a/fpc/public/legal.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef LEGAL_H -#define LEGAL_H - -struct LegalInfo_t -{ - const char *FirstName; - const char *LastName; - const char *OrganizationalUnitName; - const char *OrganizationName; - const char *City; - const char *State; - const char *CountryCode; -}; - - -#endif diff --git a/fpc/public/lsp.h b/fpc/public/lsp.h deleted file mode 100644 index af98124..0000000 --- a/fpc/public/lsp.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef LSP_H -#define LSP_H - -#include "tier0/platform.h" - -abstract_class IBasicLSP -{ - virtual void GenerateConfig() = 0; -}; - -#endif diff --git a/fpc/public/obj.h b/fpc/public/obj.h deleted file mode 100644 index b4b32b3..0000000 --- a/fpc/public/obj.h +++ /dev/null @@ -1,17 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Object handler. -//===========================================================================// - -#ifndef OBJ_H -#define OBJ_H - -#include "tier1/utlstring.h" - -struct Object_t -{ -public: - CUtlString m_szObjectFile; - CUtlString m_szSourceFile; -}; - -#endif diff --git a/fpc/public/runner.h b/fpc/public/runner.h deleted file mode 100644 index ff079ed..0000000 --- a/fpc/public/runner.h +++ /dev/null @@ -1,27 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Executable runner. It is mainly used to run compilers and linkers, -// but can be used to run anything with given executable name -//===========================================================================// - -#ifndef RUNNER_H -#define RUNNER_H - -#include "tier0/platform.h" -#include "tier1/utlvector.h" -#include "tier1/utlstring.h" - -#define RUNNER_INTERFACE_NAME "Runner001" - -abstract_class IRunner -{ -public: - virtual int Run( CUtlString szName, CUtlVector& args ) = 0; - virtual int Run( CUtlString szName, CUtlString szDirectory, CUtlVector& args ) = 0; - virtual int Run( CUtlString szName, CUtlString szDirectory, CUtlVector& args, CUtlVector& environment ) = 0; - virtual int Wait( void ) = 0; -}; - - -extern IRunner *runner; - -#endif diff --git a/fpc/public/signer.h b/fpc/public/signer.h deleted file mode 100644 index d822e08..0000000 --- a/fpc/public/signer.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef SIGNER_H -#define SIGNER_H - -#include "c.h" -#include "ld.h" -#include "helper.h" -#include "tier0/platform.h" -#include "tier1/interface.h" -#include "tier0/platform.h" - -#endif diff --git a/fpc/public/slang.h b/fpc/public/slang.h deleted file mode 100644 index e69de29..0000000 diff --git a/fpc/public/swift.h b/fpc/public/swift.h deleted file mode 100644 index 41df23d..0000000 --- a/fpc/public/swift.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef SWIFT_H -#define SWIFT_H - -#include "tier0/platform.h" -#include "tier1/utlstring.h" -#include "tier1/utlvector.h" -#include "runner.h" -#include "ld.h" -#include "c.h" -#include "target.h" -#include "helper.h" - -struct SwiftProject_t : public CPUProject_t -{ -public: - // Compiled files - CUtlVector files = {}; - - // Included directories - CUtlVector includeDirectories = {}; - - // Included files - CUtlVector includeObjcFiles = {}; - - // Stuff for embedded objc - // Included files - // They are included on top of the file - CUtlVector includeFiles = {}; - - // Stuff for embedded objc - // Defined macros - CUtlVector macros = {}; - - // Stuff for embedded objc - // Target C version - ECVersion cVersion; - - // Stuff for embedded objc - // Target C++ version - ECPPVersion cppVersion; -}; - -#define SWIFT_COMPILER_INTERFACE_VERSION "SwiftCompiler001" - -class ISwiftCompiler -{ -public: - - // Compiles all files into objects, returns linker project, - // which can be linked into executable or library. - virtual LinkProject_t Compile( SwiftProject_t *pProject ); - - //virtual void GenerateLinterData() = 0; -protected: - // Compiler internals - - // Returns file name of the - CUtlString GetOutputObjectName( SwiftProject_t *pProject, unsigned int hash, CUtlString szFileName ); - - virtual CUtlVector BuildCommandLine( SwiftProject_t *pProject, const char *szFileName, const char *szOutputFileName ); - - // Returns executable which should the OS run - virtual const char *GetCompilerExecutable( SwiftProject_t *pProject ) = 0; - - // returns object file format, eg .obj or .o - virtual const char *GetOutputObjectFormat() = 0; - - virtual void IncludeDirectory( CUtlVector &cmd, const char *szName ) = 0; - virtual void IncludeFile( CUtlVector &cmd, const char *szName ) = 0; - virtual void Macro( CUtlVector &cmd, const char *szName ) = 0; - virtual void Macro( CUtlVector &cmd, const char *szName, const char *szValue ) = 0; - - virtual void SetTarget( CUtlVector &cmd, SwiftProject_t *pProject ) = 0; - virtual void SetSysroot( CUtlVector &cmd, SwiftProject_t *pProject , const char *szSysroot ) = 0; - virtual void SetOutputFile( CUtlVector &cmd, const char *szName ) = 0; - - virtual void CompileFile( CUtlVector &cmd, const char *szName ) = 0; - - virtual void EnableDebugSymbols( CUtlVector &cmd ) = 0; - virtual void EnablePIE( CUtlVector &cmd ) = 0; - virtual void EnablePIC( CUtlVector &cmd ) = 0; -}; - - -extern ISwiftCompiler *swiftcompiler; - -#endif diff --git a/fpc/public/sysrootfetch.h b/fpc/public/sysrootfetch.h deleted file mode 100644 index 50c55b1..0000000 --- a/fpc/public/sysrootfetch.h +++ /dev/null @@ -1,3 +0,0 @@ -#ifndef SYSROOT_FETCH_H -#define SYSROOT_FETCH_H -#endif diff --git a/fpc/public/target.h b/fpc/public/target.h deleted file mode 100644 index 0520c51..0000000 --- a/fpc/public/target.h +++ /dev/null @@ -1,94 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Target manager for compilers. -//===========================================================================// - -#ifndef TARGET_T -#define TARGET_T - -#include "tier0/commandline.h" -#include "tier1/utlstring.h" - -enum ETargetKernel -{ - TARGET_KERNEL_UNDEFINED, - TARGET_KERNEL_UNKNOWN = 1, - - TARGET_KERNEL_WINDOWS_DEVICES = 0x100, - TARGET_KERNEL_WINDOWS, - - TARGET_KERNEL_POSIX = 0x10000, - TARGET_KERNEL_LINUX_DEVICES = TARGET_KERNEL_POSIX | 0x1000, - TARGET_KERNEL_UNKNOWN_LINUX, - TARGET_KERNEL_LINUX = TARGET_KERNEL_UNKNOWN_LINUX, - TARGET_KERNEL_ALPINE_LINUX, - TARGET_KERNEL_PC_LINUX, - TARGET_KERNEL_ANDROID, - TARGET_KERNEL_APPLE_DEVICES = TARGET_KERNEL_POSIX | 0x2000, - TARGET_KERNEL_DARWIN, - TARGET_KERNEL_IOS, - - TARGET_KERNEL_WEB_DEVICES = 0x400, - TARGET_KERNEL_WASI, - TARGET_KERNEL_EMSCRIPTEN, -}; - -enum ETargetCPU -{ - TARGET_CPU_UNDEFINED, - TARGET_CPU_80386, - TARGET_CPU_80486, - TARGET_CPU_80586, - TARGET_CPU_80686, - TARGET_CPU_AMD64, - TARGET_CPU_AARCH64, - TARGET_CPU_WASM32, -}; -enum ETargetABI -{ - TARGET_ABI_UNDEFINED, - TARGET_ABI_DEFAULT, - TARGET_ABI_GNU, - TARGET_ABI_MUSL, - TARGET_ABI_MSVC, -}; - -enum ETargetOptimization -{ - TARGET_DEBUG, - TARGET_RELEASE_SPEED, - TARGET_RELEASE_SIZE -}; - -struct Target_t -{ - ETargetKernel kernel; - ETargetCPU cpu; - ETargetABI abi; - ETargetOptimization optimization; - const char *szSysroot = CommandLine()->ParamValue("-sysroot"); - - CUtlString GetTriplet(); - const char *GetExecutableFileFormat(); - const char *GetStaticLibraryFileFormat(); - const char *GetDynamicLibraryFileFormat(); - static Target_t HostTarget(); - static Target_t DefaultTarget(); - static const char *StringFromCPU( ETargetCPU eCPU ); - static const char *StringFromKernel( ETargetKernel eKernel ); - static const char *StringFromABI( ETargetABI eABI ); - static ETargetCPU CPUFromString( const char *szName ); - static ETargetKernel KernelFromString( const char *szName ); - static ETargetABI ABIFromString( const char *szName ); -}; - -enum EShaderTarget -{ - SHADER_TARGET_VULKAN_SPIRV, - SHADER_TARGET_OPENGL_SPIRV, - SHADER_TARGET_GLSL, - SHADER_TARGET_HLSL, - SHADER_TARGET_MSL, -}; - - -#endif diff --git a/fpc/public/temporalmgr.h b/fpc/public/temporalmgr.h deleted file mode 100644 index e69de29..0000000 diff --git a/fpc/public/watchmgr.h b/fpc/public/watchmgr.h deleted file mode 100644 index e69de29..0000000 diff --git a/fpc/public/windres.h b/fpc/public/windres.h deleted file mode 100644 index e69de29..0000000 diff --git a/fpc/public/winerunner.h b/fpc/public/winerunner.h deleted file mode 100644 index 3c54002..0000000 --- a/fpc/public/winerunner.h +++ /dev/null @@ -1,28 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Run Windows applications using Wine. On native system this will use -// CWindowsRunner. -//===========================================================================// - -#ifndef WINE_RUNNER_H -#define WINE_RUNNER_H - -#include "runner.h" -#include "tier0/platform.h" -#include "tier1/utlvector.h" -#include "tier1/utlstring.h" - -#define WINE_RUNNER_INTERFACE_NAME "WineRunner001" - -abstract_class IWineRunner: public IRunner -{ -public: - virtual int Run( CUtlString szName, CUtlVector& args ) = 0; - virtual int Run( CUtlString szName, CUtlString szDirectory, CUtlVector& args ) = 0; - virtual int Run( CUtlString szName, CUtlString szDirectory, CUtlVector& args, CUtlVector& environment ) = 0; - virtual int Wait( void ) = 0; -}; - - -extern IWineRunner *winerunner; - -#endif diff --git a/fpc/sysroots/ios.cpp b/fpc/sysroots/ios.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/fpc/sysroots/macos.cpp b/fpc/sysroots/macos.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/fpc/sysroots/wdk.cpp b/fpc/sysroots/wdk.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/fpc/sysroots/xcode.cpp b/fpc/sysroots/xcode.cpp deleted file mode 100644 index 58c428e..0000000 --- a/fpc/sysroots/xcode.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "c.h" -#include "ld.h" -#include "helper.h" -#include "sysroots.h" - -DECLARE_SYSROOT_INSTALL_STAGE(xcode_install) -{ - - return 0; -} diff --git a/fpc/tests/android_build/.fpccfg b/fpc/tests/android_build/.fpccfg deleted file mode 100644 index 6227ba8..0000000 --- a/fpc/tests/android_build/.fpccfg +++ /dev/null @@ -1,6 +0,0 @@ -[x86_64-linux-android] -sysroot = "/home/kotofyt/Android/Sdk/ndk/29.0.13599879/toolchains/llvm/prebuilt/linux-x86_64/sysroot" -CLANG_LINKER_INTERFACE_NAME = "/home/kotofyt/Android/Sdk/ndk/29.0.13599879/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++" - -[Android_Build_Tools] -path = "/home/kotofyt/Android/Sdk/build-tools/36.0.0" diff --git a/fpc/tests/android_build/android_native_app_glue.c b/fpc/tests/android_build/android_native_app_glue.c deleted file mode 100644 index 433d4c0..0000000 --- a/fpc/tests/android_build/android_native_app_glue.c +++ /dev/null @@ -1,443 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include - -#include -#include -#include -#include -#include - -#include "android_native_app_glue.h" -#include - -#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "threaded_app", __VA_ARGS__)) -#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "threaded_app", __VA_ARGS__)) - -/* For debug builds, always enable the debug traces in this library */ -#ifndef NDEBUG -# define LOGV(...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, "threaded_app", __VA_ARGS__)) -#else -# define LOGV(...) ((void)0) -#endif - -static void free_saved_state(struct android_app* android_app) { - pthread_mutex_lock(&android_app->mutex); - if (android_app->savedState != NULL) { - free(android_app->savedState); - android_app->savedState = NULL; - android_app->savedStateSize = 0; - } - pthread_mutex_unlock(&android_app->mutex); -} - -int8_t android_app_read_cmd(struct android_app* android_app) { - int8_t cmd; - if (read(android_app->msgread, &cmd, sizeof(cmd)) == sizeof(cmd)) { - switch (cmd) { - case APP_CMD_SAVE_STATE: - free_saved_state(android_app); - break; - } - return cmd; - } else { - LOGE("No data on command pipe!"); - } - return -1; -} - -static void print_cur_config(struct android_app* android_app) { - char lang[2], country[2]; - AConfiguration_getLanguage(android_app->config, lang); - AConfiguration_getCountry(android_app->config, country); - - LOGV("Config: mcc=%d mnc=%d lang=%c%c cnt=%c%c orien=%d touch=%d dens=%d " - "keys=%d nav=%d keysHid=%d navHid=%d sdk=%d size=%d long=%d " - "modetype=%d modenight=%d", - AConfiguration_getMcc(android_app->config), - AConfiguration_getMnc(android_app->config), - lang[0], lang[1], country[0], country[1], - AConfiguration_getOrientation(android_app->config), - AConfiguration_getTouchscreen(android_app->config), - AConfiguration_getDensity(android_app->config), - AConfiguration_getKeyboard(android_app->config), - AConfiguration_getNavigation(android_app->config), - AConfiguration_getKeysHidden(android_app->config), - AConfiguration_getNavHidden(android_app->config), - AConfiguration_getSdkVersion(android_app->config), - AConfiguration_getScreenSize(android_app->config), - AConfiguration_getScreenLong(android_app->config), - AConfiguration_getUiModeType(android_app->config), - AConfiguration_getUiModeNight(android_app->config)); -} - -void android_app_pre_exec_cmd(struct android_app* android_app, int8_t cmd) { - switch (cmd) { - case APP_CMD_INPUT_CHANGED: - LOGV("APP_CMD_INPUT_CHANGED\n"); - pthread_mutex_lock(&android_app->mutex); - if (android_app->inputQueue != NULL) { - AInputQueue_detachLooper(android_app->inputQueue); - } - android_app->inputQueue = android_app->pendingInputQueue; - if (android_app->inputQueue != NULL) { - LOGV("Attaching input queue to looper"); - AInputQueue_attachLooper(android_app->inputQueue, - android_app->looper, LOOPER_ID_INPUT, NULL, - &android_app->inputPollSource); - } - pthread_cond_broadcast(&android_app->cond); - pthread_mutex_unlock(&android_app->mutex); - break; - - case APP_CMD_INIT_WINDOW: - LOGV("APP_CMD_INIT_WINDOW\n"); - pthread_mutex_lock(&android_app->mutex); - android_app->window = android_app->pendingWindow; - pthread_cond_broadcast(&android_app->cond); - pthread_mutex_unlock(&android_app->mutex); - break; - - case APP_CMD_TERM_WINDOW: - LOGV("APP_CMD_TERM_WINDOW\n"); - pthread_cond_broadcast(&android_app->cond); - break; - - case APP_CMD_RESUME: - case APP_CMD_START: - case APP_CMD_PAUSE: - case APP_CMD_STOP: - LOGV("activityState=%d\n", cmd); - pthread_mutex_lock(&android_app->mutex); - android_app->activityState = cmd; - pthread_cond_broadcast(&android_app->cond); - pthread_mutex_unlock(&android_app->mutex); - break; - - case APP_CMD_CONFIG_CHANGED: - LOGV("APP_CMD_CONFIG_CHANGED\n"); - AConfiguration_fromAssetManager(android_app->config, - android_app->activity->assetManager); - print_cur_config(android_app); - break; - - case APP_CMD_DESTROY: - LOGV("APP_CMD_DESTROY\n"); - android_app->destroyRequested = 1; - break; - } -} - -void android_app_post_exec_cmd(struct android_app* android_app, int8_t cmd) { - switch (cmd) { - case APP_CMD_TERM_WINDOW: - LOGV("APP_CMD_TERM_WINDOW\n"); - pthread_mutex_lock(&android_app->mutex); - android_app->window = NULL; - pthread_cond_broadcast(&android_app->cond); - pthread_mutex_unlock(&android_app->mutex); - break; - - case APP_CMD_SAVE_STATE: - LOGV("APP_CMD_SAVE_STATE\n"); - pthread_mutex_lock(&android_app->mutex); - android_app->stateSaved = 1; - pthread_cond_broadcast(&android_app->cond); - pthread_mutex_unlock(&android_app->mutex); - break; - - case APP_CMD_RESUME: - free_saved_state(android_app); - break; - } -} - -void app_dummy() { - -} - -static void android_app_destroy(struct android_app* android_app) { - LOGV("android_app_destroy!"); - free_saved_state(android_app); - pthread_mutex_lock(&android_app->mutex); - if (android_app->inputQueue != NULL) { - AInputQueue_detachLooper(android_app->inputQueue); - } - AConfiguration_delete(android_app->config); - android_app->destroyed = 1; - pthread_cond_broadcast(&android_app->cond); - pthread_mutex_unlock(&android_app->mutex); - // Can't touch android_app object after this. -} - -static void process_input(struct android_app* app, struct android_poll_source* source) { - AInputEvent* event = NULL; - if (AInputQueue_getEvent(app->inputQueue, &event) >= 0) { - LOGV("New input event: type=%d\n", AInputEvent_getType(event)); - if (AInputQueue_preDispatchEvent(app->inputQueue, event)) { - return; - } - int32_t handled = 0; - if (app->onInputEvent != NULL) handled = app->onInputEvent(app, event); - AInputQueue_finishEvent(app->inputQueue, event, handled); - } else { - LOGE("Failure reading next input event: %s\n", strerror(errno)); - } -} - -static void process_cmd(struct android_app* app, struct android_poll_source* source) { - int8_t cmd = android_app_read_cmd(app); - android_app_pre_exec_cmd(app, cmd); - if (app->onAppCmd != NULL) app->onAppCmd(app, cmd); - android_app_post_exec_cmd(app, cmd); -} - -static void* android_app_entry(void* param) { - struct android_app* android_app = (struct android_app*)param; - - android_app->config = AConfiguration_new(); - AConfiguration_fromAssetManager(android_app->config, android_app->activity->assetManager); - - print_cur_config(android_app); - - android_app->cmdPollSource.id = LOOPER_ID_MAIN; - android_app->cmdPollSource.app = android_app; - android_app->cmdPollSource.process = process_cmd; - android_app->inputPollSource.id = LOOPER_ID_INPUT; - android_app->inputPollSource.app = android_app; - android_app->inputPollSource.process = process_input; - - ALooper* looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS); - ALooper_addFd(looper, android_app->msgread, LOOPER_ID_MAIN, ALOOPER_EVENT_INPUT, NULL, - &android_app->cmdPollSource); - android_app->looper = looper; - - pthread_mutex_lock(&android_app->mutex); - android_app->running = 1; - pthread_cond_broadcast(&android_app->cond); - pthread_mutex_unlock(&android_app->mutex); - - android_main(android_app); - - android_app_destroy(android_app); - return NULL; -} - -// -------------------------------------------------------------------- -// Native activity interaction (called from main thread) -// -------------------------------------------------------------------- - -static struct android_app* android_app_create(ANativeActivity* activity, - void* savedState, size_t savedStateSize) { - struct android_app* android_app = (struct android_app*)malloc(sizeof(struct android_app)); - memset(android_app, 0, sizeof(struct android_app)); - android_app->activity = activity; - - pthread_mutex_init(&android_app->mutex, NULL); - pthread_cond_init(&android_app->cond, NULL); - - if (savedState != NULL) { - android_app->savedState = malloc(savedStateSize); - android_app->savedStateSize = savedStateSize; - memcpy(android_app->savedState, savedState, savedStateSize); - } - - int msgpipe[2]; - if (pipe(msgpipe)) { - LOGE("could not create pipe: %s", strerror(errno)); - return NULL; - } - android_app->msgread = msgpipe[0]; - android_app->msgwrite = msgpipe[1]; - - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - pthread_create(&android_app->thread, &attr, android_app_entry, android_app); - - // Wait for thread to start. - pthread_mutex_lock(&android_app->mutex); - while (!android_app->running) { - pthread_cond_wait(&android_app->cond, &android_app->mutex); - } - pthread_mutex_unlock(&android_app->mutex); - - return android_app; -} - -static void android_app_write_cmd(struct android_app* android_app, int8_t cmd) { - if (write(android_app->msgwrite, &cmd, sizeof(cmd)) != sizeof(cmd)) { - LOGE("Failure writing android_app cmd: %s\n", strerror(errno)); - } -} - -static void android_app_set_input(struct android_app* android_app, AInputQueue* inputQueue) { - pthread_mutex_lock(&android_app->mutex); - android_app->pendingInputQueue = inputQueue; - android_app_write_cmd(android_app, APP_CMD_INPUT_CHANGED); - while (android_app->inputQueue != android_app->pendingInputQueue) { - pthread_cond_wait(&android_app->cond, &android_app->mutex); - } - pthread_mutex_unlock(&android_app->mutex); -} - -static void android_app_set_window(struct android_app* android_app, ANativeWindow* window) { - pthread_mutex_lock(&android_app->mutex); - if (android_app->pendingWindow != NULL) { - android_app_write_cmd(android_app, APP_CMD_TERM_WINDOW); - } - android_app->pendingWindow = window; - if (window != NULL) { - android_app_write_cmd(android_app, APP_CMD_INIT_WINDOW); - } - while (android_app->window != android_app->pendingWindow) { - pthread_cond_wait(&android_app->cond, &android_app->mutex); - } - pthread_mutex_unlock(&android_app->mutex); -} - -static void android_app_set_activity_state(struct android_app* android_app, int8_t cmd) { - pthread_mutex_lock(&android_app->mutex); - android_app_write_cmd(android_app, cmd); - while (android_app->activityState != cmd) { - pthread_cond_wait(&android_app->cond, &android_app->mutex); - } - pthread_mutex_unlock(&android_app->mutex); -} - -static void android_app_free(struct android_app* android_app) { - pthread_mutex_lock(&android_app->mutex); - android_app_write_cmd(android_app, APP_CMD_DESTROY); - while (!android_app->destroyed) { - pthread_cond_wait(&android_app->cond, &android_app->mutex); - } - pthread_mutex_unlock(&android_app->mutex); - - close(android_app->msgread); - close(android_app->msgwrite); - pthread_cond_destroy(&android_app->cond); - pthread_mutex_destroy(&android_app->mutex); - free(android_app); -} - -static void onDestroy(ANativeActivity* activity) { - LOGV("Destroy: %p\n", activity); - android_app_free((struct android_app*)activity->instance); -} - -static void onStart(ANativeActivity* activity) { - LOGV("Start: %p\n", activity); - android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_START); -} - -static void onResume(ANativeActivity* activity) { - LOGV("Resume: %p\n", activity); - android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_RESUME); -} - -static void* onSaveInstanceState(ANativeActivity* activity, size_t* outLen) { - struct android_app* android_app = (struct android_app*)activity->instance; - void* savedState = NULL; - - LOGV("SaveInstanceState: %p\n", activity); - pthread_mutex_lock(&android_app->mutex); - android_app->stateSaved = 0; - android_app_write_cmd(android_app, APP_CMD_SAVE_STATE); - while (!android_app->stateSaved) { - pthread_cond_wait(&android_app->cond, &android_app->mutex); - } - - if (android_app->savedState != NULL) { - savedState = android_app->savedState; - *outLen = android_app->savedStateSize; - android_app->savedState = NULL; - android_app->savedStateSize = 0; - } - - pthread_mutex_unlock(&android_app->mutex); - - return savedState; -} - -static void onPause(ANativeActivity* activity) { - LOGV("Pause: %p\n", activity); - android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_PAUSE); -} - -static void onStop(ANativeActivity* activity) { - LOGV("Stop: %p\n", activity); - android_app_set_activity_state((struct android_app*)activity->instance, APP_CMD_STOP); -} - -static void onConfigurationChanged(ANativeActivity* activity) { - struct android_app* android_app = (struct android_app*)activity->instance; - LOGV("ConfigurationChanged: %p\n", activity); - android_app_write_cmd(android_app, APP_CMD_CONFIG_CHANGED); -} - -static void onLowMemory(ANativeActivity* activity) { - struct android_app* android_app = (struct android_app*)activity->instance; - LOGV("LowMemory: %p\n", activity); - android_app_write_cmd(android_app, APP_CMD_LOW_MEMORY); -} - -static void onWindowFocusChanged(ANativeActivity* activity, int focused) { - LOGV("WindowFocusChanged: %p -- %d\n", activity, focused); - android_app_write_cmd((struct android_app*)activity->instance, - focused ? APP_CMD_GAINED_FOCUS : APP_CMD_LOST_FOCUS); -} - -static void onNativeWindowCreated(ANativeActivity* activity, ANativeWindow* window) { - LOGV("NativeWindowCreated: %p -- %p\n", activity, window); - android_app_set_window((struct android_app*)activity->instance, window); -} - -static void onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* window) { - LOGV("NativeWindowDestroyed: %p -- %p\n", activity, window); - android_app_set_window((struct android_app*)activity->instance, NULL); -} - -static void onInputQueueCreated(ANativeActivity* activity, AInputQueue* queue) { - LOGV("InputQueueCreated: %p -- %p\n", activity, queue); - android_app_set_input((struct android_app*)activity->instance, queue); -} - -static void onInputQueueDestroyed(ANativeActivity* activity, AInputQueue* queue) { - LOGV("InputQueueDestroyed: %p -- %p\n", activity, queue); - android_app_set_input((struct android_app*)activity->instance, NULL); -} - -void ANativeActivity_onCreate(ANativeActivity* activity, - void* savedState, size_t savedStateSize) { - LOGV("Creating: %p\n", activity); - activity->callbacks->onDestroy = onDestroy; - activity->callbacks->onStart = onStart; - activity->callbacks->onResume = onResume; - activity->callbacks->onSaveInstanceState = onSaveInstanceState; - activity->callbacks->onPause = onPause; - activity->callbacks->onStop = onStop; - activity->callbacks->onConfigurationChanged = onConfigurationChanged; - activity->callbacks->onLowMemory = onLowMemory; - activity->callbacks->onWindowFocusChanged = onWindowFocusChanged; - activity->callbacks->onNativeWindowCreated = onNativeWindowCreated; - activity->callbacks->onNativeWindowDestroyed = onNativeWindowDestroyed; - activity->callbacks->onInputQueueCreated = onInputQueueCreated; - activity->callbacks->onInputQueueDestroyed = onInputQueueDestroyed; - - activity->instance = android_app_create(activity, savedState, savedStateSize); -} diff --git a/fpc/tests/android_build/android_native_app_glue.h b/fpc/tests/android_build/android_native_app_glue.h deleted file mode 100644 index 1b8c1f1..0000000 --- a/fpc/tests/android_build/android_native_app_glue.h +++ /dev/null @@ -1,349 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef _ANDROID_NATIVE_APP_GLUE_H -#define _ANDROID_NATIVE_APP_GLUE_H - -#include -#include -#include - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * The native activity interface provided by - * is based on a set of application-provided callbacks that will be called - * by the Activity's main thread when certain events occur. - * - * This means that each one of this callbacks _should_ _not_ block, or they - * risk having the system force-close the application. This programming - * model is direct, lightweight, but constraining. - * - * The 'threaded_native_app' static library is used to provide a different - * execution model where the application can implement its own main event - * loop in a different thread instead. Here's how it works: - * - * 1/ The application must provide a function named "android_main()" that - * will be called when the activity is created, in a new thread that is - * distinct from the activity's main thread. - * - * 2/ android_main() receives a pointer to a valid "android_app" structure - * that contains references to other important objects, e.g. the - * ANativeActivity obejct instance the application is running in. - * - * 3/ the "android_app" object holds an ALooper instance that already - * listens to two important things: - * - * - activity lifecycle events (e.g. "pause", "resume"). See APP_CMD_XXX - * declarations below. - * - * - input events coming from the AInputQueue attached to the activity. - * - * Each of these correspond to an ALooper identifier returned by - * ALooper_pollOnce with values of LOOPER_ID_MAIN and LOOPER_ID_INPUT, - * respectively. - * - * Your application can use the same ALooper to listen to additional - * file-descriptors. They can either be callback based, or with return - * identifiers starting with LOOPER_ID_USER. - * - * 4/ Whenever you receive a LOOPER_ID_MAIN or LOOPER_ID_INPUT event, - * the returned data will point to an android_poll_source structure. You - * can call the process() function on it, and fill in android_app->onAppCmd - * and android_app->onInputEvent to be called for your own processing - * of the event. - * - * Alternatively, you can call the low-level functions to read and process - * the data directly... look at the process_cmd() and process_input() - * implementations in the glue to see how to do this. - * - * See the sample named "native-activity" that comes with the NDK with a - * full usage example. Also look at the JavaDoc of NativeActivity. - */ - -struct android_app; - -/** - * Data associated with an ALooper fd that will be returned as the "outData" - * when that source has data ready. - */ -struct android_poll_source { - // The identifier of this source. May be LOOPER_ID_MAIN or - // LOOPER_ID_INPUT. - int32_t id; - - // The android_app this ident is associated with. - struct android_app* app; - - // Function to call to perform the standard processing of data from - // this source. - void (*process)(struct android_app* app, struct android_poll_source* source); -}; - -/** - * This is the interface for the standard glue code of a threaded - * application. In this model, the application's code is running - * in its own thread separate from the main thread of the process. - * It is not required that this thread be associated with the Java - * VM, although it will need to be in order to make JNI calls any - * Java objects. - */ -struct android_app { - // The application can place a pointer to its own state object - // here if it likes. - void* userData; - - // Fill this in with the function to process main app commands (APP_CMD_*) - void (*onAppCmd)(struct android_app* app, int32_t cmd); - - // Fill this in with the function to process input events. At this point - // the event has already been pre-dispatched, and it will be finished upon - // return. Return 1 if you have handled the event, 0 for any default - // dispatching. - int32_t (*onInputEvent)(struct android_app* app, AInputEvent* event); - - // The ANativeActivity object instance that this app is running in. - ANativeActivity* activity; - - // The current configuration the app is running in. - AConfiguration* config; - - // This is the last instance's saved state, as provided at creation time. - // It is NULL if there was no state. You can use this as you need; the - // memory will remain around until you call android_app_exec_cmd() for - // APP_CMD_RESUME, at which point it will be freed and savedState set to NULL. - // These variables should only be changed when processing a APP_CMD_SAVE_STATE, - // at which point they will be initialized to NULL and you can malloc your - // state and place the information here. In that case the memory will be - // freed for you later. - void* savedState; - size_t savedStateSize; - - // The ALooper associated with the app's thread. - ALooper* looper; - - // When non-NULL, this is the input queue from which the app will - // receive user input events. - AInputQueue* inputQueue; - - // When non-NULL, this is the window surface that the app can draw in. - ANativeWindow* window; - - // Current content rectangle of the window; this is the area where the - // window's content should be placed to be seen by the user. - ARect contentRect; - - // Current state of the app's activity. May be either APP_CMD_START, - // APP_CMD_RESUME, APP_CMD_PAUSE, or APP_CMD_STOP; see below. - int activityState; - - // This is non-zero when the application's NativeActivity is being - // destroyed and waiting for the app thread to complete. - int destroyRequested; - - // ------------------------------------------------- - // Below are "private" implementation of the glue code. - - pthread_mutex_t mutex; - pthread_cond_t cond; - - int msgread; - int msgwrite; - - pthread_t thread; - - struct android_poll_source cmdPollSource; - struct android_poll_source inputPollSource; - - int running; - int stateSaved; - int destroyed; - int redrawNeeded; - AInputQueue* pendingInputQueue; - ANativeWindow* pendingWindow; - ARect pendingContentRect; -}; - -enum { - /** - * Looper data ID of commands coming from the app's main thread, which - * is returned as an identifier from ALooper_pollOnce(). The data for this - * identifier is a pointer to an android_poll_source structure. - * These can be retrieved and processed with android_app_read_cmd() - * and android_app_exec_cmd(). - */ - LOOPER_ID_MAIN = 1, - - /** - * Looper data ID of events coming from the AInputQueue of the - * application's window, which is returned as an identifier from - * ALooper_pollOnce(). The data for this identifier is a pointer to an - * android_poll_source structure. These can be read via the inputQueue - * object of android_app. - */ - LOOPER_ID_INPUT = 2, - - /** - * Start of user-defined ALooper identifiers. - */ - LOOPER_ID_USER = 3, -}; - -enum { - /** - * Command from main thread: the AInputQueue has changed. Upon processing - * this command, android_app->inputQueue will be updated to the new queue - * (or NULL). - */ - APP_CMD_INPUT_CHANGED, - - /** - * Command from main thread: a new ANativeWindow is ready for use. Upon - * receiving this command, android_app->window will contain the new window - * surface. - */ - APP_CMD_INIT_WINDOW, - - /** - * Command from main thread: the existing ANativeWindow needs to be - * terminated. Upon receiving this command, android_app->window still - * contains the existing window; after calling android_app_exec_cmd - * it will be set to NULL. - */ - APP_CMD_TERM_WINDOW, - - /** - * Command from main thread: the current ANativeWindow has been resized. - * Please redraw with its new size. - */ - APP_CMD_WINDOW_RESIZED, - - /** - * Command from main thread: the system needs that the current ANativeWindow - * be redrawn. You should redraw the window before handing this to - * android_app_exec_cmd() in order to avoid transient drawing glitches. - */ - APP_CMD_WINDOW_REDRAW_NEEDED, - - /** - * Command from main thread: the content area of the window has changed, - * such as from the soft input window being shown or hidden. You can - * find the new content rect in android_app::contentRect. - */ - APP_CMD_CONTENT_RECT_CHANGED, - - /** - * Command from main thread: the app's activity window has gained - * input focus. - */ - APP_CMD_GAINED_FOCUS, - - /** - * Command from main thread: the app's activity window has lost - * input focus. - */ - APP_CMD_LOST_FOCUS, - - /** - * Command from main thread: the current device configuration has changed. - */ - APP_CMD_CONFIG_CHANGED, - - /** - * Command from main thread: the system is running low on memory. - * Try to reduce your memory use. - */ - APP_CMD_LOW_MEMORY, - - /** - * Command from main thread: the app's activity has been started. - */ - APP_CMD_START, - - /** - * Command from main thread: the app's activity has been resumed. - */ - APP_CMD_RESUME, - - /** - * Command from main thread: the app should generate a new saved state - * for itself, to restore from later if needed. If you have saved state, - * allocate it with malloc and place it in android_app.savedState with - * the size in android_app.savedStateSize. The will be freed for you - * later. - */ - APP_CMD_SAVE_STATE, - - /** - * Command from main thread: the app's activity has been paused. - */ - APP_CMD_PAUSE, - - /** - * Command from main thread: the app's activity has been stopped. - */ - APP_CMD_STOP, - - /** - * Command from main thread: the app's activity is being destroyed, - * and waiting for the app thread to clean up and exit before proceeding. - */ - APP_CMD_DESTROY, -}; - -/** - * Call when ALooper_pollAll() returns LOOPER_ID_MAIN, reading the next - * app command message. - */ -int8_t android_app_read_cmd(struct android_app* android_app); - -/** - * Call with the command returned by android_app_read_cmd() to do the - * initial pre-processing of the given command. You can perform your own - * actions for the command after calling this function. - */ -void android_app_pre_exec_cmd(struct android_app* android_app, int8_t cmd); - -/** - * Call with the command returned by android_app_read_cmd() to do the - * final post-processing of the given command. You must have done your own - * actions for the command before calling this function. - */ -void android_app_post_exec_cmd(struct android_app* android_app, int8_t cmd); - -/** - * Dummy function you can call to ensure glue code isn't stripped. - */ -void app_dummy(); - -/** - * This is the function that application code must implement, representing - * the main entry to the app. - */ -extern void android_main(struct android_app* app); - -#ifdef __cplusplus -} -#endif - -#endif /* _ANDROID_NATIVE_APP_GLUE_H */ diff --git a/fpc/tests/android_build/build.cpp b/fpc/tests/android_build/build.cpp deleted file mode 100644 index 5318a80..0000000 --- a/fpc/tests/android_build/build.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "helper.h" -#include "c.h" -#include "ld.h" -#include "tier1/utlstring.h" - -DECLARE_BUILD_STAGE(android_build) -{ - AndroidManifest_t manifest = {}; - manifest.SetMinSDKVersion(21); - manifest.SetTargetSDKVersion(35); - manifest.SetPackageName("FPC Testing facility"); - manifest.SetPackageID("com.example.testfpc"); - CUtlString szManifestDir = manifest.BuildManifest(); - - CProject_t compileProject = {}; - compileProject.m_szName = "android_app"; - compileProject.m_androidmanifest = manifest; - compileProject.bFPIC = true; - compileProject.m_target = Target_t::HostTarget(); - compileProject.m_target.kernel = TARGET_KERNEL_ANDROID; - compileProject.files = { - "main.c", - "android_native_app_glue.c", - }; - LinkProject_t ldProject = ccompiler->Compile(&compileProject); - ldProject.libraries = { - "android", - "log", - }; - CUtlString szOutputDir = linker->Link(&ldProject); - filesystem2->MakeDirectory(CUtlString("%s/lib/x86_64",szManifestDir.GetString())); - filesystem2->CopyFile(CUtlString("%s/lib/x86_64/libnative-app.so",szManifestDir.GetString()), szOutputDir); - - CUtlString szApk = APKTool()->BuildPackage(manifest, szManifestDir); - APKTool()->SignPackage(szApk, NULL, "mykey", "storepass", "storepass"); - - return 0; -} - diff --git a/fpc/tests/android_build/main.c b/fpc/tests/android_build/main.c deleted file mode 100644 index 1c77754..0000000 --- a/fpc/tests/android_build/main.c +++ /dev/null @@ -1,40 +0,0 @@ - -#include "android_native_app_glue.h" -#include - -#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "NativeApp", __VA_ARGS__)) - -// Handle lifecycle events -static void handle_cmd(struct android_app* app, int32_t cmd) { - switch (cmd) { - case APP_CMD_INIT_WINDOW: - LOGI("Window created"); - // You could init OpenGL/Vulkan here - break; - case APP_CMD_TERM_WINDOW: - LOGI("Window destroyed"); - break; - } -} - -void android_main(struct android_app* app) { - app->onAppCmd = handle_cmd; - - LOGI("Native app started"); - - int events; - struct android_poll_source* source; - - while (1) { - LOGI("what"); - int ident; - while ((ident = ALooper_pollOnce(0, NULL, &events, (void**)&source)) >= 0) { - if (source) source->process(app, source); - if (app->destroyRequested) { - LOGI("App destroy requested"); - return; - } - } - - } -} diff --git a/fpc/tests/android_build/my-release-key.jks b/fpc/tests/android_build/my-release-key.jks deleted file mode 100644 index 227d6f777fdae5d9c924edb1345bfa2c8b94e856..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2550 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 diff --git a/fpc/tests/ios_build/.fpccfg b/fpc/tests/ios_build/.fpccfg deleted file mode 100644 index 0b63401..0000000 --- a/fpc/tests/ios_build/.fpccfg +++ /dev/null @@ -1,2 +0,0 @@ -[aarch64-apple-ios] -sysroot = "/home/kotofyt/clones/yay/xcode/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk" diff --git a/fpc/tests/ios_build/build.cpp b/fpc/tests/ios_build/build.cpp deleted file mode 100644 index a4d99fb..0000000 --- a/fpc/tests/ios_build/build.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "helper.h" -#include "c.h" -#include "ld.h" -#include "tier1/utlstring.h" -#include "appletool.h" - -DECLARE_BUILD_STAGE(ios_build) -{ - V_printf("Cool\n"); - CProject_t compileProject = {}; - compileProject.m_szName = "ios_app"; - compileProject.m_target = Target_t::HostTarget(); - compileProject.m_target.kernel = TARGET_KERNEL_IOS; - compileProject.m_target.cpu = TARGET_CPU_AARCH64; - compileProject.files = { - "main.c", - }; - LinkProject_t ldProject = ccompiler->Compile(&compileProject); - CUtlString szOutput = linker->Link(&ldProject); - - AppleManifest_t manifest = {}; - manifest.SetPackageName("FPC Testing facility"); - manifest.SetPackageID("com.example.testfpc"); - manifest.SetPackageExecutable(szOutput); - CUtlString szIpa = AppleTool()->BuildPackage( manifest, manifest.BuildManifest() ); - CUtlString szPackage = AppleTool()->SignPackage(szIpa, NULL); - - return 0; -} diff --git a/fpc/tests/ios_build/main.c b/fpc/tests/ios_build/main.c deleted file mode 100644 index 0734f35..0000000 --- a/fpc/tests/ios_build/main.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "stdio.h" -int main() -{ - printf("Hello, world!\n"); - return 0; -}; diff --git a/fpc/tests/windows_drivers_build/build.cpp b/fpc/tests/windows_drivers_build/build.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/fpc/tests/windows_drivers_build/main.c b/fpc/tests/windows_drivers_build/main.c deleted file mode 100644 index e69de29..0000000 diff --git a/game/client/__build.cpp b/game/client/__build.cpp index f3d182b..a84ddd8 100644 --- a/game/client/__build.cpp +++ b/game/client/__build.cpp @@ -24,6 +24,7 @@ DECLARE_BUILD_STAGE(client) CUtlString outputProject = linker->Link(&ldProject); + /* if (!bStaticBuild) { filesystem2->MakeDirectory(CUtlString("%s/funnygame/bin",szOutputDir.GetString())); @@ -31,6 +32,7 @@ DECLARE_BUILD_STAGE(client) } else { client_lib = outputProject; } + */ return 0; }; diff --git a/http/build.cpp b/http/build.cpp deleted file mode 100644 index 0613b0b..0000000 --- a/http/build.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "helper.h" -#include "c.h" -#include "ld.h" -#include "tier1/utlstring.h" -#include "tier0/commandline.h" - -ADD_DEPENDENCY_BUILD_FILE(tier0, "../tier0/build.cpp") -ADD_DEPENDENCY_BUILD_FILE(tier1, "../tier1/build.cpp") -ADD_DEPENDENCY_BUILD_FILE(tier2, "../tier2/build.cpp") - -DECLARE_BUILD_STAGE(funnyhttp) -{ - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - - compileProject.m_szName = "funnyhttp"; - compileProject.files = { - "client.cpp" - }; - compileProject.includeDirectories = {"../public"}; - compileProject.bFPIC = true; - ldProject = ccompiler->Compile(&compileProject); - ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier1, "tier1")}); - ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier2, "tier2")}); - ldProject.libraries = { - "ssl", - "crypto", - }; - ldProject.linkType = ELINK_DYNAMIC_LIBRARY; - - CUtlString szOutputDir = linker->Link(&ldProject); - - ADD_OUTPUT_OBJECT("funnyhttp", szOutputDir) - - return 0; -}; - diff --git a/http/client.cpp b/http/client.cpp deleted file mode 100644 index eaf286a..0000000 --- a/http/client.cpp +++ /dev/null @@ -1,563 +0,0 @@ - -#include "http/http.h" -#include "tier1/interface.h" -#include "tier1/utlstring.h" -#include "netdb.h" -#include "unistd.h" -#include "fcntl.h" -#include "openssl/ssl.h" -#include "openssl/err.h" -#include "arpa/inet.h" - -abstract_class CHTTPClient: public IHTTPClient -{ -public: - void ConnectToServer(); - void CloseConnection(); - - virtual void Post( const char *szResource, HTTPHeader_t *pHeader, uint32_t uDataSize, const void *data ) override; - virtual void Get( const char *szResource, HTTPHeader_t *pHeader ) override; - virtual HTTPResponse_t GetResponse() override; - - virtual bool WebSocket_Connect( const char *szResource ) override; - virtual void WebSocket_Close( void ) override; - virtual void WebSocket_SendText( const char *szData ) override; - virtual CUtlString WebSocket_RecvText() override; - virtual void WebSocket_SendBinary( size_t uSize, const void *pData ) override; - virtual WebSocketPacket_t WebSocket_RecvBinary() override; - - ssize_t Write( void *pData, ssize_t uSize ); - ssize_t Read( void *pData, ssize_t uSize ); - - HTTPResponse_t ParseResponse( const char *szMessage, uint32_t uDataSize ); - const char *GetVersion(); - HTTPHeaderParam_t ParseHeaderParams( const char *szHeaderLine ); - - const char *m_szHostName; - uint16_t m_uPort; - bool m_bIsSecure; - SSL *m_pSSL; - SSL_CTX *m_pSSLCtx; - - int m_iFileDescriptor; -}; - -void CHTTPClient::Post( const char *szResource, HTTPHeader_t *pHeader, uint32_t uDataSize, const void *data ) -{ - if (pHeader == NULL) - return; - - ConnectToServer(); - - CUtlString szMessage = CUtlString( - "POST %s HTTP/%s\r\n", - szResource, GetVersion()); - CUtlString szHeader = CUtlString( - "Host: %s\r\n" - "Content-Length: %u\r\n", - m_szHostName, - uDataSize - ); - - CUtlString szCombined; - int i = 0; - - for ( i = 0; i < pHeader->m_nParamCount; i++ ) - { - szHeader.AppendTail(CUtlString("%s: %s\r\n", pHeader->m_params[i].m_szParamName.GetString(), pHeader->m_params[i].m_szValue.GetString())); - } - - szCombined = szMessage; - szCombined.AppendTail(szHeader); - szCombined.AppendTail("\r\n"); - V_printf("%s\n",szCombined.GetString()); - - Write(szCombined.GetString(), szCombined.GetLenght()); - Write((void*)data, uDataSize); -} - -void CHTTPClient::Get( const char *szResource, HTTPHeader_t *pHeader ) -{ - if (pHeader == NULL) - return; - - ConnectToServer(); - - CUtlString szMessage = CUtlString( - "GET %s HTTP/%s\r\n", - szResource, GetVersion()); - CUtlString szHeader = CUtlString( - "Host: %s\r\n", - m_szHostName - ); - - CUtlString szCombined; - int i = 0; - - for ( i = 0; i < pHeader->m_nParamCount; i++ ) - { - szHeader.AppendTail(CUtlString("%s: %s\r\n", pHeader->m_params[i].m_szParamName.GetString(), pHeader->m_params[i].m_szValue.GetString())); - } - - szCombined = szMessage; - szCombined.AppendTail(szHeader); - szCombined.AppendTail("\r\n"); - - Write(szCombined.GetString(), szCombined.GetLenght()); -} - -HTTPResponse_t CHTTPClient::GetResponse() -{ - CUtlResizableBuffer szCharBuffer(0); - char response[4096] = {}; - int n; - int nPreviousSize = 0; - -readSocket: - - n = Read(response, sizeof(response)); - V_printf("%s\n",response); - if (n == -1) - goto responseDone; - - - szCharBuffer.Resize(nPreviousSize+n); - V_memcpy((char*)szCharBuffer.GetMemory()+nPreviousSize, response, n); - nPreviousSize += n; - - // HTTP 1.0 reacts either to socket being closed or Content-Lenght - // HTTP 1.1 has Transfer-Encoding: chunked, which we need to respect - // Still some response codes may not include a body - if ( n > 0 ) - { - HTTPResponse_t r = ParseResponse(szCharBuffer, szCharBuffer.GetSize()); - if (r.m_bIsComplete) - goto responseDone; - - // these do not provide body - } - // there is some data so go and read back again - goto readSocket; -responseDone: - - return ParseResponse(szCharBuffer, szCharBuffer.GetSize()); -} - -HTTPResponse_t CHTTPClient::ParseResponse( const char *szMessage, uint32_t uDataSize ) -{ - char cPreviousCharacter = 0; - char cCurrentCharacter = 0; - const char *pcCurrentCharacter = szMessage; - CUtlString szBuffer = ""; - bool bIsMessage = true; - HTTPResponse_t response = {}; - CUtlVector headers = {}; - CUtlBuffer data = {}; - - if (!szMessage) - return {}; - // Parse header - while (*pcCurrentCharacter) - { - cCurrentCharacter = *pcCurrentCharacter; - if ( cPreviousCharacter == '\r') - { - if ( cCurrentCharacter == '\n') - { - if (bIsMessage) - { - uint32_t uResult = 0; - while (szBuffer[0] != ' ') - szBuffer.RemoveHead(1); - while (szBuffer[0] == ' ') - szBuffer.RemoveHead(1); - V_sscanf(szBuffer, "%i", &uResult); - response.m_uCode = uResult; - } - if (szBuffer == "") - break; - if (!bIsMessage) - headers.AppendTail(ParseHeaderParams(szBuffer)); - bIsMessage = false; - szBuffer = ""; - cPreviousCharacter = 0; - cCurrentCharacter = *pcCurrentCharacter++; - continue; - } - } - if (cPreviousCharacter != 0) - szBuffer.AppendTail(cPreviousCharacter); - pcCurrentCharacter++; - - cPreviousCharacter = cCurrentCharacter; - }; - switch (response.m_uCode) - { - case 100: - case 101: - case 204: - case 205: - case 304: - response.m_bIsComplete = true; - return response; - default: - break; - } - - bool bParseInChunks = false; - uint64_t uBodySize = 0; - // check content lenght - for ( int i = 0; i < headers.GetSize(); i++ ) - { - if ( !V_stricmp( headers[i].m_szParamName, "Content-Length" ) ) - { - uBodySize = atoll(headers[i].m_szValue); - bParseInChunks = false; - }; - - - if ( !V_stricmp( headers[i].m_szParamName, "Transfer-Encoding" ) ) - { - if ( !V_stricmp( headers[i].m_szValue, "Chunked" ) ) - { - bParseInChunks = true; - }; - }; - } - pcCurrentCharacter++; - if ( !bParseInChunks ) - { - uint32_t nDataLen = uDataSize-(pcCurrentCharacter-szMessage); - if (nDataLen < uBodySize) - { - response.m_bIsComplete = false; - return response; - } - data = CUtlBuffer(nDataLen+1); - V_memcpy(data.GetMemory(), pcCurrentCharacter, nDataLen); - data[nDataLen] = 0; - response.m_params = CUtlBuffer(headers.GetSize()); - for (int i = 0; i < headers.GetSize(); i++ ) - { - response.m_params.operator[](i) = headers.operator[](i); - } - response.m_message = data; - response.m_bIsComplete = true; - - } else { - szBuffer = ""; - while (*pcCurrentCharacter) - { - - cCurrentCharacter = *pcCurrentCharacter; - if ( cPreviousCharacter == '\r') - { - if ( cCurrentCharacter == '\n') - { - uint32_t uChunkSize; - uChunkSize = strtol(szBuffer, NULL, 0); - } - } - if (cPreviousCharacter != 0) - szBuffer.AppendTail(cPreviousCharacter); - pcCurrentCharacter++; - - cPreviousCharacter = cCurrentCharacter; - } - } - - return response; -} - -const char *CHTTPClient::GetVersion() -{ - - return "1.1"; -} -HTTPHeaderParam_t CHTTPClient::ParseHeaderParams( const char *szHeaderLine ) -{ - const char *psz = szHeaderLine; - CUtlString szName; - CUtlString szValue; - - int stage = 0; - while (*psz) - { - if (stage == 0) - { - if (*psz == ':') - stage = 1; - else - szName.AppendTail(*psz); - } else if (stage == 1) - { - if (*psz != ' ') - break; - } - psz++; - } - szValue = psz; - return {szName, szValue}; -} -void CHTTPClient::ConnectToServer() -{ - struct hostent *pServerHostName = NULL; - struct sockaddr_in serverAddress; - int err; - SSL_CTX *ctx; - SSL *ssl; - - if (V_strcmp(m_szHostName, "localhost")) - { - pServerHostName = gethostbyname(m_szHostName); - if (!pServerHostName) - return; - } - - - V_memset(&serverAddress, 0, sizeof(serverAddress)); - serverAddress.sin_family = AF_INET; - if (!V_strcmp(m_szHostName, "localhost")) - inet_pton(AF_INET, "127.0.0.1", &serverAddress.sin_addr); - else - V_memcpy(&serverAddress.sin_addr.s_addr, pServerHostName->h_addr, pServerHostName->h_length); - - // https - serverAddress.sin_port = htons(m_uPort); - - err = connect(m_iFileDescriptor, (struct sockaddr *)&serverAddress, sizeof(serverAddress)); - if (err < 0) - return; - - if (m_bIsSecure) - { - ctx = SSL_CTX_new(TLS_client_method()); - if (!ctx) - return; - ssl =SSL_new(ctx); - if (!ssl) - return; - - SSL_set_fd(ssl, m_iFileDescriptor); - SSL_set_tlsext_host_name(ssl, m_szHostName); - - int r = SSL_connect(ssl); - if (r <= 0) - { - ERR_print_errors_fp(stdout); - SSL_free(ssl); - SSL_CTX_free(ctx); - return; - } - }; - - if (m_bIsSecure) - { - m_pSSL = ssl; - m_pSSLCtx = ctx; - } - - -} - -void CHTTPClient::CloseConnection() -{ - -} -bool CHTTPClient::WebSocket_Connect( const char *szResource ) -{ - HTTPResponse_t stResponse; - HTTPHeaderParam_t params[] = { - {"Upgrade", "websocket"}, - {"Connection", "Upgrade"}, - {"Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ=="}, - {"Sec-WebSocket-Protocol", "chat, superchat"}, - {"Sec-WebSocket-Version", "13"}, - }; - HTTPHeader_t stHeader = { - sizeof(params)/sizeof(params[0]), - params - }; - Get(szResource, &stHeader); - stResponse = GetResponse(); - // According to spec 101 is a good sign - if (stResponse.m_uCode == 101) - return true; - return false; -} - - -void CHTTPClient::WebSocket_Close( void ) -{ - -} - -enum EWebSocketOp -{ - WEBSOCKET_CONTINUE = 0, - WEBSOCKET_TEXT = 1, - WEBSOCKET_BINARY = 2, - WEBSOCKET_CLOSE = 8, - WEBSOCKET_PING = 9, - WEBSOCKET_PONG = 10, -}; - -struct WebSocketFrame_t -{ - EWebSocketOp nOpCode: 4; - uint8_t nReserved: 3; - uint8_t bFin: 1; - uint8_t nPayloadLenght: 7; - uint8_t bMasked: 1; -}; - -void CHTTPClient::WebSocket_SendText( const char *szData ) -{ - size_t uLen; - WebSocketFrame_t stFrame; - uLen = V_strlen(szData); - stFrame = (WebSocketFrame_t){ - .nOpCode = WEBSOCKET_TEXT, - .bFin = 1, - .bMasked = 1, - }; - // im too lazy to mask it - int iMask = 0; - - if ( uLen <= 125 ) - { - stFrame.nPayloadLenght = uLen; - Write(&stFrame, 2); - Write(&iMask, 4); - } - else if ( uLen <= 65535 ) - { - stFrame.nPayloadLenght = 126; - Write(&stFrame, 2); - uint16_t uLenN = htons(uLen); - Write(&uLenN, 2); - Write(&iMask, 4); - } - else - { - stFrame.nPayloadLenght = 127; - Write(&stFrame, 2); - Write(&iMask, 4); - Write(&uLen, 8); - } - Write((void*)szData, uLen); - -} - -CUtlString CHTTPClient::WebSocket_RecvText() -{ - WebSocketFrame_t stFrame; - size_t uLen = 0; - CUtlBuffer szText; - Read(&stFrame, 2); - if (stFrame.nPayloadLenght == 126) - { - Read(&uLen, 2); - } else if (stFrame.nPayloadLenght == 127) - { - Read(&uLen, 8); - } else { - uLen = stFrame.nPayloadLenght; - } - szText = CUtlBuffer(uLen+1); - Read(szText, uLen); - szText[uLen] = 0; - return szText.GetMemory(); -} - -void CHTTPClient::WebSocket_SendBinary( size_t uSize, const void *pData ) -{ - -} - -WebSocketPacket_t CHTTPClient::WebSocket_RecvBinary() -{ - -} - - -ssize_t CHTTPClient::Write( void *pData, ssize_t uSize ) -{ - if (m_bIsSecure) - return SSL_write(m_pSSL, pData, uSize); - else - return write(m_iFileDescriptor, pData, uSize); -} - -ssize_t CHTTPClient::Read( void *pData, ssize_t uSize ) -{ - ssize_t n; - if ( m_bIsSecure ) - { - n = SSL_read(m_pSSL, pData, uSize); - if (n == 0) - return -1; - } - else - { - n = read(m_iFileDescriptor, pData, uSize); - if (n == -1) - return -1; - } - return n; -} - - - -abstract_class CHTTPClientManager: public IHTTPClientManager -{ -public: - CHTTPClientManager(); - virtual IHTTPClient *Connect( const char *szUrl, bool bSecure, uint16_t *pPort ) override; - virtual void Disconnect( IHTTPClient *szConnection ) override; -}; - -IHTTPClient *CHTTPClientManager::Connect( const char *szUrl, bool bSecure, uint16_t *pPort ) -{ - CHTTPClient *pClient; - int fd = 0; - - pClient = new CHTTPClient(); - if (pPort) - pClient->m_uPort = *pPort; - else - { - if (bSecure) - pClient->m_uPort = 443; - else - pClient->m_uPort = 80; - } - - fd = socket(AF_INET, SOCK_STREAM, 0); - if ( fd < 0 ) - return NULL; - - pClient->m_iFileDescriptor = fd; - - pClient->m_szHostName = szUrl; - pClient->m_bIsSecure = bSecure; - return pClient; -} - -void CHTTPClientManager::Disconnect( IHTTPClient *pClient ) -{ - CHTTPClient *pC = (CHTTPClient*)pClient; - close(pC->m_iFileDescriptor); -} - -CHTTPClientManager::CHTTPClientManager() -{ - SSL_library_init(); - SSL_load_error_strings(); - OpenSSL_add_all_algorithms(); -} - - -CHTTPClientManager s_HttpClientManager; -EXPOSE_INTERFACE_GLOBALVAR(IHTTPClientManager, CHTTPClientManager, HTTP_CLIENT_INTERFACE_VERSION, s_HttpClientManager); - diff --git a/http/test.cpp b/http/test.cpp deleted file mode 100644 index dc2294d..0000000 --- a/http/test.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "http/http.h" -#include "tier1/interface.h" - -IHTTPClientManager *g_pHttpClientMgr; -int main() -{ - Sys_GetFactory("tier0"); - CreateInterfaceFn pHttpFactory = Sys_GetFactory("funnyhttp"); - g_pHttpClientMgr = (IHTTPClientManager*)pHttpFactory(HTTP_CLIENT_INTERFACE_VERSION, NULL); - if ( !g_pHttpClientMgr ) - return 0; - IHTTPClient *pClient = g_pHttpClientMgr->Connect("www.example.com", true, NULL); - printf("%p\n",pClient); - if ( pClient == NULL ) - return 0; - HTTPHeaderParam_t params[] = { - {"User-Agent", "Funny"}, - {"Accept", "application/json"}, - }; - - HTTPHeader_t stHeader = { - sizeof(params)/sizeof(params[0]), - params - }; - pClient->Get("/", &stHeader); - - HTTPResponse_t stResponse = pClient->GetResponse(); - if (stResponse.m_uCode == 200) - { - V_printf("%s\n", stResponse.m_message.GetMemory()); - } - - g_pHttpClientMgr->Disconnect(pClient); - - return 0; -} diff --git a/ios_deploy/funnygame/Frameworks/.framework/Headers/SDL_gamepad.h b/ios_deploy/funnygame/Frameworks/.framework/Headers/SDL_gamepad.h deleted file mode 100644 index 460ae98..0000000 --- a/ios_deploy/funnygame/Frameworks/.framework/Headers/SDL_gamepad.h +++ /dev/null @@ -1,1513 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2025 Sam Lantinga - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/** - * # CategoryGamepad - * - * SDL provides a low-level joystick API, which just treats joysticks as an - * arbitrary pile of buttons, axes, and hat switches. If you're planning to - * write your own control configuration screen, this can give you a lot of - * flexibility, but that's a lot of work, and most things that we consider - * "joysticks" now are actually console-style gamepads. So SDL provides the - * gamepad API on top of the lower-level joystick functionality. - * - * The difference between a joystick and a gamepad is that a gamepad tells you - * _where_ a button or axis is on the device. You don't speak to gamepads in - * terms of arbitrary numbers like "button 3" or "axis 2" but in standard - * locations: the d-pad, the shoulder buttons, triggers, A/B/X/Y (or - * X/O/Square/Triangle, if you will). - * - * One turns a joystick into a gamepad by providing a magic configuration - * string, which tells SDL the details of a specific device: when you see this - * specific hardware, if button 2 gets pressed, this is actually D-Pad Up, - * etc. - * - * SDL has many popular controllers configured out of the box, and users can - * add their own controller details through an environment variable if it's - * otherwise unknown to SDL. - * - * In order to use these functions, SDL_Init() must have been called with the - * SDL_INIT_GAMEPAD flag. This causes SDL to scan the system for gamepads, and - * load appropriate drivers. - * - * If you would like to receive gamepad updates while the application is in - * the background, you should set the following hint before calling - * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS - * - * Gamepads support various optional features such as rumble, color LEDs, - * touchpad, gyro, etc. The support for these features varies depending on the - * controller and OS support available. You can check for LED and rumble - * capabilities at runtime by calling SDL_GetGamepadProperties() and checking - * the various capability properties. You can check for touchpad by calling - * SDL_GetNumGamepadTouchpads() and check for gyro and accelerometer by - * calling SDL_GamepadHasSensor(). - * - * By default SDL will try to use the most capable driver available, but you - * can tune which OS drivers to use with the various joystick hints in - * SDL_hints.h. - * - * Your application should always support gamepad hotplugging. On some - * platforms like Xbox, Steam Deck, etc., this is a requirement for - * certification. On other platforms, like macOS and Windows when using - * Windows.Gaming.Input, controllers may not be available at startup and will - * come in at some point after you've started processing events. - */ - -#ifndef SDL_gamepad_h_ -#define SDL_gamepad_h_ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -/* Set up for C function definitions, even when using C++ */ -#ifdef __cplusplus -extern "C" { -#endif - -/** - * The structure used to identify an SDL gamepad - * - * \since This struct is available since SDL 3.2.0. - */ -typedef struct SDL_Gamepad SDL_Gamepad; - -/** - * Standard gamepad types. - * - * This type does not necessarily map to first-party controllers from - * Microsoft/Sony/Nintendo; in many cases, third-party controllers can report - * as these, either because they were designed for a specific console, or they - * simply most closely match that console's controllers (does it have A/B/X/Y - * buttons or X/O/Square/Triangle? Does it have a touchpad? etc). - */ -typedef enum SDL_GamepadType -{ - SDL_GAMEPAD_TYPE_UNKNOWN = 0, - SDL_GAMEPAD_TYPE_STANDARD, - SDL_GAMEPAD_TYPE_XBOX360, - SDL_GAMEPAD_TYPE_XBOXONE, - SDL_GAMEPAD_TYPE_PS3, - SDL_GAMEPAD_TYPE_PS4, - SDL_GAMEPAD_TYPE_PS5, - SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO, - SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT, - SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT, - SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR, - SDL_GAMEPAD_TYPE_GAMECUBE, - SDL_GAMEPAD_TYPE_COUNT -} SDL_GamepadType; - -/** - * The list of buttons available on a gamepad - * - * For controllers that use a diamond pattern for the face buttons, the - * south/east/west/north buttons below correspond to the locations in the - * diamond pattern. For Xbox controllers, this would be A/B/X/Y, for Nintendo - * Switch controllers, this would be B/A/Y/X, for GameCube controllers this - * would be A/X/B/Y, for PlayStation controllers this would be - * Cross/Circle/Square/Triangle. - * - * For controllers that don't use a diamond pattern for the face buttons, the - * south/east/west/north buttons indicate the buttons labeled A, B, C, D, or - * 1, 2, 3, 4, or for controllers that aren't labeled, they are the primary, - * secondary, etc. buttons. - * - * The activate action is often the south button and the cancel action is - * often the east button, but in some regions this is reversed, so your game - * should allow remapping actions based on user preferences. - * - * You can query the labels for the face buttons using - * SDL_GetGamepadButtonLabel() - * - * \since This enum is available since SDL 3.2.0. - */ -typedef enum SDL_GamepadButton -{ - SDL_GAMEPAD_BUTTON_INVALID = -1, - SDL_GAMEPAD_BUTTON_SOUTH, /**< Bottom face button (e.g. Xbox A button) */ - SDL_GAMEPAD_BUTTON_EAST, /**< Right face button (e.g. Xbox B button) */ - SDL_GAMEPAD_BUTTON_WEST, /**< Left face button (e.g. Xbox X button) */ - SDL_GAMEPAD_BUTTON_NORTH, /**< Top face button (e.g. Xbox Y button) */ - SDL_GAMEPAD_BUTTON_BACK, - SDL_GAMEPAD_BUTTON_GUIDE, - SDL_GAMEPAD_BUTTON_START, - SDL_GAMEPAD_BUTTON_LEFT_STICK, - SDL_GAMEPAD_BUTTON_RIGHT_STICK, - SDL_GAMEPAD_BUTTON_LEFT_SHOULDER, - SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER, - SDL_GAMEPAD_BUTTON_DPAD_UP, - SDL_GAMEPAD_BUTTON_DPAD_DOWN, - SDL_GAMEPAD_BUTTON_DPAD_LEFT, - SDL_GAMEPAD_BUTTON_DPAD_RIGHT, - SDL_GAMEPAD_BUTTON_MISC1, /**< Additional button (e.g. Xbox Series X share button, PS5 microphone button, Nintendo Switch Pro capture button, Amazon Luna microphone button, Google Stadia capture button) */ - SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1, /**< Upper or primary paddle, under your right hand (e.g. Xbox Elite paddle P1) */ - SDL_GAMEPAD_BUTTON_LEFT_PADDLE1, /**< Upper or primary paddle, under your left hand (e.g. Xbox Elite paddle P3) */ - SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2, /**< Lower or secondary paddle, under your right hand (e.g. Xbox Elite paddle P2) */ - SDL_GAMEPAD_BUTTON_LEFT_PADDLE2, /**< Lower or secondary paddle, under your left hand (e.g. Xbox Elite paddle P4) */ - SDL_GAMEPAD_BUTTON_TOUCHPAD, /**< PS4/PS5 touchpad button */ - SDL_GAMEPAD_BUTTON_MISC2, /**< Additional button */ - SDL_GAMEPAD_BUTTON_MISC3, /**< Additional button */ - SDL_GAMEPAD_BUTTON_MISC4, /**< Additional button */ - SDL_GAMEPAD_BUTTON_MISC5, /**< Additional button */ - SDL_GAMEPAD_BUTTON_MISC6, /**< Additional button */ - SDL_GAMEPAD_BUTTON_COUNT -} SDL_GamepadButton; - -/** - * The set of gamepad button labels - * - * This isn't a complete set, just the face buttons to make it easy to show - * button prompts. - * - * For a complete set, you should look at the button and gamepad type and have - * a set of symbols that work well with your art style. - * - * \since This enum is available since SDL 3.2.0. - */ -typedef enum SDL_GamepadButtonLabel -{ - SDL_GAMEPAD_BUTTON_LABEL_UNKNOWN, - SDL_GAMEPAD_BUTTON_LABEL_A, - SDL_GAMEPAD_BUTTON_LABEL_B, - SDL_GAMEPAD_BUTTON_LABEL_X, - SDL_GAMEPAD_BUTTON_LABEL_Y, - SDL_GAMEPAD_BUTTON_LABEL_CROSS, - SDL_GAMEPAD_BUTTON_LABEL_CIRCLE, - SDL_GAMEPAD_BUTTON_LABEL_SQUARE, - SDL_GAMEPAD_BUTTON_LABEL_TRIANGLE -} SDL_GamepadButtonLabel; - -/** - * The list of axes available on a gamepad - * - * Thumbstick axis values range from SDL_JOYSTICK_AXIS_MIN to - * SDL_JOYSTICK_AXIS_MAX, and are centered within ~8000 of zero, though - * advanced UI will allow users to set or autodetect the dead zone, which - * varies between gamepads. - * - * Trigger axis values range from 0 (released) to SDL_JOYSTICK_AXIS_MAX (fully - * pressed) when reported by SDL_GetGamepadAxis(). Note that this is not the - * same range that will be reported by the lower-level SDL_GetJoystickAxis(). - * - * \since This enum is available since SDL 3.2.0. - */ -typedef enum SDL_GamepadAxis -{ - SDL_GAMEPAD_AXIS_INVALID = -1, - SDL_GAMEPAD_AXIS_LEFTX, - SDL_GAMEPAD_AXIS_LEFTY, - SDL_GAMEPAD_AXIS_RIGHTX, - SDL_GAMEPAD_AXIS_RIGHTY, - SDL_GAMEPAD_AXIS_LEFT_TRIGGER, - SDL_GAMEPAD_AXIS_RIGHT_TRIGGER, - SDL_GAMEPAD_AXIS_COUNT -} SDL_GamepadAxis; - -/** - * Types of gamepad control bindings. - * - * A gamepad is a collection of bindings that map arbitrary joystick buttons, - * axes and hat switches to specific positions on a generic console-style - * gamepad. This enum is used as part of SDL_GamepadBinding to specify those - * mappings. - * - * \since This enum is available since SDL 3.2.0. - */ -typedef enum SDL_GamepadBindingType -{ - SDL_GAMEPAD_BINDTYPE_NONE = 0, - SDL_GAMEPAD_BINDTYPE_BUTTON, - SDL_GAMEPAD_BINDTYPE_AXIS, - SDL_GAMEPAD_BINDTYPE_HAT -} SDL_GamepadBindingType; - -/** - * A mapping between one joystick input to a gamepad control. - * - * A gamepad has a collection of several bindings, to say, for example, when - * joystick button number 5 is pressed, that should be treated like the - * gamepad's "start" button. - * - * SDL has these bindings built-in for many popular controllers, and can add - * more with a simple text string. Those strings are parsed into a collection - * of these structs to make it easier to operate on the data. - * - * \since This struct is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadBindings - */ -typedef struct SDL_GamepadBinding -{ - SDL_GamepadBindingType input_type; - union - { - int button; - - struct - { - int axis; - int axis_min; - int axis_max; - } axis; - - struct - { - int hat; - int hat_mask; - } hat; - - } input; - - SDL_GamepadBindingType output_type; - union - { - SDL_GamepadButton button; - - struct - { - SDL_GamepadAxis axis; - int axis_min; - int axis_max; - } axis; - - } output; -} SDL_GamepadBinding; - - -/** - * Add support for gamepads that SDL is unaware of or change the binding of an - * existing gamepad. - * - * The mapping string has the format "GUID,name,mapping", where GUID is the - * string value from SDL_GUIDToString(), name is the human readable string for - * the device and mappings are gamepad mappings to joystick ones. Under - * Windows there is a reserved GUID of "xinput" that covers all XInput - * devices. The mapping format for joystick is: - * - * - `bX`: a joystick button, index X - * - `hX.Y`: hat X with value Y - * - `aX`: axis X of the joystick - * - * Buttons can be used as a gamepad axes and vice versa. - * - * If a device with this GUID is already plugged in, SDL will generate an - * SDL_EVENT_GAMEPAD_ADDED event. - * - * This string shows an example of a valid mapping for a gamepad: - * - * ```c - * "341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7" - * ``` - * - * \param mapping the mapping string. - * \returns 1 if a new mapping is added, 0 if an existing mapping is updated, - * -1 on failure; call SDL_GetError() for more information. - * - * \threadsafety It is safe to call this function from any thread. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_AddGamepadMappingsFromFile - * \sa SDL_AddGamepadMappingsFromIO - * \sa SDL_GetGamepadMapping - * \sa SDL_GetGamepadMappingForGUID - * \sa SDL_HINT_GAMECONTROLLERCONFIG - * \sa SDL_HINT_GAMECONTROLLERCONFIG_FILE - * \sa SDL_EVENT_GAMEPAD_ADDED - */ -extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMapping(const char *mapping); - -/** - * Load a set of gamepad mappings from an SDL_IOStream. - * - * You can call this function several times, if needed, to load different - * database files. - * - * If a new mapping is loaded for an already known gamepad GUID, the later - * version will overwrite the one currently loaded. - * - * Any new mappings for already plugged in controllers will generate - * SDL_EVENT_GAMEPAD_ADDED events. - * - * Mappings not belonging to the current platform or with no platform field - * specified will be ignored (i.e. mappings for Linux will be ignored in - * Windows, etc). - * - * This function will load the text database entirely in memory before - * processing it, so take this into consideration if you are in a memory - * constrained environment. - * - * \param src the data stream for the mappings to be added. - * \param closeio if true, calls SDL_CloseIO() on `src` before returning, even - * in the case of an error. - * \returns the number of mappings added or -1 on failure; call SDL_GetError() - * for more information. - * - * \threadsafety It is safe to call this function from any thread. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_AddGamepadMapping - * \sa SDL_AddGamepadMappingsFromFile - * \sa SDL_GetGamepadMapping - * \sa SDL_GetGamepadMappingForGUID - * \sa SDL_HINT_GAMECONTROLLERCONFIG - * \sa SDL_HINT_GAMECONTROLLERCONFIG_FILE - * \sa SDL_EVENT_GAMEPAD_ADDED - */ -extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromIO(SDL_IOStream *src, bool closeio); - -/** - * Load a set of gamepad mappings from a file. - * - * You can call this function several times, if needed, to load different - * database files. - * - * If a new mapping is loaded for an already known gamepad GUID, the later - * version will overwrite the one currently loaded. - * - * Any new mappings for already plugged in controllers will generate - * SDL_EVENT_GAMEPAD_ADDED events. - * - * Mappings not belonging to the current platform or with no platform field - * specified will be ignored (i.e. mappings for Linux will be ignored in - * Windows, etc). - * - * \param file the mappings file to load. - * \returns the number of mappings added or -1 on failure; call SDL_GetError() - * for more information. - * - * \threadsafety It is safe to call this function from any thread. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_AddGamepadMapping - * \sa SDL_AddGamepadMappingsFromIO - * \sa SDL_GetGamepadMapping - * \sa SDL_GetGamepadMappingForGUID - * \sa SDL_HINT_GAMECONTROLLERCONFIG - * \sa SDL_HINT_GAMECONTROLLERCONFIG_FILE - * \sa SDL_EVENT_GAMEPAD_ADDED - */ -extern SDL_DECLSPEC int SDLCALL SDL_AddGamepadMappingsFromFile(const char *file); - -/** - * Reinitialize the SDL mapping database to its initial state. - * - * This will generate gamepad events as needed if device mappings change. - * - * \returns true on success or false on failure; call SDL_GetError() for more - * information. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC bool SDLCALL SDL_ReloadGamepadMappings(void); - -/** - * Get the current gamepad mappings. - * - * \param count a pointer filled in with the number of mappings returned, can - * be NULL. - * \returns an array of the mapping strings, NULL-terminated, or NULL on - * failure; call SDL_GetError() for more information. This is a - * single allocation that should be freed with SDL_free() when it is - * no longer needed. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC char ** SDLCALL SDL_GetGamepadMappings(int *count); - -/** - * Get the gamepad mapping string for a given GUID. - * - * \param guid a structure containing the GUID for which a mapping is desired. - * \returns a mapping string or NULL on failure; call SDL_GetError() for more - * information. This should be freed with SDL_free() when it is no - * longer needed. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetJoystickGUIDForID - * \sa SDL_GetJoystickGUID - */ -extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMappingForGUID(SDL_GUID guid); - -/** - * Get the current mapping of a gamepad. - * - * Details about mappings are discussed with SDL_AddGamepadMapping(). - * - * \param gamepad the gamepad you want to get the current mapping for. - * \returns a string that has the gamepad's mapping or NULL if no mapping is - * available; call SDL_GetError() for more information. This should - * be freed with SDL_free() when it is no longer needed. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_AddGamepadMapping - * \sa SDL_GetGamepadMappingForID - * \sa SDL_GetGamepadMappingForGUID - * \sa SDL_SetGamepadMapping - */ -extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMapping(SDL_Gamepad *gamepad); - -/** - * Set the current mapping of a joystick or gamepad. - * - * Details about mappings are discussed with SDL_AddGamepadMapping(). - * - * \param instance_id the joystick instance ID. - * \param mapping the mapping to use for this device, or NULL to clear the - * mapping. - * \returns true on success or false on failure; call SDL_GetError() for more - * information. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_AddGamepadMapping - * \sa SDL_GetGamepadMapping - */ -extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadMapping(SDL_JoystickID instance_id, const char *mapping); - -/** - * Return whether a gamepad is currently connected. - * - * \returns true if a gamepad is connected, false otherwise. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepads - */ -extern SDL_DECLSPEC bool SDLCALL SDL_HasGamepad(void); - -/** - * Get a list of currently connected gamepads. - * - * \param count a pointer filled in with the number of gamepads returned, may - * be NULL. - * \returns a 0 terminated array of joystick instance IDs or NULL on failure; - * call SDL_GetError() for more information. This should be freed - * with SDL_free() when it is no longer needed. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_HasGamepad - * \sa SDL_OpenGamepad - */ -extern SDL_DECLSPEC SDL_JoystickID * SDLCALL SDL_GetGamepads(int *count); - -/** - * Check if the given joystick is supported by the gamepad interface. - * - * \param instance_id the joystick instance ID. - * \returns true if the given joystick is supported by the gamepad interface, - * false if it isn't or it's an invalid index. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetJoysticks - * \sa SDL_OpenGamepad - */ -extern SDL_DECLSPEC bool SDLCALL SDL_IsGamepad(SDL_JoystickID instance_id); - -/** - * Get the implementation dependent name of a gamepad. - * - * This can be called before any gamepads are opened. - * - * \param instance_id the joystick instance ID. - * \returns the name of the selected gamepad. If no name can be found, this - * function returns NULL; call SDL_GetError() for more information. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadName - * \sa SDL_GetGamepads - */ -extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadNameForID(SDL_JoystickID instance_id); - -/** - * Get the implementation dependent path of a gamepad. - * - * This can be called before any gamepads are opened. - * - * \param instance_id the joystick instance ID. - * \returns the path of the selected gamepad. If no path can be found, this - * function returns NULL; call SDL_GetError() for more information. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadPath - * \sa SDL_GetGamepads - */ -extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadPathForID(SDL_JoystickID instance_id); - -/** - * Get the player index of a gamepad. - * - * This can be called before any gamepads are opened. - * - * \param instance_id the joystick instance ID. - * \returns the player index of a gamepad, or -1 if it's not available. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadPlayerIndex - * \sa SDL_GetGamepads - */ -extern SDL_DECLSPEC int SDLCALL SDL_GetGamepadPlayerIndexForID(SDL_JoystickID instance_id); - -/** - * Get the implementation-dependent GUID of a gamepad. - * - * This can be called before any gamepads are opened. - * - * \param instance_id the joystick instance ID. - * \returns the GUID of the selected gamepad. If called on an invalid index, - * this function returns a zero GUID. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GUIDToString - * \sa SDL_GetGamepads - */ -extern SDL_DECLSPEC SDL_GUID SDLCALL SDL_GetGamepadGUIDForID(SDL_JoystickID instance_id); - -/** - * Get the USB vendor ID of a gamepad, if available. - * - * This can be called before any gamepads are opened. If the vendor ID isn't - * available this function returns 0. - * - * \param instance_id the joystick instance ID. - * \returns the USB vendor ID of the selected gamepad. If called on an invalid - * index, this function returns zero. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadVendor - * \sa SDL_GetGamepads - */ -extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadVendorForID(SDL_JoystickID instance_id); - -/** - * Get the USB product ID of a gamepad, if available. - * - * This can be called before any gamepads are opened. If the product ID isn't - * available this function returns 0. - * - * \param instance_id the joystick instance ID. - * \returns the USB product ID of the selected gamepad. If called on an - * invalid index, this function returns zero. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadProduct - * \sa SDL_GetGamepads - */ -extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductForID(SDL_JoystickID instance_id); - -/** - * Get the product version of a gamepad, if available. - * - * This can be called before any gamepads are opened. If the product version - * isn't available this function returns 0. - * - * \param instance_id the joystick instance ID. - * \returns the product version of the selected gamepad. If called on an - * invalid index, this function returns zero. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadProductVersion - * \sa SDL_GetGamepads - */ -extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductVersionForID(SDL_JoystickID instance_id); - -/** - * Get the type of a gamepad. - * - * This can be called before any gamepads are opened. - * - * \param instance_id the joystick instance ID. - * \returns the gamepad type. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadType - * \sa SDL_GetGamepads - * \sa SDL_GetRealGamepadTypeForID - */ -extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadTypeForID(SDL_JoystickID instance_id); - -/** - * Get the type of a gamepad, ignoring any mapping override. - * - * This can be called before any gamepads are opened. - * - * \param instance_id the joystick instance ID. - * \returns the gamepad type. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadTypeForID - * \sa SDL_GetGamepads - * \sa SDL_GetRealGamepadType - */ -extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetRealGamepadTypeForID(SDL_JoystickID instance_id); - -/** - * Get the mapping of a gamepad. - * - * This can be called before any gamepads are opened. - * - * \param instance_id the joystick instance ID. - * \returns the mapping string. Returns NULL if no mapping is available. This - * should be freed with SDL_free() when it is no longer needed. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepads - * \sa SDL_GetGamepadMapping - */ -extern SDL_DECLSPEC char * SDLCALL SDL_GetGamepadMappingForID(SDL_JoystickID instance_id); - -/** - * Open a gamepad for use. - * - * \param instance_id the joystick instance ID. - * \returns a gamepad identifier or NULL if an error occurred; call - * SDL_GetError() for more information. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_CloseGamepad - * \sa SDL_IsGamepad - */ -extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_OpenGamepad(SDL_JoystickID instance_id); - -/** - * Get the SDL_Gamepad associated with a joystick instance ID, if it has been - * opened. - * - * \param instance_id the joystick instance ID of the gamepad. - * \returns an SDL_Gamepad on success or NULL on failure or if it hasn't been - * opened yet; call SDL_GetError() for more information. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromID(SDL_JoystickID instance_id); - -/** - * Get the SDL_Gamepad associated with a player index. - * - * \param player_index the player index, which different from the instance ID. - * \returns the SDL_Gamepad associated with a player index. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadPlayerIndex - * \sa SDL_SetGamepadPlayerIndex - */ -extern SDL_DECLSPEC SDL_Gamepad * SDLCALL SDL_GetGamepadFromPlayerIndex(int player_index); - -/** - * Get the properties associated with an opened gamepad. - * - * These properties are shared with the underlying joystick object. - * - * The following read-only properties are provided by SDL: - * - * - `SDL_PROP_GAMEPAD_CAP_MONO_LED_BOOLEAN`: true if this gamepad has an LED - * that has adjustable brightness - * - `SDL_PROP_GAMEPAD_CAP_RGB_LED_BOOLEAN`: true if this gamepad has an LED - * that has adjustable color - * - `SDL_PROP_GAMEPAD_CAP_PLAYER_LED_BOOLEAN`: true if this gamepad has a - * player LED - * - `SDL_PROP_GAMEPAD_CAP_RUMBLE_BOOLEAN`: true if this gamepad has - * left/right rumble - * - `SDL_PROP_GAMEPAD_CAP_TRIGGER_RUMBLE_BOOLEAN`: true if this gamepad has - * simple trigger rumble - * - * \param gamepad a gamepad identifier previously returned by - * SDL_OpenGamepad(). - * \returns a valid property ID on success or 0 on failure; call - * SDL_GetError() for more information. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGamepadProperties(SDL_Gamepad *gamepad); - -#define SDL_PROP_GAMEPAD_CAP_MONO_LED_BOOLEAN SDL_PROP_JOYSTICK_CAP_MONO_LED_BOOLEAN -#define SDL_PROP_GAMEPAD_CAP_RGB_LED_BOOLEAN SDL_PROP_JOYSTICK_CAP_RGB_LED_BOOLEAN -#define SDL_PROP_GAMEPAD_CAP_PLAYER_LED_BOOLEAN SDL_PROP_JOYSTICK_CAP_PLAYER_LED_BOOLEAN -#define SDL_PROP_GAMEPAD_CAP_RUMBLE_BOOLEAN SDL_PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN -#define SDL_PROP_GAMEPAD_CAP_TRIGGER_RUMBLE_BOOLEAN SDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN - -/** - * Get the instance ID of an opened gamepad. - * - * \param gamepad a gamepad identifier previously returned by - * SDL_OpenGamepad(). - * \returns the instance ID of the specified gamepad on success or 0 on - * failure; call SDL_GetError() for more information. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC SDL_JoystickID SDLCALL SDL_GetGamepadID(SDL_Gamepad *gamepad); - -/** - * Get the implementation-dependent name for an opened gamepad. - * - * \param gamepad a gamepad identifier previously returned by - * SDL_OpenGamepad(). - * \returns the implementation dependent name for the gamepad, or NULL if - * there is no name or the identifier passed is invalid. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadNameForID - */ -extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadName(SDL_Gamepad *gamepad); - -/** - * Get the implementation-dependent path for an opened gamepad. - * - * \param gamepad a gamepad identifier previously returned by - * SDL_OpenGamepad(). - * \returns the implementation dependent path for the gamepad, or NULL if - * there is no path or the identifier passed is invalid. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadPathForID - */ -extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadPath(SDL_Gamepad *gamepad); - -/** - * Get the type of an opened gamepad. - * - * \param gamepad the gamepad object to query. - * \returns the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it's not - * available. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadTypeForID - */ -extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadType(SDL_Gamepad *gamepad); - -/** - * Get the type of an opened gamepad, ignoring any mapping override. - * - * \param gamepad the gamepad object to query. - * \returns the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it's not - * available. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetRealGamepadTypeForID - */ -extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetRealGamepadType(SDL_Gamepad *gamepad); - -/** - * Get the player index of an opened gamepad. - * - * For XInput gamepads this returns the XInput user index. - * - * \param gamepad the gamepad object to query. - * \returns the player index for gamepad, or -1 if it's not available. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_SetGamepadPlayerIndex - */ -extern SDL_DECLSPEC int SDLCALL SDL_GetGamepadPlayerIndex(SDL_Gamepad *gamepad); - -/** - * Set the player index of an opened gamepad. - * - * \param gamepad the gamepad object to adjust. - * \param player_index player index to assign to this gamepad, or -1 to clear - * the player index and turn off player LEDs. - * \returns true on success or false on failure; call SDL_GetError() for more - * information. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadPlayerIndex - */ -extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadPlayerIndex(SDL_Gamepad *gamepad, int player_index); - -/** - * Get the USB vendor ID of an opened gamepad, if available. - * - * If the vendor ID isn't available this function returns 0. - * - * \param gamepad the gamepad object to query. - * \returns the USB vendor ID, or zero if unavailable. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadVendorForID - */ -extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadVendor(SDL_Gamepad *gamepad); - -/** - * Get the USB product ID of an opened gamepad, if available. - * - * If the product ID isn't available this function returns 0. - * - * \param gamepad the gamepad object to query. - * \returns the USB product ID, or zero if unavailable. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadProductForID - */ -extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProduct(SDL_Gamepad *gamepad); - -/** - * Get the product version of an opened gamepad, if available. - * - * If the product version isn't available this function returns 0. - * - * \param gamepad the gamepad object to query. - * \returns the USB product version, or zero if unavailable. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadProductVersionForID - */ -extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadProductVersion(SDL_Gamepad *gamepad); - -/** - * Get the firmware version of an opened gamepad, if available. - * - * If the firmware version isn't available this function returns 0. - * - * \param gamepad the gamepad object to query. - * \returns the gamepad firmware version, or zero if unavailable. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC Uint16 SDLCALL SDL_GetGamepadFirmwareVersion(SDL_Gamepad *gamepad); - -/** - * Get the serial number of an opened gamepad, if available. - * - * Returns the serial number of the gamepad, or NULL if it is not available. - * - * \param gamepad the gamepad object to query. - * \returns the serial number, or NULL if unavailable. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadSerial(SDL_Gamepad *gamepad); - -/** - * Get the Steam Input handle of an opened gamepad, if available. - * - * Returns an InputHandle_t for the gamepad that can be used with Steam Input - * API: https://partner.steamgames.com/doc/api/ISteamInput - * - * \param gamepad the gamepad object to query. - * \returns the gamepad handle, or 0 if unavailable. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC Uint64 SDLCALL SDL_GetGamepadSteamHandle(SDL_Gamepad *gamepad); - -/** - * Get the connection state of a gamepad. - * - * \param gamepad the gamepad object to query. - * \returns the connection state on success or - * `SDL_JOYSTICK_CONNECTION_INVALID` on failure; call SDL_GetError() - * for more information. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC SDL_JoystickConnectionState SDLCALL SDL_GetGamepadConnectionState(SDL_Gamepad *gamepad); - -/** - * Get the battery state of a gamepad. - * - * You should never take a battery status as absolute truth. Batteries - * (especially failing batteries) are delicate hardware, and the values - * reported here are best estimates based on what that hardware reports. It's - * not uncommon for older batteries to lose stored power much faster than it - * reports, or completely drain when reporting it has 20 percent left, etc. - * - * \param gamepad the gamepad object to query. - * \param percent a pointer filled in with the percentage of battery life - * left, between 0 and 100, or NULL to ignore. This will be - * filled in with -1 we can't determine a value or there is no - * battery. - * \returns the current battery state. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC SDL_PowerState SDLCALL SDL_GetGamepadPowerInfo(SDL_Gamepad *gamepad, int *percent); - -/** - * Check if a gamepad has been opened and is currently connected. - * - * \param gamepad a gamepad identifier previously returned by - * SDL_OpenGamepad(). - * \returns true if the gamepad has been opened and is currently connected, or - * false if not. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC bool SDLCALL SDL_GamepadConnected(SDL_Gamepad *gamepad); - -/** - * Get the underlying joystick from a gamepad. - * - * This function will give you a SDL_Joystick object, which allows you to use - * the SDL_Joystick functions with a SDL_Gamepad object. This would be useful - * for getting a joystick's position at any given time, even if it hasn't - * moved (moving it would produce an event, which would have the axis' value). - * - * The pointer returned is owned by the SDL_Gamepad. You should not call - * SDL_CloseJoystick() on it, for example, since doing so will likely cause - * SDL to crash. - * - * \param gamepad the gamepad object that you want to get a joystick from. - * \returns an SDL_Joystick object, or NULL on failure; call SDL_GetError() - * for more information. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC SDL_Joystick * SDLCALL SDL_GetGamepadJoystick(SDL_Gamepad *gamepad); - -/** - * Set the state of gamepad event processing. - * - * If gamepad events are disabled, you must call SDL_UpdateGamepads() yourself - * and check the state of the gamepad when you want gamepad information. - * - * \param enabled whether to process gamepad events or not. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GamepadEventsEnabled - * \sa SDL_UpdateGamepads - */ -extern SDL_DECLSPEC void SDLCALL SDL_SetGamepadEventsEnabled(bool enabled); - -/** - * Query the state of gamepad event processing. - * - * If gamepad events are disabled, you must call SDL_UpdateGamepads() yourself - * and check the state of the gamepad when you want gamepad information. - * - * \returns true if gamepad events are being processed, false otherwise. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_SetGamepadEventsEnabled - */ -extern SDL_DECLSPEC bool SDLCALL SDL_GamepadEventsEnabled(void); - -/** - * Get the SDL joystick layer bindings for a gamepad. - * - * \param gamepad a gamepad. - * \param count a pointer filled in with the number of bindings returned. - * \returns a NULL terminated array of pointers to bindings or NULL on - * failure; call SDL_GetError() for more information. This is a - * single allocation that should be freed with SDL_free() when it is - * no longer needed. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC SDL_GamepadBinding ** SDLCALL SDL_GetGamepadBindings(SDL_Gamepad *gamepad, int *count); - -/** - * Manually pump gamepad updates if not using the loop. - * - * This function is called automatically by the event loop if events are - * enabled. Under such circumstances, it will not be necessary to call this - * function. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC void SDLCALL SDL_UpdateGamepads(void); - -/** - * Convert a string into SDL_GamepadType enum. - * - * This function is called internally to translate SDL_Gamepad mapping strings - * for the underlying joystick device into the consistent SDL_Gamepad mapping. - * You do not normally need to call this function unless you are parsing - * SDL_Gamepad mappings in your own code. - * - * \param str string representing a SDL_GamepadType type. - * \returns the SDL_GamepadType enum corresponding to the input string, or - * `SDL_GAMEPAD_TYPE_UNKNOWN` if no match was found. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadStringForType - */ -extern SDL_DECLSPEC SDL_GamepadType SDLCALL SDL_GetGamepadTypeFromString(const char *str); - -/** - * Convert from an SDL_GamepadType enum to a string. - * - * \param type an enum value for a given SDL_GamepadType. - * \returns a string for the given type, or NULL if an invalid type is - * specified. The string returned is of the format used by - * SDL_Gamepad mapping strings. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadTypeFromString - */ -extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForType(SDL_GamepadType type); - -/** - * Convert a string into SDL_GamepadAxis enum. - * - * This function is called internally to translate SDL_Gamepad mapping strings - * for the underlying joystick device into the consistent SDL_Gamepad mapping. - * You do not normally need to call this function unless you are parsing - * SDL_Gamepad mappings in your own code. - * - * Note specially that "righttrigger" and "lefttrigger" map to - * `SDL_GAMEPAD_AXIS_RIGHT_TRIGGER` and `SDL_GAMEPAD_AXIS_LEFT_TRIGGER`, - * respectively. - * - * \param str string representing a SDL_Gamepad axis. - * \returns the SDL_GamepadAxis enum corresponding to the input string, or - * `SDL_GAMEPAD_AXIS_INVALID` if no match was found. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadStringForAxis - */ -extern SDL_DECLSPEC SDL_GamepadAxis SDLCALL SDL_GetGamepadAxisFromString(const char *str); - -/** - * Convert from an SDL_GamepadAxis enum to a string. - * - * \param axis an enum value for a given SDL_GamepadAxis. - * \returns a string for the given axis, or NULL if an invalid axis is - * specified. The string returned is of the format used by - * SDL_Gamepad mapping strings. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadAxisFromString - */ -extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForAxis(SDL_GamepadAxis axis); - -/** - * Query whether a gamepad has a given axis. - * - * This merely reports whether the gamepad's mapping defined this axis, as - * that is all the information SDL has about the physical device. - * - * \param gamepad a gamepad. - * \param axis an axis enum value (an SDL_GamepadAxis value). - * \returns true if the gamepad has this axis, false otherwise. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GamepadHasButton - * \sa SDL_GetGamepadAxis - */ -extern SDL_DECLSPEC bool SDLCALL SDL_GamepadHasAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis); - -/** - * Get the current state of an axis control on a gamepad. - * - * The axis indices start at index 0. - * - * For thumbsticks, the state is a value ranging from -32768 (up/left) to - * 32767 (down/right). - * - * Triggers range from 0 when released to 32767 when fully pressed, and never - * return a negative value. Note that this differs from the value reported by - * the lower-level SDL_GetJoystickAxis(), which normally uses the full range. - * - * Note that for invalid gamepads or axes, this will return 0. Zero is also a - * valid value in normal operation; usually it means a centered axis. - * - * \param gamepad a gamepad. - * \param axis an axis index (one of the SDL_GamepadAxis values). - * \returns axis state. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GamepadHasAxis - * \sa SDL_GetGamepadButton - */ -extern SDL_DECLSPEC Sint16 SDLCALL SDL_GetGamepadAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis); - -/** - * Convert a string into an SDL_GamepadButton enum. - * - * This function is called internally to translate SDL_Gamepad mapping strings - * for the underlying joystick device into the consistent SDL_Gamepad mapping. - * You do not normally need to call this function unless you are parsing - * SDL_Gamepad mappings in your own code. - * - * \param str string representing a SDL_Gamepad axis. - * \returns the SDL_GamepadButton enum corresponding to the input string, or - * `SDL_GAMEPAD_BUTTON_INVALID` if no match was found. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadStringForButton - */ -extern SDL_DECLSPEC SDL_GamepadButton SDLCALL SDL_GetGamepadButtonFromString(const char *str); - -/** - * Convert from an SDL_GamepadButton enum to a string. - * - * \param button an enum value for a given SDL_GamepadButton. - * \returns a string for the given button, or NULL if an invalid button is - * specified. The string returned is of the format used by - * SDL_Gamepad mapping strings. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadButtonFromString - */ -extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadStringForButton(SDL_GamepadButton button); - -/** - * Query whether a gamepad has a given button. - * - * This merely reports whether the gamepad's mapping defined this button, as - * that is all the information SDL has about the physical device. - * - * \param gamepad a gamepad. - * \param button a button enum value (an SDL_GamepadButton value). - * \returns true if the gamepad has this button, false otherwise. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GamepadHasAxis - */ -extern SDL_DECLSPEC bool SDLCALL SDL_GamepadHasButton(SDL_Gamepad *gamepad, SDL_GamepadButton button); - -/** - * Get the current state of a button on a gamepad. - * - * \param gamepad a gamepad. - * \param button a button index (one of the SDL_GamepadButton values). - * \returns true if the button is pressed, false otherwise. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GamepadHasButton - * \sa SDL_GetGamepadAxis - */ -extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadButton(SDL_Gamepad *gamepad, SDL_GamepadButton button); - -/** - * Get the label of a button on a gamepad. - * - * \param type the type of gamepad to check. - * \param button a button index (one of the SDL_GamepadButton values). - * \returns the SDL_GamepadButtonLabel enum corresponding to the button label. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadButtonLabel - */ -extern SDL_DECLSPEC SDL_GamepadButtonLabel SDLCALL SDL_GetGamepadButtonLabelForType(SDL_GamepadType type, SDL_GamepadButton button); - -/** - * Get the label of a button on a gamepad. - * - * \param gamepad a gamepad. - * \param button a button index (one of the SDL_GamepadButton values). - * \returns the SDL_GamepadButtonLabel enum corresponding to the button label. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadButtonLabelForType - */ -extern SDL_DECLSPEC SDL_GamepadButtonLabel SDLCALL SDL_GetGamepadButtonLabel(SDL_Gamepad *gamepad, SDL_GamepadButton button); - -/** - * Get the number of touchpads on a gamepad. - * - * \param gamepad a gamepad. - * \returns number of touchpads. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetNumGamepadTouchpadFingers - */ -extern SDL_DECLSPEC int SDLCALL SDL_GetNumGamepadTouchpads(SDL_Gamepad *gamepad); - -/** - * Get the number of supported simultaneous fingers on a touchpad on a game - * gamepad. - * - * \param gamepad a gamepad. - * \param touchpad a touchpad. - * \returns number of supported simultaneous fingers. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadTouchpadFinger - * \sa SDL_GetNumGamepadTouchpads - */ -extern SDL_DECLSPEC int SDLCALL SDL_GetNumGamepadTouchpadFingers(SDL_Gamepad *gamepad, int touchpad); - -/** - * Get the current state of a finger on a touchpad on a gamepad. - * - * \param gamepad a gamepad. - * \param touchpad a touchpad. - * \param finger a finger. - * \param down a pointer filled with true if the finger is down, false - * otherwise, may be NULL. - * \param x a pointer filled with the x position, normalized 0 to 1, with the - * origin in the upper left, may be NULL. - * \param y a pointer filled with the y position, normalized 0 to 1, with the - * origin in the upper left, may be NULL. - * \param pressure a pointer filled with pressure value, may be NULL. - * \returns true on success or false on failure; call SDL_GetError() for more - * information. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetNumGamepadTouchpadFingers - */ -extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadTouchpadFinger(SDL_Gamepad *gamepad, int touchpad, int finger, bool *down, float *x, float *y, float *pressure); - -/** - * Return whether a gamepad has a particular sensor. - * - * \param gamepad the gamepad to query. - * \param type the type of sensor to query. - * \returns true if the sensor exists, false otherwise. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadSensorData - * \sa SDL_GetGamepadSensorDataRate - * \sa SDL_SetGamepadSensorEnabled - */ -extern SDL_DECLSPEC bool SDLCALL SDL_GamepadHasSensor(SDL_Gamepad *gamepad, SDL_SensorType type); - -/** - * Set whether data reporting for a gamepad sensor is enabled. - * - * \param gamepad the gamepad to update. - * \param type the type of sensor to enable/disable. - * \param enabled whether data reporting should be enabled. - * \returns true on success or false on failure; call SDL_GetError() for more - * information. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GamepadHasSensor - * \sa SDL_GamepadSensorEnabled - */ -extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadSensorEnabled(SDL_Gamepad *gamepad, SDL_SensorType type, bool enabled); - -/** - * Query whether sensor data reporting is enabled for a gamepad. - * - * \param gamepad the gamepad to query. - * \param type the type of sensor to query. - * \returns true if the sensor is enabled, false otherwise. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_SetGamepadSensorEnabled - */ -extern SDL_DECLSPEC bool SDLCALL SDL_GamepadSensorEnabled(SDL_Gamepad *gamepad, SDL_SensorType type); - -/** - * Get the data rate (number of events per second) of a gamepad sensor. - * - * \param gamepad the gamepad to query. - * \param type the type of sensor to query. - * \returns the data rate, or 0.0f if the data rate is not available. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC float SDLCALL SDL_GetGamepadSensorDataRate(SDL_Gamepad *gamepad, SDL_SensorType type); - -/** - * Get the current state of a gamepad sensor. - * - * The number of values and interpretation of the data is sensor dependent. - * See SDL_sensor.h for the details for each type of sensor. - * - * \param gamepad the gamepad to query. - * \param type the type of sensor to query. - * \param data a pointer filled with the current sensor state. - * \param num_values the number of values to write to data. - * \returns true on success or false on failure; call SDL_GetError() for more - * information. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC bool SDLCALL SDL_GetGamepadSensorData(SDL_Gamepad *gamepad, SDL_SensorType type, float *data, int num_values); - -/** - * Start a rumble effect on a gamepad. - * - * Each call to this function cancels any previous rumble effect, and calling - * it with 0 intensity stops any rumbling. - * - * This function requires you to process SDL events or call - * SDL_UpdateJoysticks() to update rumble state. - * - * \param gamepad the gamepad to vibrate. - * \param low_frequency_rumble the intensity of the low frequency (left) - * rumble motor, from 0 to 0xFFFF. - * \param high_frequency_rumble the intensity of the high frequency (right) - * rumble motor, from 0 to 0xFFFF. - * \param duration_ms the duration of the rumble effect, in milliseconds. - * \returns true on success or false on failure; call SDL_GetError() for more - * information. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC bool SDLCALL SDL_RumbleGamepad(SDL_Gamepad *gamepad, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); - -/** - * Start a rumble effect in the gamepad's triggers. - * - * Each call to this function cancels any previous trigger rumble effect, and - * calling it with 0 intensity stops any rumbling. - * - * Note that this is rumbling of the _triggers_ and not the gamepad as a - * whole. This is currently only supported on Xbox One gamepads. If you want - * the (more common) whole-gamepad rumble, use SDL_RumbleGamepad() instead. - * - * This function requires you to process SDL events or call - * SDL_UpdateJoysticks() to update rumble state. - * - * \param gamepad the gamepad to vibrate. - * \param left_rumble the intensity of the left trigger rumble motor, from 0 - * to 0xFFFF. - * \param right_rumble the intensity of the right trigger rumble motor, from 0 - * to 0xFFFF. - * \param duration_ms the duration of the rumble effect, in milliseconds. - * \returns true on success or false on failure; call SDL_GetError() for more - * information. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_RumbleGamepad - */ -extern SDL_DECLSPEC bool SDLCALL SDL_RumbleGamepadTriggers(SDL_Gamepad *gamepad, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms); - -/** - * Update a gamepad's LED color. - * - * An example of a joystick LED is the light on the back of a PlayStation 4's - * DualShock 4 controller. - * - * For gamepads with a single color LED, the maximum of the RGB values will be - * used as the LED brightness. - * - * \param gamepad the gamepad to update. - * \param red the intensity of the red LED. - * \param green the intensity of the green LED. - * \param blue the intensity of the blue LED. - * \returns true on success or false on failure; call SDL_GetError() for more - * information. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC bool SDLCALL SDL_SetGamepadLED(SDL_Gamepad *gamepad, Uint8 red, Uint8 green, Uint8 blue); - -/** - * Send a gamepad specific effect packet. - * - * \param gamepad the gamepad to affect. - * \param data the data to send to the gamepad. - * \param size the size of the data to send to the gamepad. - * \returns true on success or false on failure; call SDL_GetError() for more - * information. - * - * \since This function is available since SDL 3.2.0. - */ -extern SDL_DECLSPEC bool SDLCALL SDL_SendGamepadEffect(SDL_Gamepad *gamepad, const void *data, int size); - -/** - * Close a gamepad previously opened with SDL_OpenGamepad(). - * - * \param gamepad a gamepad identifier previously returned by - * SDL_OpenGamepad(). - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_OpenGamepad - */ -extern SDL_DECLSPEC void SDLCALL SDL_CloseGamepad(SDL_Gamepad *gamepad); - -/** - * Return the sfSymbolsName for a given button on a gamepad on Apple - * platforms. - * - * \param gamepad the gamepad to query. - * \param button a button on the gamepad. - * \returns the sfSymbolsName or NULL if the name can't be found. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadAppleSFSymbolsNameForAxis - */ -extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadAppleSFSymbolsNameForButton(SDL_Gamepad *gamepad, SDL_GamepadButton button); - -/** - * Return the sfSymbolsName for a given axis on a gamepad on Apple platforms. - * - * \param gamepad the gamepad to query. - * \param axis an axis on the gamepad. - * \returns the sfSymbolsName or NULL if the name can't be found. - * - * \since This function is available since SDL 3.2.0. - * - * \sa SDL_GetGamepadAppleSFSymbolsNameForButton - */ -extern SDL_DECLSPEC const char * SDLCALL SDL_GetGamepadAppleSFSymbolsNameForAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis); - - -/* Ends C function definitions when using C++ */ -#ifdef __cplusplus -} -#endif -#include - -#endif /* SDL_gamepad_h_ */ diff --git a/ios_deploy/funnygame/funnygame.xcodeproj/project.pbxproj b/ios_deploy/funnygame/funnygame.xcodeproj/project.pbxproj deleted file mode 100644 index b51055a..0000000 --- a/ios_deploy/funnygame/funnygame.xcodeproj/project.pbxproj +++ /dev/null @@ -1,380 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 77; - objects = { - -/* Begin PBXBuildFile section */ - 24417C492E15D4C9002CF759 /* default.cfg in Resources */ = {isa = PBXBuildFile; fileRef = 24417C482E15D4C9002CF759 /* default.cfg */; }; - 2444C86E2E13363000CC1EFA /* metal.pak in Resources */ = {isa = PBXBuildFile; fileRef = 2444C86D2E13363000CC1EFA /* metal.pak */; }; - 249345AB2E109B8A00369580 /* funnygame in Resources */ = {isa = PBXBuildFile; fileRef = 249345A92E109B8A00369580 /* funnygame */; }; - 249345AC2E109B8A00369580 /* rtt.pak in Resources */ = {isa = PBXBuildFile; fileRef = 249345AA2E109B8A00369580 /* rtt.pak */; }; - 2493BB3F2E19384900828D56 /* SDL3.framework in Resources */ = {isa = PBXBuildFile; fileRef = 2493BB3E2E19384900828D56 /* SDL3.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 24417C482E15D4C9002CF759 /* default.cfg */ = {isa = PBXFileReference; lastKnownFileType = text; name = default.cfg; path = "../../build/funnygame/aarch64-apple-ios/game/bin/default.cfg"; sourceTree = ""; }; - 2444C86D2E13363000CC1EFA /* metal.pak */ = {isa = PBXFileReference; lastKnownFileType = file; name = metal.pak; path = "../../build/funnygame/aarch64-apple-ios/game/bin/metal.pak"; sourceTree = ""; }; - 249345A72E10997500369580 /* funnygame */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = funnygame; path = "../../build/funnygame/aarch64-apple-ios/game/bin/funnygame"; sourceTree = ""; }; - 249345A92E109B8A00369580 /* funnygame */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = funnygame; path = "../../build/funnygame/aarch64-apple-ios/game/bin/funnygame"; sourceTree = ""; }; - 249345AA2E109B8A00369580 /* rtt.pak */ = {isa = PBXFileReference; lastKnownFileType = file; name = rtt.pak; path = "../../build/funnygame/aarch64-apple-ios/game/bin/rtt.pak"; sourceTree = ""; }; - 2493BB3E2E19384900828D56 /* SDL3.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDL3.framework; path = "../../build/funnygame/aarch64-apple-ios/game/bin/SDL3.framework"; sourceTree = ""; }; - 24CCF9852E1065A100A06964 /* funnygame.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = funnygame.app; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ - 2493459C2E108A3500369580 /* Exceptions for "funnygame" folder in "funnygame" target */ = { - isa = PBXFileSystemSynchronizedBuildFileExceptionSet; - membershipExceptions = ( - Info.plist, - ); - target = 24CCF9842E1065A100A06964 /* funnygame */; - }; -/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ - -/* Begin PBXFileSystemSynchronizedRootGroup section */ - 24CCF9872E1065A100A06964 /* funnygame */ = { - isa = PBXFileSystemSynchronizedRootGroup; - exceptions = ( - 2493459C2E108A3500369580 /* Exceptions for "funnygame" folder in "funnygame" target */, - ); - path = funnygame; - sourceTree = ""; - }; -/* End PBXFileSystemSynchronizedRootGroup section */ - -/* Begin PBXGroup section */ - 24CCF97C2E1065A100A06964 = { - isa = PBXGroup; - children = ( - 2493BB3E2E19384900828D56 /* SDL3.framework */, - 24417C482E15D4C9002CF759 /* default.cfg */, - 2444C86D2E13363000CC1EFA /* metal.pak */, - 249345A72E10997500369580 /* funnygame */, - 249345A92E109B8A00369580 /* funnygame */, - 249345AA2E109B8A00369580 /* rtt.pak */, - 24CCF9872E1065A100A06964 /* funnygame */, - 24CCF9862E1065A100A06964 /* Products */, - ); - sourceTree = ""; - }; - 24CCF9862E1065A100A06964 /* Products */ = { - isa = PBXGroup; - children = ( - 24CCF9852E1065A100A06964 /* funnygame.app */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 24CCF9842E1065A100A06964 /* funnygame */ = { - isa = PBXNativeTarget; - buildConfigurationList = 24CCF99D2E1065A300A06964 /* Build configuration list for PBXNativeTarget "funnygame" */; - buildPhases = ( - 24CCF9A22E1065F500A06964 /* Run Script */, - 249345342E10872F00369580 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - fileSystemSynchronizedGroups = ( - 24CCF9872E1065A100A06964 /* funnygame */, - ); - name = funnygame; - packageProductDependencies = ( - ); - productName = funnygame; - productReference = 24CCF9852E1065A100A06964 /* funnygame.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 24CCF97D2E1065A100A06964 /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = 1; - LastUpgradeCheck = 1640; - TargetAttributes = { - 24CCF9842E1065A100A06964 = { - CreatedOnToolsVersion = 16.2; - }; - }; - }; - buildConfigurationList = 24CCF9802E1065A100A06964 /* Build configuration list for PBXProject "funnygame" */; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 24CCF97C2E1065A100A06964; - minimizedProjectReferenceProxies = 1; - preferredProjectObjectVersion = 77; - productRefGroup = 24CCF9862E1065A100A06964 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 24CCF9842E1065A100A06964 /* funnygame */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 249345342E10872F00369580 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2493BB3F2E19384900828D56 /* SDL3.framework in Resources */, - 24417C492E15D4C9002CF759 /* default.cfg in Resources */, - 2444C86E2E13363000CC1EFA /* metal.pak in Resources */, - 249345AB2E109B8A00369580 /* funnygame in Resources */, - 249345AC2E109B8A00369580 /* rtt.pak in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 24CCF9A22E1065F500A06964 /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export CODE_SIGN_IDENTITY=$(security find-identity -v -p codesigning | grep \"Apple Development\" | grep -o '\".*\"' | tr -d '\"')\ncd ../../\nbuild/tools/fpc build -os ios -arch aarch64\ncodesign -s \"$CODE_SIGN_IDENTITY\" --timestamp=none --force build/funnygame/aarch64-apple-ios/game/bin/funnygame\ncodesign -s \"$CODE_SIGN_IDENTITY\" --timestamp=none --force build/funnygame/aarch64-apple-ios/game/bin/SDL3.framework\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 24CCF99E2E1065A300A06964 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = funnygame/funnygame.entitlements; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = QU3M3RV4XD; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = funnygame/Info.plist; - INFOPLIST_KEY_GCSupportsControllerUserInteraction = YES; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIRequiresFullScreen = YES; - INFOPLIST_KEY_UIStatusBarStyle = ""; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 18.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = kotofyt.funnygame; - PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 24CCF99F2E1065A300A06964 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_ENTITLEMENTS = funnygame/funnygame.entitlements; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = QU3M3RV4XD; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = funnygame/Info.plist; - INFOPLIST_KEY_GCSupportsControllerUserInteraction = YES; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIRequiresFullScreen = YES; - INFOPLIST_KEY_UIStatusBarStyle = ""; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 18.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = kotofyt.funnygame; - PRODUCT_NAME = "$(TARGET_NAME)"; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 24CCF9A02E1065A300A06964 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = QU3M3RV4XD; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 18.2; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 24CCF9A12E1065A300A06964 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = QU3M3RV4XD; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 18.2; - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 24CCF9802E1065A100A06964 /* Build configuration list for PBXProject "funnygame" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 24CCF9A02E1065A300A06964 /* Debug */, - 24CCF9A12E1065A300A06964 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 24CCF99D2E1065A300A06964 /* Build configuration list for PBXNativeTarget "funnygame" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 24CCF99E2E1065A300A06964 /* Debug */, - 24CCF99F2E1065A300A06964 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 24CCF97D2E1065A100A06964 /* Project object */; -} diff --git a/ios_deploy/funnygame/funnygame.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios_deploy/funnygame/funnygame.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/ios_deploy/funnygame/funnygame.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ios_deploy/funnygame/funnygame.xcodeproj/project.xcworkspace/xcuserdata/kotofyt.xcuserdatad/UserInterfaceState.xcuserstate b/ios_deploy/funnygame/funnygame.xcodeproj/project.xcworkspace/xcuserdata/kotofyt.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index de7aee8158592d5e4b91ec181d008b62d0f7314c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216526 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 IKVIVh00#N>=>Px# diff --git a/ios_deploy/funnygame/funnygame.xcodeproj/xcshareddata/xcschemes/funnygame.xcscheme b/ios_deploy/funnygame/funnygame.xcodeproj/xcshareddata/xcschemes/funnygame.xcscheme deleted file mode 100644 index 040203a..0000000 --- a/ios_deploy/funnygame/funnygame.xcodeproj/xcshareddata/xcschemes/funnygame.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios_deploy/funnygame/funnygame.xcodeproj/xcuserdata/kotofyt.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ios_deploy/funnygame/funnygame.xcodeproj/xcuserdata/kotofyt.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index 011b72b..0000000 --- a/ios_deploy/funnygame/funnygame.xcodeproj/xcuserdata/kotofyt.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - diff --git a/ios_deploy/funnygame/funnygame.xcodeproj/xcuserdata/kotofyt.xcuserdatad/xcschemes/xcschememanagement.plist b/ios_deploy/funnygame/funnygame.xcodeproj/xcuserdata/kotofyt.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 16cbd2d..0000000 --- a/ios_deploy/funnygame/funnygame.xcodeproj/xcuserdata/kotofyt.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - funnygame.xcscheme_^#shared#^_ - - orderHint - 0 - - - SuppressBuildableAutocreation - - 24CCF9842E1065A100A06964 - - primary - - - - - diff --git a/ios_deploy/funnygame/funnygame/Assets.xcassets/AccentColor.colorset/Contents.json b/ios_deploy/funnygame/funnygame/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index eb87897..0000000 --- a/ios_deploy/funnygame/funnygame/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/ios_deploy/funnygame/funnygame/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios_deploy/funnygame/funnygame/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 2305880..0000000 --- a/ios_deploy/funnygame/funnygame/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "tinted" - } - ], - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/ios_deploy/funnygame/funnygame/Assets.xcassets/Contents.json b/ios_deploy/funnygame/funnygame/Assets.xcassets/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/ios_deploy/funnygame/funnygame/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/ios_deploy/funnygame/funnygame/Info.plist b/ios_deploy/funnygame/funnygame/Info.plist deleted file mode 100644 index b866798..0000000 --- a/ios_deploy/funnygame/funnygame/Info.plist +++ /dev/null @@ -1,18 +0,0 @@ - - - - - CFBundleDocumentTypes - - - LSHandlerRank - Default - - - NSAppTransportSecurity - - NSExceptionDomains - - - - diff --git a/ios_deploy/funnygame/funnygame/funnygame.entitlements b/ios_deploy/funnygame/funnygame/funnygame.entitlements deleted file mode 100644 index c74150d..0000000 --- a/ios_deploy/funnygame/funnygame/funnygame.entitlements +++ /dev/null @@ -1,8 +0,0 @@ - - - - - com.apple.developer.game-center - - - diff --git a/launcher/__build.cpp b/launcher/__build.cpp deleted file mode 100644 index 31d8f16..0000000 --- a/launcher/__build.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "helper.h" -#include "c.h" -#include "ld.h" -#include "tier1/utlstring.h" - -CUtlVector launcher_CompiledFiles = { - "launcher/launcher.cpp", -}; - -DECLARE_BUILD_STAGE(launcher) -{ - filesystem2->MakeDirectory(CUtlString("%s/bin",szOutputDir.GetString())); - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - - compileProject.m_szName = "launcher"; - compileProject.files = launcher_CompiledFiles; - compileProject.includeDirectories = all_IncludeDirectories; - compileProject.bFPIC = true; - if (bStaticBuild) - { - compileProject.macros.AppendTail((C_Macro_t){"STATIC_BUILD","1"}); - } - ldProject = ccompiler->Compile(&compileProject); - ldProject.linkType = ELINK_EXECUTABLE; - CUtlString szBinaryOutput = CUtlString("%s/bin/funnygame", szOutputDir.GetString()); - - if (bStaticBuild) - { - ldProject.objects.AppendTail((Object_t){tier0_lib}); - ldProject.objects.AppendTail((Object_t){tier1_lib}); - ldProject.objects.AppendTail((Object_t){rapier_lib}); - ldProject.objects.AppendTail((Object_t){engine_lib}); - ldProject.objects.AppendTail((Object_t){server_lib}); - ldProject.objects.AppendTail((Object_t){client_lib}); - if (Target_t::DefaultTarget().kernel == TARGET_KERNEL_IOS) - { - ldProject.frameworks.AppendTail("SDL3"); - ldProject.frameworks.AppendTail("CoreFoundation"); - ldProject.frameworks.AppendTail("CoreGraphics"); - ldProject.frameworks.AppendTail("IOSurface"); - ldProject.frameworks.AppendTail("Metal"); - ldProject.frameworks.AppendTail("Foundation"); - ldProject.frameworks.AppendTail("QuartzCore"); - ldProject.frameworks.AppendTail("UIKit"); - ldProject.frameworkDirectories.AppendTail("external/ios"); - filesystem2->CopyDirectory(CUtlString("%s/bin", szOutputDir.GetString()), "external/ios/SDL3.framework"); - }; - if (Target_t::DefaultTarget().kernel == TARGET_KERNEL_WINDOWS) - { - ldProject.objects.AppendTail((Object_t){"external/windows/vulkan-1.dll"}); - ldProject.objects.AppendTail((Object_t){"external/windows/libSDL3.a"}); - ldProject.objects.AppendTail((Object_t){"external/windows/libpthread.a"}); - ldProject.objects.AppendTail((Object_t){"external/windows/libstdc++.a"}); - if (bSteam) - ldProject.objects.AppendTail((Object_t){"external/steamworks/redistributable_bin/win64/steam_api64.dll"}); - ldProject.libraries.AppendTail("ws2_32"); - ldProject.libraries.AppendTail("ntdll"); - ldProject.libraries.AppendTail("userenv"); - ldProject.libraries.AppendTail("winmm"); - ldProject.libraries.AppendTail("ole32"); - ldProject.libraries.AppendTail("setupapi"); - ldProject.libraries.AppendTail("gdi32"); - ldProject.libraries.AppendTail("cfgmgr32"); - ldProject.libraries.AppendTail("uuid"); - ldProject.libraries.AppendTail("imm32"); - ldProject.libraries.AppendTail("version"); - ldProject.libraries.AppendTail("oleaut32"); - filesystem2->CopyFile(CUtlString("%s/bin", szOutputDir.GetString()), "external/windows/libgcc_s_seh-1.dll"); - filesystem2->CopyFile(CUtlString("%s/bin", szOutputDir.GetString()), "external/windows/libwinpthread-1.dll"); - szBinaryOutput = CUtlString("%s/bin/funnygame.exe", szOutputDir.GetString()); - } - }; - - CUtlString outputProject = linker->Link(&ldProject); - filesystem2->CopyFile(szBinaryOutput, outputProject); - - return 0; -}; diff --git a/launcher/build.cpp b/launcher/build.cpp new file mode 100644 index 0000000..46fdef9 --- /dev/null +++ b/launcher/build.cpp @@ -0,0 +1,20 @@ +#include "target.h" +#include "helper.h" +#include "c.h" +#include "ld.h" +#include "tier1/utlstring.h" + +DECLARE_BUILD_STAGE(launcher) +{ + CProject_t compileProject = {}; + LinkProject_t ldProject = {}; + + compileProject.m_szName = "launcher"; + compileProject.files = {"launcher.cpp"}; + ldProject = ccompiler->Compile(&compileProject); + ldProject.linkType = ELINK_EXECUTABLE; + + CUtlString outputProject = linker->Link(&ldProject); + ADD_OUTPUT_OBJECT("launcher", outputProject); + return 0; +}; diff --git a/launcher/launcher.cpp b/launcher/launcher.cpp index 1af1425..ca80b08 100644 --- a/launcher/launcher.cpp +++ b/launcher/launcher.cpp @@ -1,6 +1,5 @@ #include "string.h" #include "stdio.h" -#include "tier0/platform.h" #include "unistd.h" #include "libgen.h" @@ -9,9 +8,7 @@ #endif #ifdef __WIN32__ #include "windows.h" -#endif - -#ifdef __linux__ +#else #include "dlfcn.h" #endif @@ -41,10 +38,9 @@ void *pTier0Lib = NULL; typedef void (*EngineMainFn)(int argc, char** argv); EngineMainFn pEngineMain; -extern "C" void FunnyMain( int argc, char **argv ); +//extern "C" void FunnyMain( int argc, char **argv ); int main( int argc, char **argv ) { -#ifndef STATIC_BUILD #ifdef __linux__ readlink("/proc/self/exe",szLauncherPath, MAX_PATH); dirname(szLauncherPath); @@ -62,6 +58,7 @@ int main( int argc, char **argv ) { snprintf(szEnginePath, MAX_PATH, "%s/libengine.dylib", szLauncherPath2); snprintf(szTier0Path, MAX_PATH, "%s/libtier0.dylib", szLauncherPath2); #endif +#ifndef __WIN32__ if ( !dlopen(szSteamPath, RTLD_NOW )) printf("Failed to open steam\n"); pTier0Lib = dlopen(szTier0Path, RTLD_LAZY | RTLD_GLOBAL); @@ -69,7 +66,7 @@ int main( int argc, char **argv ) { printf("Failed to open libtier0\n"); printf("\t%s\n",dlerror()); } - pEngineLib = dlopen(szEnginePath, RTLD_LAZY | RTLD_GLOBAL); + pEngineLib = dlopen(szEnginePath, RTLD_NOW ); if ( !pEngineLib ) { printf("Failed to open libengine\n"); printf("\t%s\n",dlerror()); @@ -86,12 +83,22 @@ int main( int argc, char **argv ) { pEngineMain(argc, argv); dlclose(pEngineLib); -#else +#endif #ifdef __WIN32__ GetModuleFileNameA(NULL, szLauncherPath, MAX_PATH); dirname(szLauncherPath); + + snprintf(szEnginePath, MAX_PATH, "%s/engine.dll", szLauncherPath); + snprintf(szTier0Path, MAX_PATH, "%s/tier0.dll", szLauncherPath); + printf("%s\n", szEnginePath); + pEngineLib = LoadLibraryA(szEnginePath); + pEngineMain = (EngineMainFn)GetProcAddress((HMODULE)pEngineLib, "FunnyMain"); + if ( !pEngineMain ) { + printf("Symbol not found: FunnyMain\n"); + } + dirname(szLauncherPath); SetCurrentDirectoryA(szLauncherPath); + pEngineMain(argc, argv); #endif - FunnyMain(argc, argv); -#endif + //FunnyMain(argc, argv); }; diff --git a/materialsystem/__build.cpp b/materialsystem/__build.cpp deleted file mode 100644 index 04acb4b..0000000 --- a/materialsystem/__build.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include "helper.h" -#include "c.h" -#include "ld.h" -#include "tier1/utlstring.h" -#include "tier1/commandline.h" - -CUtlVector MaterialSystem_CompiledFiles = { - "materialsystem/materialsystem.cpp", - "materialsystem/compiledshader.cpp", -}; -CUtlVector RenderContextVulkan_CompiledFiles = { - "materialsystem/vulkan/shaderparser.cpp", - "materialsystem/vulkan/rendercontext.cpp", - "materialsystem/vulkan/commandbuffer.cpp", - "materialsystem/vulkan/rendercommandlist.cpp", - "materialsystem/vulkan/material.cpp", - "materialsystem/vulkan/shader.cpp", - "materialsystem/vulkan/utils.cpp", - "materialsystem/vulkan/vma.cpp", - "materialsystem/vulkan/commands/draw.cpp", - "materialsystem/vulkan/commands/transfer.cpp", - "materialsystem/vulkan/commands/base.cpp", - "materialsystem/vulkan/libraries/raster.cpp", - "external/volk/volk.c", -}; -CUtlString material_lib; - -DECLARE_BUILD_STAGE(MaterialSystem) -{ - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - - compileProject.m_szName = "MaterialSystem"; - compileProject.files = MaterialSystem_CompiledFiles; - compileProject.includeDirectories = all_IncludeDirectories; - compileProject.bFPIC = true; - ldProject = ccompiler->Compile(&compileProject); - ldProject.linkType = ELINK_STATIC_LIBRARY; - ldProject.libraries = { "vulkan" }; - - CUtlString outputProject = linker->Link(&ldProject); - material_lib = outputProject; - - return 0; -} diff --git a/materialsystem/build.cpp b/materialsystem/build.cpp index b54150a..7571ac1 100644 --- a/materialsystem/build.cpp +++ b/materialsystem/build.cpp @@ -2,13 +2,18 @@ #include "c.h" #include "ld.h" #include "tier1/utlstring.h" -#include "tier1/commandline.h" + +#define FUNNYSTDLIB "../external/funnystdlib/" +ADD_DEPENDENCY_BUILD_FILE(tier0, FUNNYSTDLIB"tier0/build.cpp"); +ADD_DEPENDENCY_BUILD_FILE(tier1, FUNNYSTDLIB"tier1/build.cpp"); +ADD_DEPENDENCY_BUILD_FILE(tier2, FUNNYSTDLIB"tier2/build.cpp"); CUtlVector MaterialSystem_CompiledFiles = { "materialsystem.cpp", "compiledshader.cpp", }; CUtlVector RenderContextVulkan_CompiledFiles = { + "compiledshader.cpp", "vulkan/shaderparser.cpp", "vulkan/rendercontext.cpp", "vulkan/commandbuffer.cpp", @@ -23,7 +28,6 @@ CUtlVector RenderContextVulkan_CompiledFiles = { "vulkan/libraries/raster.cpp", "../external/volk/volk.c", }; -CUtlString material_lib; DECLARE_BUILD_STAGE(MaterialSystem) { @@ -32,19 +36,33 @@ DECLARE_BUILD_STAGE(MaterialSystem) compileProject.m_szName = "MaterialSystem"; compileProject.files = MaterialSystem_CompiledFiles; - compileProject.includeDirectories = { "../public" }; + compileProject.includeDirectories = { + "../public", + FUNNYSTDLIB"public", + }; compileProject.bFPIC = true; ldProject = ccompiler->Compile(&compileProject); ldProject.linkType = ELINK_DYNAMIC_LIBRARY; + ldProject.libraryObjects = { + GET_PROJECT_LIBRARY(tier0, "tier0"), + }; + ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier1, "tier1")}); + + if (ldProject.m_target.kernel & TARGET_KERNEL_WINDOWS_DEVICES) + { + ldProject.libraries.AppendTail("pthread"); + }; CUtlString outputProject = linker->Link(&ldProject); - material_lib = outputProject; + ADD_OUTPUT_OBJECT("MaterialSystem", outputProject); return 0; } DECLARE_BUILD_STAGE(RenderSystemVulkan) { + if (Target_t::DefaultTarget().cpu == TARGET_CPU_WASM32) + return 0; CProject_t compileProject = {}; LinkProject_t ldProject = {}; @@ -52,6 +70,7 @@ DECLARE_BUILD_STAGE(RenderSystemVulkan) compileProject.files = RenderContextVulkan_CompiledFiles; compileProject.includeDirectories = { "../public", + FUNNYSTDLIB"public", "../external/Vulkan-Headers/include", "../external/Vulkan-Utility-Libraries/include", "../external/VulkanMemoryAllocator/include", @@ -60,10 +79,17 @@ DECLARE_BUILD_STAGE(RenderSystemVulkan) compileProject.bFPIC = true; ldProject = ccompiler->Compile(&compileProject); ldProject.linkType = ELINK_DYNAMIC_LIBRARY; - ldProject.libraries = { "vulkan" }; + ldProject.libraryObjects = { + GET_PROJECT_LIBRARY(tier0, "tier0"), + }; + ldProject.objects.AppendTail({GET_PROJECT_LIBRARY(tier1, "tier1")}); + if (ldProject.m_target.kernel & TARGET_KERNEL_WINDOWS_DEVICES) + { + ldProject.libraries.AppendTail("pthread"); + }; CUtlString outputProject = linker->Link(&ldProject); - material_lib = outputProject; + ADD_OUTPUT_OBJECT("RenderSystemVulkan", outputProject); return 0; } diff --git a/materialsystem/compiledshader.cpp b/materialsystem/compiledshader.cpp index 8765ba9..2736ce4 100644 --- a/materialsystem/compiledshader.cpp +++ b/materialsystem/compiledshader.cpp @@ -55,6 +55,7 @@ public: virtual void ReadFromFile( CCompiledShader *pShader, const char *szFile ) override; }; +IFileSystem *filesystem = NULL; void CCompiledShaderManager::WriteToFile( CCompiledShader *pShader, const char *szFile ) { IFileHandle *pFile; @@ -68,8 +69,14 @@ void CCompiledShaderManager::WriteToFile( CCompiledShader *pShader, const char * stHeader.m_nNumLumps = pShader->m_lumps.GetSize(); stHeader.m_nNumShaders = pShader->m_objects.GetSize(); + if ( filesystem == NULL ) + { + CreateInterfaceFn pFilesystemFactory = Sys_GetFactory("filesystem_std"); + filesystem = (IFileSystem*)pFilesystemFactory(FILESYSTEM_INTERFACE_VERSION, NULL); + + } pFile = filesystem->Open(szFile, FILEMODE_WRITE); - pFile->Write(&stHeader, sizeof(ShaderHeader_t)); + filesystem->Write(pFile, &stHeader, sizeof(ShaderHeader_t)); // We want to get offset for the lump data nTotalSize += sizeof(ShaderLump_t) * pShader->m_lumps.GetSize(); @@ -82,7 +89,7 @@ void CCompiledShaderManager::WriteToFile( CCompiledShader *pShader, const char * ShaderLump_t stLump = {}; stLump.m_nOffset = nTotalSize; stLump.m_nSize = l.m_nSize; - pFile->Write(&stLump, sizeof(ShaderLump_t)); + filesystem->Write(pFile, &stLump, sizeof(ShaderLump_t)); nTotalSize += l.m_nSize; } @@ -97,11 +104,11 @@ void CCompiledShaderManager::WriteToFile( CCompiledShader *pShader, const char * // Lump Data for ( auto l: pShader->m_lumps ) { - pFile->Write(l.m_pAddress, l.m_nSize); + filesystem->Write(pFile, l.m_pAddress, l.m_nSize); } - pFile->Close(); + filesystem->Close(pFile); } void CCompiledShaderManager::ReadFromFile( CCompiledShader *pShader, const char *szFile ) @@ -114,27 +121,27 @@ void CCompiledShaderManager::ReadFromFile( CCompiledShader *pShader, const char CUtlVector lumpsData = {}; pFile = filesystem->Open(szFile, FILEMODE_READ); - pFile->Read(&stHeader, sizeof(ShaderHeader_t)); + filesystem->Read(pFile, &stHeader, sizeof(ShaderHeader_t)); objects.Resize(stHeader.m_nNumShaders); lumps.Resize(stHeader.m_nNumLumps); lumpsData.Resize(stHeader.m_nNumLumps); - pFile->Read(lumps.GetData(), stHeader.m_nNumLumps * sizeof(ShaderLump_t)); - pFile->Read(objects.GetData(), stHeader.m_nNumShaders * sizeof(ShaderObject_t)); + filesystem->Read(pFile, lumps.GetData(), stHeader.m_nNumLumps * sizeof(ShaderLump_t)); + filesystem->Read(pFile, objects.GetData(), stHeader.m_nNumShaders * sizeof(ShaderObject_t)); for ( i = 0; i < stHeader.m_nNumLumps; i++ ) { lumpsData[i].m_pAddress = V_malloc(lumps[i].m_nSize); - pFile->Seek(SEEKMODE_RELATIVE_START, lumps[i].m_nOffset); - pFile->Read(lumpsData[i].m_pAddress, lumps[i].m_nSize); + filesystem->Seek(pFile, SEEKMODE_RELATIVE_START, lumps[i].m_nOffset); + filesystem->Read(pFile, lumpsData[i].m_pAddress, lumps[i].m_nSize); lumpsData[i].m_nSize = lumps[i].m_nSize; }; pShader->m_objects = objects; pShader->m_lumps = lumpsData; - pFile->Close(); + filesystem->Close(pFile); } diff --git a/materialsystem/materialsystem.cpp b/materialsystem/materialsystem.cpp index 6f700de..461d99a 100644 --- a/materialsystem/materialsystem.cpp +++ b/materialsystem/materialsystem.cpp @@ -11,30 +11,20 @@ public: virtual void RenderGameWindow( IGameWindow *pWindow ) override; }; -EXPOSE_INTERFACE(CMaterialSystem, IMaterialSystem, MATERIAL_SYSTEM_INTERFACE_NAME) - -extern IRenderContext *g_pVkRenderContext; -IRenderContext *g_pRenderContext; +EXPOSE_INTERFACE(CMaterialSystem, IMaterialSystem, MATERIAL_SYSTEM_INTERFACE_VERSION) void CMaterialSystem::Init() { - g_pRenderContext = (IRenderContext*)CreateInterface(RENDER_CONTEXT_INTERFACE_NAME, NULL); - g_pRenderContext->Init(); } void CMaterialSystem::Frame( float fTime ) { - g_pRenderContext->Frame(fTime); } void CMaterialSystem::RenderGameWindow( IGameWindow *pWindow ) { - g_pRenderContext->RenderGameWindow( pWindow ); } void CMaterialSystem::Shutdown() { - g_pRenderContext->Shutdown(); } - -IMaterialSystem *g_pMaterialSystem; diff --git a/materialsystem/vulkan/rendercontext.cpp b/materialsystem/vulkan/rendercontext.cpp index 30508ec..11e6d9a 100644 --- a/materialsystem/vulkan/rendercontext.cpp +++ b/materialsystem/vulkan/rendercontext.cpp @@ -1,4 +1,3 @@ -#include "SDL3/SDL_vulkan.h" #include "commands.h" #include "materialsystem/imaterialsystem.h" #include "tier0/lib.h" @@ -250,14 +249,7 @@ public: virtual void Init() override; virtual void Frame( float fDeltaTime ) override; virtual void Shutdown() override; - - virtual void SetOutputImage( IImage *pImage ) override; - virtual bool BIsOutputImageOutdated() override; - virtual uint32_t GetNewOutputImageWidth() override; - virtual uint32_t GetNewOutputImageHeight() override; - virtual EImageFormat GetNewOutputImageFormat() override; - virtual IVertexBuffer *CreateVertexBuffer( uint32_t nSize ) override; virtual IIndexBuffer *CreateIndexBuffer( uint32_t nSize ) override; virtual IBuffer *CreateConstantBuffer( uint32_t nSize ) override; @@ -280,45 +272,24 @@ public: virtual IRenderCommandList *CreateCommandList() override; virtual void DestroyCommandList( IRenderCommandList *pCommandList ) override; virtual void SubmitCommandList(IRenderCommandList *pList) override; + + virtual void SetMainWindowManager( IGameWindowManager *pWindowManager ) override; + + virtual void RenderGameWindow( IGameWindow *pWindow ) override; + virtual void RegisterGameWindow( IGameWindow *pWindow ) override; + virtual void UnregisterGameWindow( IGameWindow *pWindow ) override; private: VkPhysicalDevice SelectPhysicalDevice( CUtlVector physicalDevices ); CUtlVector GetDeviceExtensions(); VkCommandBuffer GetCommandBuffer(); - void CreateSwapchain(); - void DestroySwapchain(); + void CreateSwapchain( IGameWindow *pWindow ); + void DestroySwapchain( IGameWindow *pWindow ); - IImage *m_pOutputImage = NULL; - bool m_bOutputImageOutdated = true; + IGameWindowManager *m_pWindowManager; }; -EXPOSE_INTERFACE(CVkRenderContext, IRenderContext, RENDER_CONTEXT_VULKAN_INTERFACE_NAME); - -void CVkRenderContext::SetOutputImage( IImage *pImage ) -{ - m_pOutputImage = pImage; -} - - -bool CVkRenderContext::BIsOutputImageOutdated( ) -{ - return m_bOutputImageOutdated; -} - -uint32_t CVkRenderContext::GetNewOutputImageWidth() -{ - return 1280; -} - -uint32_t CVkRenderContext::GetNewOutputImageHeight() -{ - return 720; -} - -EImageFormat CVkRenderContext::GetNewOutputImageFormat() -{ - -} +EXPOSE_INTERFACE(CVkRenderContext, IRenderContext, RENDER_CONTEXT_INTERFACE_VERSION); //----------------------------------------------------------------------------- @@ -424,7 +395,6 @@ IShader *CVkRenderContext::CreateShader( const char *szName ) pShader->AddShaderLibrary(&vertexTransform); pShader->AddShaderLibrary(&pixelShader); pShader->AddShaderLibrary(&pixelOutput); - printf("--- general pipeline ---\n"); pShader->Build(); return pShader; } @@ -459,6 +429,26 @@ void CVkRenderContext::SubmitCommandList(IRenderCommandList *pList) CVkRenderCommandList *pVkList = (CVkRenderCommandList*)pList; pVkList->Submit(); } +void CVkRenderContext::RenderGameWindow( IGameWindow *pWindow ) +{ + +} + +void CVkRenderContext::SetMainWindowManager( IGameWindowManager *pWindowManager ) +{ + m_pWindowManager = pWindowManager; +} + +void CVkRenderContext::RegisterGameWindow( IGameWindow *pWindow ) +{ + +} + +void CVkRenderContext::UnregisterGameWindow( IGameWindow *pWindow ) +{ + +} + VkPipelineLayout g_pLibraryEmptyLayout; static IVkCommandBuffer *s_pPresentCommandBuffer; @@ -488,10 +478,17 @@ void CVkRenderContext::Init() r = volkInitialize(); VULKAN_RESULT_PRINT(r, volkInitialize); - // Get extensions required by game window - nExtensionCount = gamewindow->GetVulkanInstanceExtensionCount(); - enabledInstanceExtensions.Resize(nExtensionCount); - V_memcpy(enabledInstanceExtensions.GetData(), gamewindow->GetVulkanInstanceExtensions(), enabledInstanceExtensions.GetSize()*sizeof(const char*)); + if (m_pWindowManager) + { + nExtensionCount = m_pWindowManager->GetVulkanInstanceExtensionCount(); + enabledInstanceExtensions.Resize(nExtensionCount); + V_memcpy( + enabledInstanceExtensions.GetData(), + m_pWindowManager->GetVulkanInstanceExtensions(), + nExtensionCount*sizeof(const char*) + ); + + } // Create instance stApplicationInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; @@ -596,8 +593,6 @@ void CVkRenderContext::Init() stPipelineLayout.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; stPipelineLayout.flags = VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT; vkCreatePipelineLayout(g_vkDevice, &stPipelineLayout, NULL, &g_pLibraryEmptyLayout); - - CreateSwapchain(); g_vkCommandPools.Resize(g_vkSwapchainImages.GetSize()); @@ -619,6 +614,7 @@ void CVkRenderContext::Init() void CVkRenderContext::Frame( float fDeltaTime ) { + /* CVkBlitCommand *pBlitCommand = NULL; if (m_pOutputImage) { @@ -643,7 +639,6 @@ void CVkRenderContext::Frame( float fDeltaTime ) s_pPresentCommandBuffer->Render(); vkDeviceWaitIdle(g_vkDevice); - m_bOutputImageOutdated = false; static uint32_t s_nImageIndex = 0; uint32_t nImageIndex = 0; @@ -684,9 +679,10 @@ void CVkRenderContext::Frame( float fDeltaTime ) s_nImageIndex = (s_nImageIndex + 1) % g_vkSwapchainImages.GetSize(); g_vkCommandBuffers = {}; + */ } -void CVkRenderContext::CreateSwapchain() +void CVkRenderContext::CreateSwapchain( IGameWindow *pWindow ) { uint32_t numSurfaceFormats = 0; CUtlVector surfaceFormats; @@ -708,16 +704,17 @@ void CVkRenderContext::CreateSwapchain() uint32_t nSwapchainImages; CUtlVector swapchainImages; + VkSurfaceKHR hSurface; - gamewindow->CreateVulkanSurface(g_vkInstance); + hSurface = (VkSurfaceKHR)pWindow->CreateVulkanSurface(g_vkInstance); - vkGetPhysicalDeviceSurfaceCapabilitiesKHR(g_vkPhysicalDevice, (VkSurfaceKHR)gamewindow->GetVulkanSurface(), &surfaceCapatibilities); + vkGetPhysicalDeviceSurfaceCapabilitiesKHR(g_vkPhysicalDevice, (VkSurfaceKHR)hSurface, &surfaceCapatibilities); - vkGetPhysicalDeviceSurfaceFormatsKHR(g_vkPhysicalDevice, (VkSurfaceKHR)gamewindow->GetVulkanSurface(), &numSurfaceFormats, NULL); + vkGetPhysicalDeviceSurfaceFormatsKHR(g_vkPhysicalDevice, (VkSurfaceKHR)hSurface, &numSurfaceFormats, NULL); surfaceFormats.Resize(numSurfaceFormats); - vkGetPhysicalDeviceSurfaceFormatsKHR(g_vkPhysicalDevice, (VkSurfaceKHR)gamewindow->GetVulkanSurface(), &numSurfaceFormats, surfaceFormats.GetData()); + vkGetPhysicalDeviceSurfaceFormatsKHR(g_vkPhysicalDevice, (VkSurfaceKHR)hSurface, &numSurfaceFormats, surfaceFormats.GetData()); stSelectedFormat = surfaceFormats[0]; @@ -734,12 +731,12 @@ void CVkRenderContext::CreateSwapchain() } formatPicked: - vkGetPhysicalDeviceSurfacePresentModesKHR(g_vkPhysicalDevice, (VkSurfaceKHR)gamewindow->GetVulkanSurface(), &nSurfacePresentModes, NULL); + vkGetPhysicalDeviceSurfacePresentModesKHR(g_vkPhysicalDevice, hSurface, &nSurfacePresentModes, NULL); surfacePresentModes.Resize(nSurfacePresentModes); - vkGetPhysicalDeviceSurfacePresentModesKHR(g_vkPhysicalDevice, (VkSurfaceKHR)gamewindow->GetVulkanSurface(), &nSurfacePresentModes, surfacePresentModes.GetData()); + vkGetPhysicalDeviceSurfacePresentModesKHR(g_vkPhysicalDevice, hSurface, &nSurfacePresentModes, surfacePresentModes.GetData()); stSwapchainCreateInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; - stSwapchainCreateInfo.surface = (VkSurfaceKHR)gamewindow->GetVulkanSurface(); + stSwapchainCreateInfo.surface = hSurface; stSwapchainCreateInfo.imageFormat = stSelectedFormat.format; stSwapchainCreateInfo.imageColorSpace = stSelectedFormat.colorSpace; stSwapchainCreateInfo.presentMode = VK_PRESENT_MODE_IMMEDIATE_KHR; @@ -786,10 +783,10 @@ formatPicked: } -void CVkRenderContext::DestroySwapchain() +void CVkRenderContext::DestroySwapchain( IGameWindow *pWindow ) { vkDestroySwapchainKHR(g_vkDevice, g_vkSwapchain, NULL); - gamewindow->DestroyVulkanSurface(g_vkInstance); + pWindow->DestroyVulkanSurface(g_vkInstance); } //----------------------------------------------------------------------------- diff --git a/materialsystem/vulkan/shader.cpp b/materialsystem/vulkan/shader.cpp index eb264af..b8710d2 100644 --- a/materialsystem/vulkan/shader.cpp +++ b/materialsystem/vulkan/shader.cpp @@ -1,4 +1,8 @@ #include "vulkan_state.h" +CVkShader::~CVkShader() +{ + +} void CVkShader::AddShaderLibrary( CVkPipelineLibrary *pLibrary ) { m_libraries.AppendTail(pLibrary); diff --git a/materialsystem/vulkan/vulkan_state.h b/materialsystem/vulkan/vulkan_state.h index 6858a65..04db708 100644 --- a/materialsystem/vulkan/vulkan_state.h +++ b/materialsystem/vulkan/vulkan_state.h @@ -256,6 +256,7 @@ void CVk##name##PipelineLibrary::Build() \ class CVkShader : public IShader { public: + ~CVkShader(); void AddShaderLibrary( CVkPipelineLibrary *pLibrary ); void Build(); virtual uint32_t PSGetResourceByName( const char *szName ) override; diff --git a/public/appleauth/iauth.h b/public/appleauth/iauth.h deleted file mode 100644 index d12c9e5..0000000 --- a/public/appleauth/iauth.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef APPLE_AUTH_H -#define APPLE_AUTH_H - -#include "tier0/platform.h" -#include "tier2/iappsystem.h" - -enum EAppleAuthDaemonStatus -{ - APPLE_AUTH_DAEMON_NOT_LOGGED_IN, - APPLE_AUTH_DAEMON_LOGGED_IN, -}; - -enum EAppleAuthStatus -{ - APPLE_AUTH_FAILURE, - APPLE_AUTH_SUCCESS, - APPLE_AUTH_NEED_2FA, - APPLE_AUTH_NEED_SMS_2FA, -}; - -abstract_class IAppleAuth: public IAppSystem -{ -public: - virtual void LaunchLoginDaemon() = 0; - virtual EAppleAuthDaemonStatus GetStatus() = 0; - virtual EAppleAuthStatus SubmitLoginData( const char *szEmail, const char *szPassword ) = 0; - virtual EAppleAuthStatus Submit2FA( const char *szCode ) = 0; -}; - -#define APPLE_AUTH_INTERFACE_VERSION "AppleAuth001" - -#endif diff --git a/public/asmrigs/as.h b/public/asmrigs/as.h deleted file mode 100644 index ad20bd2..0000000 --- a/public/asmrigs/as.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef ASMRIGS_AS_H -#define ASMRIGS_AS_H - -#include "tier0/platform.h" -#include "tier1/utlbuffer.h" - -struct AsOptions_t -{ - -}; - -CUtlBuffer Assemble( const char *szAssembly, AsOptions_t stOptions ); - -#endif diff --git a/public/asmrigs/ld.h b/public/asmrigs/ld.h deleted file mode 100644 index 2c8be2e..0000000 --- a/public/asmrigs/ld.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef ASMRIGS_LD_H -#define ASMRIGS_LD_H - -#include "tier0/interface.h" - -#endif diff --git a/public/asmrigs/tokenparser.h b/public/asmrigs/tokenparser.h deleted file mode 100644 index 313b309..0000000 --- a/public/asmrigs/tokenparser.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef ASMRIGS_TOKEN_PARSER -#define ASMRIGS_TOKEN_PARSER - -#include "tier2/tokenizer.h" - -class CTokenParser -{ -public: - bool IsEOF(); - const char *PeekToken(); - bool IsToken( const char *szString ); - const char *PeekStringLiteral(); - bool Continue(); - - Token_t *m_pTokens; - Token_t *m_pTokensEnd; - Token_t *m_pCurrentToken; -}; - -inline const char *CTokenParser::PeekToken() -{ - if ( m_pCurrentToken->m_bIsQuoted ) - return NULL; - return m_pCurrentToken->m_szValue; -} -inline bool CTokenParser::IsEOF() -{ - if (m_pCurrentToken == m_pTokensEnd) - return true; - return false; -}; - -inline bool CTokenParser::IsToken( const char *szString ) -{ - if ( !V_strcmp(szString, m_pCurrentToken->m_szValue)) - return true; - return false; -}; - -inline const char *CTokenParser::PeekStringLiteral() -{ - if ( !m_pCurrentToken->m_bIsQuoted ) - return NULL; - return m_pCurrentToken->m_szValue; -} - -inline bool CTokenParser::Continue() -{ - m_pCurrentToken++; - if ( m_pCurrentToken == m_pTokensEnd ) - return false; - return true; -} - -#endif diff --git a/public/http/http.h b/public/http/http.h deleted file mode 100644 index 812fbe9..0000000 --- a/public/http/http.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef HTTP_H -#define HTTP_H - -#include "tier0/platform.h" -#include "tier1/utlvector.h" -#include "tier1/utlstring.h" - -struct HTTPHeaderParam_t -{ - CUtlString m_szParamName; - CUtlString m_szValue; -}; - -struct HTTPHeader_t -{ - uint32_t m_nParamCount; - HTTPHeaderParam_t *m_params; -}; - -struct HTTPResponse_t -{ - CUtlBuffer m_params; - CUtlBuffer m_message; - uint32_t m_uCode; - bool m_bIsComplete; -}; - -struct WebSocketPacket_t -{ - size_t m_uSize; - void *m_pData; -}; - -abstract_class IHTTPClient -{ -public: - virtual void Post( const char *szResource, HTTPHeader_t *pHeader, uint32_t uDataSize, const void *data ) = 0; - virtual void Get( const char *szResource, HTTPHeader_t *pHeader ) = 0; - - virtual bool WebSocket_Connect( const char *szResource ) = 0; - virtual void WebSocket_Close( void ) = 0; - virtual void WebSocket_SendText( const char *szData ) = 0; - virtual CUtlString WebSocket_RecvText() = 0; - virtual void WebSocket_SendBinary( size_t uSize, const void *pData ) = 0; - virtual WebSocketPacket_t WebSocket_RecvBinary() = 0; - - virtual HTTPResponse_t GetResponse() = 0; -}; - -abstract_class IHTTPClientManager -{ -public: - virtual IHTTPClient *Connect( const char *szUrl, bool bSecure, uint16_t *pPort ) = 0; - virtual void Disconnect( IHTTPClient *pClient ) = 0; -}; - -#define HTTP_CLIENT_INTERFACE_VERSION "FHTTPClientMgr001" -extern IHTTPClientManager *g_pHttpClientMgr; - - -#endif diff --git a/public/igamewindow.h b/public/igamewindow.h index 7117eed..ce24c3a 100644 --- a/public/igamewindow.h +++ b/public/igamewindow.h @@ -1,43 +1,28 @@ #ifndef GAME_WINDOW_H #define GAME_WINDOW_H -#include "tier2/iappsystem.h" +#include "gamesystem.h" #include "tier0/platform.h" #include "materialsystem/imaterialsystem.h" -enum EGraphicsAPI -{ - GRAPHICS_API_METAL, - GRAPHICS_API_VULKAN, -}; - -abstract_class IGameWindow: public IAppSystem +abstract_class IGameWindow: public IGameSystem { public: - virtual void UpdateWindow() = 0; + virtual uint32_t GetRenderWidth() = 0; + virtual uint32_t GetRenderHeight() = 0; - - // Rendering info - virtual void SetRenderImage( IImage *pImage ) = 0; - virtual bool BIsRenderResolutionUpdated() = 0; - virtual void GetRenderWidth() = 0; - virtual void GetRenderHeight() = 0; - virtual EGraphicsAPI GetGraphicsAPI() = 0; - - // Vulkan stuff - virtual int GetVulkanInstanceExtensionCount() = 0; - virtual const char **GetVulkanInstanceExtensions() = 0; - - virtual void CreateVulkanSurface( void *pInstance, void *pDevice ) = 0; - virtual void DestroyVulkanSurface( void *pInstance, void *pDevice ) = 0; - - virtual void *GetVulkanSurface() = 0; - virtual void *GetVulkanFence( int iFrame ) = 0; - virtual void *GetVulkanDrawSemaphore( int iFrame ) = 0; - virtual void *GetVulkanPresentSemaphore( int iFrame ) = 0; - virtual IImage *GetVulkanSwapchainImage( int iFrame ) = 0; + virtual void *CreateVulkanSurface( void *pInstance ) = 0; + virtual void DestroyVulkanSurface( void *pInstance ) = 0; }; -extern IGameWindow *gamewindow; +abstract_class IGameWindowManager: public IGameSystem +{ +public: + virtual IGameWindow *CreateWindow() = 0; + virtual void DestroyWindow( IGameWindow* pWindow ) = 0; + + virtual int GetVulkanInstanceExtensionCount() = 0; + virtual const char **GetVulkanInstanceExtensions() = 0; +}; #endif diff --git a/public/materialsystem/imaterialsystem.h b/public/materialsystem/imaterialsystem.h index 00ef1ea..35f7d55 100644 --- a/public/materialsystem/imaterialsystem.h +++ b/public/materialsystem/imaterialsystem.h @@ -4,6 +4,7 @@ #include "tier0/platform.h" #include "tier2/iappsystem.h" class IGameWindow; +class IGameWindowManager; #define VULKAN_FRAMES_IN_FLIGHT 2 @@ -87,7 +88,7 @@ enum ETopologyMode abstract_class IRenderingObject { public: - virtual ~IRenderingObject() = 0; + virtual ~IRenderingObject() = default; virtual void SetDebugName( const char *szName ) = 0; }; @@ -97,6 +98,7 @@ public: abstract_class IBuffer : public IRenderingObject { public: + virtual ~IBuffer() = default; virtual void Lock() = 0; virtual void Unlock() = 0; virtual void *Map() = 0; @@ -126,7 +128,7 @@ public: abstract_class IShader { public: - virtual ~IShader() = 0; + virtual ~IShader() = default; virtual uint32_t PSGetResourceByName( const char *szName ) = 0; virtual uint32_t VSGetResourceByName( const char *szName ) = 0; }; @@ -141,7 +143,7 @@ public: abstract_class IMaterial { public: - virtual ~IMaterial() = 0; + virtual ~IMaterial() = default; virtual void VSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource ) = 0; virtual void PSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource ) = 0; virtual void VSSetConstantsBuffer( uint32_t uRegister, IBuffer *pImage ) = 0; @@ -185,13 +187,6 @@ abstract_class IRenderContext: public IAppSystem { public: virtual void Frame( float fTime ) = 0; - - virtual void SetOutputImage( IImage *pImage ) = 0; - - virtual bool BIsOutputImageOutdated() = 0; - virtual uint32_t GetNewOutputImageWidth() = 0; - virtual uint32_t GetNewOutputImageHeight() = 0; - virtual EImageFormat GetNewOutputImageFormat() = 0; virtual IVertexBuffer *CreateVertexBuffer( uint32_t nSize ) = 0; virtual IIndexBuffer *CreateIndexBuffer( uint32_t nSize ) = 0; @@ -212,12 +207,16 @@ public: virtual IRenderCommandList *CreateCommandList() = 0; virtual void DestroyCommandList( IRenderCommandList *pCommandList ) = 0; virtual void SubmitCommandList(IRenderCommandList *pList) = 0; + + virtual void SetMainWindowManager( IGameWindowManager *pWindowManager ) = 0; virtual void RenderGameWindow( IGameWindow *pWindow ) = 0; + virtual void RegisterGameWindow( IGameWindow *pWindow ) = 0; + virtual void UnregisterGameWindow( IGameWindow *pWindow ) = 0; }; -#define RENDER_CONTEXT_INTERFACE_NAME "RenderContext001" -#define MATERIAL_SYSTEM_INTERFACE_NAME "MaterialSystem001" +#define RENDER_CONTEXT_INTERFACE_VERSION "RenderContext001" +#define MATERIAL_SYSTEM_INTERFACE_VERSION "MaterialSystem001" abstract_class IMaterialSystem: public IAppSystem { @@ -226,7 +225,5 @@ public: virtual void RenderGameWindow( IGameWindow *pWindow ) = 0; }; -extern IRenderContext *g_pRenderContext; -extern IMaterialSystem *g_pMaterialSystem; #endif diff --git a/public/tier0/commandline.h b/public/tier0/commandline.h deleted file mode 100644 index c41dbbe..0000000 --- a/public/tier0/commandline.h +++ /dev/null @@ -1,30 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Command line handler for argc and argv. It also allows to find -// parameters and push your own. -//===========================================================================// - -#ifndef TIER0_COMMANDLINE_H -#define TIER0_COMMANDLINE_H - - -#include "tier0/platform.h" - -abstract_class ICommandLine -{ -public: - virtual void CreateCommandLine( int argc, char **argv ) = 0; - - virtual bool CheckParam( const char *psz ) = 0; - virtual char *ParamValue( const char* psz, const char *szDefaultValue = 0 ) = 0; - - virtual void AddParam( char *psz ) = 0; - virtual void RemoveParam( char *psz ) = 0; - - virtual int ParamCount() = 0; - virtual int FindParam( const char *psz ) = 0; - virtual const char *GetParam(int nIndex) = 0; -}; - -ICommandLine *CommandLine(); - -#endif diff --git a/public/tier0/lib.h b/public/tier0/lib.h deleted file mode 100644 index c6c7b65..0000000 --- a/public/tier0/lib.h +++ /dev/null @@ -1,130 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: A header which implements or redefines libc implementation. -// It is defined with V_ prefix to differentiate own implementation from -// given libc by the OS. -//===========================================================================// - -#ifndef TIER0_STDLIB_H -#define TIER0_STDLIB_H - -#include "tier0/minmax_on.h" - -#include "stdint.h" -#include "string.h" -#include "stdio.h" -#include "stdlib.h" -#include "ctype.h" - -//----------------------------------------------------------------------------- -// string.h -//----------------------------------------------------------------------------- -#define V_memcpy memcpy -#define V_memmove memmove -#define V_memchr memchr -#define V_memcmp memcmp -#define V_memset memset - -#define V_strcat strcat -#define V_strncat strncat -#define V_strchr strchr -#define V_strrchr strrchr -#define V_strcmp strcmp -#define V_strncmp strncmp -#define V_strcoll strcoll -#define V_strcpy strcpy -#define V_strncpy strncpy -#define V_strlen strlen -#define V_strnlen strnlen -#define V_strspn strspn -#define V_strcspn strcspn -#define V_strpbrk strpbrk -#define V_strstr strstr -#define V_strtok strtok -#define V_strxfrm strxfrm - -#ifdef __WIN32__ -#define V_stricmp stricmp -#else -#define V_stricmp strcasecmp -#endif - -//----------------------------------------------------------------------------- -// stdio.h -//----------------------------------------------------------------------------- -#define V_fclose fclose -#define V_fopen fopen -#define V_freopen freopen -#define V_fdopen fdopen -#define V_remove remove -#define V_rename rename -#define V_rewind rewind -#define V_tmpfile tmpfile - -#define V_feof feof -#define V_ferror ferror -#define V_fflush fflush -#define V_fgetpos fgetpos -#define V_fgetc getc -#define V_fgets gets -#define V_fputc putc -#define V_fputs puts -#define V_ftell ftell -#define V_fseek fseek -#define V_fsetpos fsetpos -#define V_fread fread -#define V_fwrite fwrite -#define V_getc getc -#define V_getchar getchar -#define V_gets gets -#define V_printf printf -#define V_vprintf vprintf -#define V_fprintf fprintf -#define V_vfprintf vfprintf -#define V_sprintf sprintf -#define V_snprintf snprintf -#define V_vsprintf vsprintf -#define V_vsnprintf vsnprintf -#define V_perror perror -#define V_putc putc -#define V_putchar putchar -#define V_fputchar fputchar -#define V_scanf scanf -#define V_sscanf sscanf -#define V_vscanf vscanf -#define V_fscanf fscanf -#define V_vfscanf vfscanf -#define V_vsscanf vsscanf -#define V_setbuf setbuf -#define V_setvbuf setvbuf -#define V_tmpnam tmpnam -#define V_ungetc ungetc -#define V_puts puts - - -//----------------------------------------------------------------------------- -// stdlib.h -//----------------------------------------------------------------------------- -#define V_atoi atoi -#define V_atof atof - -//----------------------------------------------------------------------------- -// ctype.h -//----------------------------------------------------------------------------- - -#define V_isalnum isalnum -#define V_isalpha isalpha -#define V_isblank isblank -#define V_iscntrl iscntrl -#define V_isdigit isdigit -#define V_isgraph isgraph -#define V_islower islower -#define V_isprint isprint -#define V_ispunct ispunct -#define V_isspace isspace -#define V_isupper isupper -#define V_isxdigit isxdigit -#define V_tolower tolower -#define V_toupper toupper - - -#endif diff --git a/public/tier0/mem.h b/public/tier0/mem.h deleted file mode 100644 index 94f35e4..0000000 --- a/public/tier0/mem.h +++ /dev/null @@ -1,20 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: A memory allocator for C and C++. -// For now it uses libc but it is possible to use own allocators -//===========================================================================// - -#ifndef TIER0_MEM_H -#define TIER0_MEM_H - -#include "platform.h" -#include "lib.h" - -PLATFORM_INTERFACE void *V_malloc( int nSize ); -PLATFORM_INTERFACE void V_free( void *pMem ); -PLATFORM_INTERFACE void *V_realloc( void *pMem, int nSize ); - -void *operator new( size_t nCount ); -void *operator new ( size_t nCount, void *pPtr ); -void operator delete( void *pMem ) noexcept; - -#endif diff --git a/public/tier0/minmax_off.h b/public/tier0/minmax_off.h deleted file mode 100644 index 5c1ab93..0000000 --- a/public/tier0/minmax_off.h +++ /dev/null @@ -1,9 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Disables min and max. Used for C++ interoperability -//===========================================================================// - - -#ifdef min -#undef min -#undef max -#endif diff --git a/public/tier0/minmax_on.h b/public/tier0/minmax_on.h deleted file mode 100644 index 1969732..0000000 --- a/public/tier0/minmax_on.h +++ /dev/null @@ -1,8 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Enables min and max. Used for C++ interoperability -//===========================================================================// - -#include "minmax_off.h" - -#define max(x, y) (((x) > (y)) ? (x) : (y)) -#define min(x, y) (((x) < (y)) ? (x) : (y)) diff --git a/public/tier0/network.h b/public/tier0/network.h deleted file mode 100644 index 3283572..0000000 --- a/public/tier0/network.h +++ /dev/null @@ -1,21 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: -//===========================================================================// - -#ifndef TIER0_NETWORK_H -#define TIER0_NETWORK_H - -#include "platform.h" -#ifdef __linux__ -#include "arpa/inet.h" -#endif -#ifdef __WIN32__ -#include "winsock2.h" -#include "ws2tcpip.h" -#endif - - -PLATFORM_INTERFACE void Net_Init(); -PLATFORM_INTERFACE void Net_Deinit(); - -#endif diff --git a/public/tier0/platform.h b/public/tier0/platform.h deleted file mode 100644 index 4d1c140..0000000 --- a/public/tier0/platform.h +++ /dev/null @@ -1,114 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Multi-platform implementation of some of the functions which -// are provided by each OS differently. -//===========================================================================// - -#ifndef TIER0_PLATFORM_H -#define TIER0_PLATFORM_H - -#include "stdint.h" -#include "stddef.h" - -#ifdef __WIN32__ -#define DLL_EXPORT extern "C" -#define DLL_IMPORT extern "C" - -#define DLL_CLASS_EXPORT -#define DLL_CLASS_IMPORT - -#define DLL_GLOBAL_EXPORT extern -#define DLL_GLOBAL_IMPORT extern -#else -#define DLL_EXPORT extern "C" __attribute__ ((visibility("default"))) -#define DLL_IMPORT extern "C" - -#define DLL_CLASS_EXPORT __attribute__ ((visibility("default"))) -#define DLL_CLASS_IMPORT - -#define DLL_GLOBAL_EXPORT __attribute ((visibility("default"))) -#define DLL_GLOBAL_IMPORT extern - -#endif - -#ifdef TIER0_STATIC - -#define GLOBAL_USED __attribute__((used)) - -#else - -#define GLOBAL_USED __attribute__((used)) - -#ifdef TIER0_IMPLEMENTATION -#define PLATFORM_INTERFACE DLL_EXPORT -#define PLATFORM_OVERLOAD DLL_GLOBAL_EXPORT -#define PLATFORM_CLASS DLL_CLASS_EXPORT -#else -#define PLATFORM_INTERFACE DLL_IMPORT -#define PLATFORM_OVERLOAD DLL_GLOBAL_IMPORT -#define PLATFORM_CLASS DLL_CLASS_IMPORT -#endif - -#endif - -#if defined(__linux__) -#define POSIX -#endif - -#define SWAP16(x) (uint16_t)((((x) >> 8) & 0x00FF) | \ - (((x) << 8) & 0xFF00)) - -#define SWAP32(x) (uint32_t)((((x) >> 24) & 0x000000FF) | \ - (((x) >> 8) & 0x0000FF00) | \ - (((x) << 8) & 0x00FF0000) | \ - (((x) << 24) & 0xFF000000)) - -#define SWAP64(x) ((uint64_t)( \ - (((x) >> 56) & 0x00000000000000FFULL) | \ - (((x) >> 40) & 0x000000000000FF00ULL) | \ - (((x) >> 24) & 0x0000000000FF0000ULL) | \ - (((x) >> 8) & 0x00000000FF000000ULL) | \ - (((x) << 8) & 0x000000FF00000000ULL) | \ - (((x) << 24) & 0x0000FF0000000000ULL) | \ - (((x) << 40) & 0x00FF000000000000ULL) | \ - (((x) << 56) & 0xFF00000000000000ULL) )) - -#define abstract_class class - -PLATFORM_INTERFACE void Plat_FatalErrorFunc( const char *szFormat, ... ); - -typedef void( *ListDirCallbackFn )( const char *szPath ); -PLATFORM_INTERFACE void Plat_ListDirRecursive( const char *szPath, ListDirCallbackFn file, ListDirCallbackFn dir ); -PLATFORM_INTERFACE void Plat_ListDir( const char *szPath, ListDirCallbackFn file, ListDirCallbackFn dir ); -PLATFORM_INTERFACE char *Plat_GetExtension( const char *szPath ); - -PLATFORM_INTERFACE void Plat_MakeDir( const char *szPath, int iPermissions ); - -PLATFORM_INTERFACE void Plat_TrapSignals( void (*pfn)() ); -PLATFORM_INTERFACE void Plat_Backtrace( void ); - -PLATFORM_INTERFACE void *Plat_LoadLibrary( const char *psz ); -PLATFORM_INTERFACE void *Plat_GetProc( void *lib, const char *psz ); -PLATFORM_INTERFACE void Plat_UnloadLibrary( void *psz ); - -PLATFORM_INTERFACE void Plat_SetEnv( const char *szVar, const char *psz ); -PLATFORM_INTERFACE const char *Plat_GetEnv( const char *szVar ); - -PLATFORM_INTERFACE void Plat_SetWorkingDir( const char *psz ); -PLATFORM_INTERFACE const char *Plat_GetWorkingDir( void ); - -PLATFORM_INTERFACE const char *Plat_GetExecutablePath( void ); -PLATFORM_INTERFACE const char *Plat_GetParentDir( const char *psz ); - -PLATFORM_INTERFACE const char *Plat_GetUNIXExecutable( const char *psz ); -PLATFORM_INTERFACE const char *Plat_GetWindowsExecutable( const char *psz ); -PLATFORM_INTERFACE const char *Plat_GetPlatformExecutable( const char *psz ); - -PLATFORM_INTERFACE const char *Plat_GetDarwinSharedLib( const char *psz ); -PLATFORM_INTERFACE const char *Plat_GetUNIXSharedLib( const char *psz ); -PLATFORM_INTERFACE const char *Plat_GetWindowsSharedLib( const char *psz ); -PLATFORM_INTERFACE const char *Plat_GetPlatformSharedLib( const char *psz ); - -PLATFORM_INTERFACE double Plat_GetTime( void ); -PLATFORM_INTERFACE void Plat_Exit( int status ); - -#endif diff --git a/public/tier0/rand.h b/public/tier0/rand.h deleted file mode 100644 index a2eec79..0000000 --- a/public/tier0/rand.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef TIER0_RAND_H -#define TIER0_RAND_H - -#include "tier0/platform.h" - -PLATFORM_INTERFACE void Plat_InitRandom(); -PLATFORM_INTERFACE void Plat_ShutdownRandom(); -PLATFORM_INTERFACE void Plat_URandom( size_t uBufferSize, uint8_t *szBuffer ); - -#endif diff --git a/public/tier1/appinit.h b/public/tier1/appinit.h deleted file mode 100644 index 244ca1e..0000000 --- a/public/tier1/appinit.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef APPINIT_H -#define APPINIT_H - - -void AppInitializePath(); - -#endif diff --git a/public/tier1/ban_std.h b/public/tier1/ban_std.h deleted file mode 100644 index 0f7eec3..0000000 --- a/public/tier1/ban_std.h +++ /dev/null @@ -1,5 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: BAN STL. I hate it. -//===========================================================================// - -#define std no_you_do_not_use_std diff --git a/public/tier1/interface.h b/public/tier1/interface.h deleted file mode 100644 index e609cff..0000000 --- a/public/tier1/interface.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef INTERFACE_H -#define INTERFACE_H - -#include "tier0/platform.h" - -typedef void *( *CreateInterfaceFn )( const char *szName, int *pReturnCode ); -typedef void *( *InstantiateInterfaceFn )( void ); - -class CInterfaceRegistry -{ -public: - CInterfaceRegistry( InstantiateInterfaceFn fn, const char *szName ); - - InstantiateInterfaceFn m_CreateFn; - const char *m_szName; - - CInterfaceRegistry *m_pNext; -}; - - -#define EXPOSE_INTERFACE( className, interfaceName, versionName ) \ - static void *__Create##className##_interface() { return ( interfaceName* )( new className ); }; \ - static CInterfaceRegistry __Create##className##_registry( __Create##className##_interface, versionName ); - -#define EXPOSE_INTERFACE_FN( functionName, interfaceName, versionName ) \ - static CInterfaceRegistry __Create##interfaceName##_registry( functionName, versionName ); - -#define EXPOSE_INTERFACE_GLOBALVAR( className, interfaceName, versionName, globalVarName ) \ - static void *__Create##className##_interface() { return ( interfaceName* )( &globalVarName ); }; \ - static CInterfaceRegistry __Create##className##_registry( __Create##className##_interface, versionName ); - - -DLL_EXPORT void *CreateInterface( const char *szName, int *pReturnCode ); - -CreateInterfaceFn Sys_GetFactory( void *pLibrary ); -CreateInterfaceFn Sys_GetFactory( const char *szLibrary ); - -#endif diff --git a/public/tier1/unban_std.h b/public/tier1/unban_std.h deleted file mode 100644 index 30d44b7..0000000 --- a/public/tier1/unban_std.h +++ /dev/null @@ -1,5 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Unban STL because C++ doesn't like using something different. -//===========================================================================// - -#undef std diff --git a/public/tier1/utlbuffer.h b/public/tier1/utlbuffer.h deleted file mode 100644 index e0ee920..0000000 --- a/public/tier1/utlbuffer.h +++ /dev/null @@ -1,370 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Memory buffers for C++. They store data on heap as you have C -// arrays for stack. -//===========================================================================// - -#ifndef TIER1_UTL_BUFFER_H -#define TIER1_UTL_BUFFER_H - - -#include "tier0/mem.h" -#include "tier0/platform.h" -#include "tier0/lib.h" - -template -class CUtlBuffer; -template -class CUtlResizableBuffer; - -//----------------------------------------------------------------------------- -// This buffer contains static data allocated on heap. -//----------------------------------------------------------------------------- -template -class CUtlBuffer -{ -public: - CUtlBuffer( void ); - CUtlBuffer( size_t nSize ); - CUtlBuffer( const CUtlBuffer& buffer ); - CUtlBuffer( const CUtlResizableBuffer& buffer ); - ~CUtlBuffer( void ); - - size_t GetSize( void ) const; - T* GetMemory(void) const; - - operator T*( void ) const; - T& operator []( const size_t nIndex ); - T operator []( const size_t nIndex ) const; - CUtlBuffer& operator=(const CUtlBuffer& other); -private: - T* m_pData = NULL; - size_t m_nSize = 0; -}; - -//----------------------------------------------------------------------------- -// Constructor. -//----------------------------------------------------------------------------- -template -CUtlBuffer::CUtlBuffer() : m_nSize(0) -{ - m_pData = 0; -} - -//----------------------------------------------------------------------------- -// Constructor. -//----------------------------------------------------------------------------- -template -CUtlBuffer::CUtlBuffer( size_t nSize ) : m_nSize(nSize) -{ - if ( nSize == 0 ) - nSize = 1; - m_pData = (T*)V_malloc(sizeof(T)*nSize); - V_memset(m_pData, 0, sizeof(T)*nSize); -} - -//----------------------------------------------------------------------------- -// Constructor. -//----------------------------------------------------------------------------- -template -CUtlBuffer::CUtlBuffer( const CUtlBuffer& buffer ) : m_nSize(buffer.m_nSize) -{ - m_pData = (T*)V_malloc(sizeof(T)*buffer.m_nSize); - V_memcpy(m_pData,buffer.m_pData,sizeof(T)*buffer.m_nSize); -} - -//----------------------------------------------------------------------------- -// Constructor. -//----------------------------------------------------------------------------- -template -CUtlBuffer::CUtlBuffer( const CUtlResizableBuffer& buffer ) : m_nSize(buffer.GetSize()) -{ - m_pData = (T*)V_malloc(sizeof(T)*buffer.GetSize()); - V_memcpy(m_pData,buffer.GetMemory(),sizeof(T)*buffer.GetSize()); -} - -template -CUtlBuffer::~CUtlBuffer() -{ - if ( m_pData != 0) - V_free(m_pData); -} -//----------------------------------------------------------------------------- -// Gets memory size. -//----------------------------------------------------------------------------- -template -size_t CUtlBuffer::GetSize( void ) const -{ - return m_nSize; -} - -//----------------------------------------------------------------------------- -// Gets memory address. -//----------------------------------------------------------------------------- -template -T* CUtlBuffer::GetMemory( void ) const -{ - return m_pData; -} - -//----------------------------------------------------------------------------- -// Gets memory address using casting. -//----------------------------------------------------------------------------- -template -CUtlBuffer::operator T*( void ) const -{ - return m_pData; -} - -//----------------------------------------------------------------------------- -// Indexes buffer for writing. -//----------------------------------------------------------------------------- -template -T& CUtlBuffer::operator []( const size_t nIndex ) -{ - if ( m_pData == 0) - Plat_FatalErrorFunc("Buffer was not initialized\n"); - - if ( nIndex >= m_nSize ) - Plat_FatalErrorFunc("Out of bounds indexing: size is %lu and index is %lu\n", m_nSize/sizeof(T), nIndex); - - return m_pData[nIndex]; -} - -//----------------------------------------------------------------------------- -// Indexes buffer for reading. -//----------------------------------------------------------------------------- -template -T CUtlBuffer::operator []( const size_t nIndex ) const -{ - if ( nIndex >= m_nSize ) - Plat_FatalErrorFunc("Out of bounds indexing: size is %lu and index is %lu\n",m_nSize, nIndex); - return m_pData[nIndex]; -} - -//----------------------------------------------------------------------------- -// Assigns buffer. -//----------------------------------------------------------------------------- -template -CUtlBuffer& CUtlBuffer::operator=(const CUtlBuffer& other) -{ - if ( this != &other ) - { - if ( m_pData != 0) - V_free(m_pData); - m_pData = (T*)V_malloc(sizeof(T)*other.m_nSize); - m_nSize = other.m_nSize; - V_memcpy(m_pData, other.m_pData, sizeof(T)*other.m_nSize); - } - return *this; -} - -//----------------------------------------------------------------------------- -// This buffer contains static data allocated on heap which can be resized. -//----------------------------------------------------------------------------- -template -class CUtlResizableBuffer -{ -public: - CUtlResizableBuffer( void ); - CUtlResizableBuffer( size_t nSize ); - CUtlResizableBuffer( const CUtlBuffer& buffer ); - CUtlResizableBuffer( const CUtlResizableBuffer& buffer ); - ~CUtlResizableBuffer(); - - size_t GetSize() const; - size_t GetRealSize() const; - void Resize( size_t nSize, size_t nDataOffset = 0 ); - void* GetMemory(void) const; - - operator T*( void ) const; - T& operator []( const size_t nIndex ); - T operator []( const size_t nIndex ) const; - CUtlResizableBuffer& operator=(const CUtlResizableBuffer& other); -private: - size_t CalculateMemorySize(size_t nSize); - T* m_pData = NULL; - size_t m_nSize = 0; - size_t m_nAllocatedSize = 0; -}; - - - -//----------------------------------------------------------------------------- -// Constructor. -//----------------------------------------------------------------------------- -template -CUtlResizableBuffer::CUtlResizableBuffer() -{ - m_pData = NULL; - m_nSize = 0; - m_nAllocatedSize = 0; -} - -//----------------------------------------------------------------------------- -// Constructor. -//----------------------------------------------------------------------------- -template -CUtlResizableBuffer::CUtlResizableBuffer( size_t nSize ) -{ - Resize(nSize); -} - -//----------------------------------------------------------------------------- -// Constructor. -//----------------------------------------------------------------------------- -template -CUtlResizableBuffer::CUtlResizableBuffer( const CUtlBuffer& buffer ) : m_nSize(buffer.nSize) -{ -} - -//----------------------------------------------------------------------------- -// Constructor. -//----------------------------------------------------------------------------- -template -CUtlResizableBuffer::CUtlResizableBuffer( const CUtlResizableBuffer& buffer ) : m_nSize(buffer.m_nSize) -{ - *this = buffer; -} - -template -CUtlResizableBuffer::~CUtlResizableBuffer() -{ - for ( size_t i = 0; i < m_nSize; i++) - m_pData[i].~T(); - if (m_pData) - V_free(m_pData); - m_pData = 0; - m_nSize = 0; - m_nAllocatedSize = 0; -}; - -//----------------------------------------------------------------------------- -// Gets memory size. -//----------------------------------------------------------------------------- -template -size_t CUtlResizableBuffer::GetSize( void ) const -{ - return m_nSize; -} - -//----------------------------------------------------------------------------- -// Gets memory size. -//----------------------------------------------------------------------------- -template -size_t CUtlResizableBuffer::GetRealSize( void ) const -{ - return m_nAllocatedSize; -} - -//----------------------------------------------------------------------------- -// Resizes memory. -//----------------------------------------------------------------------------- -template -void CUtlResizableBuffer::Resize( size_t nSize, size_t nDataOffset ) -{ - if (nSize > m_nAllocatedSize) - { - size_t nAllocationSize = CalculateMemorySize(nSize); - T *pData = (T*)V_malloc(nAllocationSize*sizeof(T)); - for (size_t i = 0; i < m_nSize; i++) - { - new (&pData[i+nDataOffset]) T(m_pData[i]); - m_pData[i].~T(); - } - V_free(m_pData); - m_pData = pData; - m_nAllocatedSize = nAllocationSize; - } - for ( size_t i = m_nSize+nDataOffset; i < nSize; ++i ) - new (&m_pData[i]) T(); - m_nSize = nSize; -} - -//----------------------------------------------------------------------------- -// Gets memory address. -//----------------------------------------------------------------------------- -template -void* CUtlResizableBuffer::GetMemory( void ) const -{ - return m_pData; -} - -//----------------------------------------------------------------------------- -// Gets memory address using casting. -//----------------------------------------------------------------------------- -template -CUtlResizableBuffer::operator T*( void ) const -{ - return m_pData; -} - -//----------------------------------------------------------------------------- -// Indexes buffer for writing. -//----------------------------------------------------------------------------- -template -T& CUtlResizableBuffer::operator []( const size_t nIndex ) -{ - if ( m_pData == 0) - Plat_FatalErrorFunc("Buffer was not initialized\n"); - - if ( nIndex >= m_nSize ) - Plat_FatalErrorFunc("Out of bounds indexing: size is %lu and index is %lu\n",m_nSize, nIndex); - - return m_pData[nIndex]; -} - -//----------------------------------------------------------------------------- -// Indexes buffer for reading. -//----------------------------------------------------------------------------- -template -T CUtlResizableBuffer::operator []( const size_t nIndex ) const -{ - if ( nIndex >= m_nSize ) - Plat_FatalErrorFunc("Out of bounds indexing: size is %lu and index is %lu\n",m_nSize, nIndex); - return m_pData[nIndex]; -} - -//----------------------------------------------------------------------------- -// Assigns buffer. -//----------------------------------------------------------------------------- -template -CUtlResizableBuffer& CUtlResizableBuffer::operator=(const CUtlResizableBuffer& other) -{ - if ( this != &other ) - { - if (m_pData) - { - for (size_t i = 0; i < m_nSize; i++) - m_pData[i].~T(); - V_free(m_pData); - } - m_pData = (T*)V_malloc(other.m_nAllocatedSize*sizeof(T)); - m_nAllocatedSize = other.m_nAllocatedSize; - m_nSize = other.m_nSize; - for ( size_t i = 0; i < other.m_nSize; i++) - new (&m_pData[i]) T(other.m_pData[i]); - } - return *this; -} - -//----------------------------------------------------------------------------- -// Calculates memory size that is -//----------------------------------------------------------------------------- -template -size_t CUtlResizableBuffer::CalculateMemorySize(size_t nSize) -{ - size_t x = nSize; - if (x == 0) return 1; - x--; - x |= x >> 1; - x |= x >> 2; - x |= x >> 4; - x |= x >> 8; - x |= x >> 16; -#if SIZE_MAX > UINT32_MAX - x |= x >> 32; -#endif - return x + 1; -} - -#endif diff --git a/public/tier1/utlinitlist.h b/public/tier1/utlinitlist.h deleted file mode 100644 index eb08468..0000000 --- a/public/tier1/utlinitlist.h +++ /dev/null @@ -1,64 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// C++ only supports std::initializer_list, so we need to get around compiler. -// -// fuck C++ once -// fuck C++ twice -// fuck C++ thrice -//===========================================================================// - -#ifndef TIER1_UTL_INITIALIZER_LIST_H -#define TIER1_UTL_INITIALIZER_LIST_H - -#include "stddef.h" - -// from GCC -namespace std -{ - template - class initializer_list - { - public: - typedef _E value_type; - typedef const _E& reference; - typedef const _E& const_reference; - typedef size_t size_type; - typedef const _E* iterator; - typedef const _E* const_iterator; - - private: - iterator _M_array; - size_type _M_len; - - constexpr initializer_list(const_iterator __a, size_type __l) - : _M_array(__a), _M_len(__l) { } - - public: - constexpr initializer_list() noexcept - : _M_array(0), _M_len(0) { } - - constexpr size_type - size() const noexcept { return _M_len; } - - constexpr const_iterator - begin() const noexcept { return _M_array; } - - constexpr const_iterator - end() const noexcept { return begin() + size(); } - }; - - template - constexpr const _Tp* - begin(initializer_list<_Tp> __ils) noexcept - { return __ils.begin(); } - - template - constexpr const _Tp* - end(initializer_list<_Tp> __ils) noexcept - { return __ils.end(); } -} - -template -using CUtlInitializerList = std::initializer_list; - - -#endif diff --git a/public/tier1/utlmap.h b/public/tier1/utlmap.h deleted file mode 100644 index 6b89f0f..0000000 --- a/public/tier1/utlmap.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef TIER1_UTL_STRING_H -#define TIER1_UTL_STRING_H - -#include "tier1/utlvector.h" - -#endif \ No newline at end of file diff --git a/public/tier1/utlmutex.h b/public/tier1/utlmutex.h deleted file mode 100644 index 7176442..0000000 --- a/public/tier1/utlmutex.h +++ /dev/null @@ -1,25 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Mutexes for C++ -//===========================================================================// - -#ifndef TIER1_UTL_MUTEX_H -#define TIER1_UTL_MUTEX_H - -#include "pthread.h" - -class CUtlLock -{ -public: - CUtlLock(); - ~CUtlLock(); - - CUtlLock(const CUtlLock&) = delete; - CUtlLock& operator=(const CUtlLock&) = delete; - - void Lock(); - void Unlock(); -private: - pthread_mutex_t m_lock; -}; - -#endif diff --git a/public/tier1/utlstring.h b/public/tier1/utlstring.h deleted file mode 100644 index fd07e94..0000000 --- a/public/tier1/utlstring.h +++ /dev/null @@ -1,275 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Own implementation of string. -//===========================================================================// - -#ifndef TIER1_UTL_STRING_H -#define TIER1_UTL_STRING_H - -#include "tier1/utlvector.h" -#include "tier0/lib.h" -#include "stdarg.h" - -class CUtlString { -public: - CUtlString( void ); - CUtlString( const char *psz, ... ); - CUtlString( const CUtlString &sz ); - - void AppendTail( const char *psz ); - void AppendTail( char ch ); - void AppendHead( const char *psz ); - void AppendHead( char ch ); - void AppendAt( size_t nPosition, const char *psz ); - - void RemoveTail( size_t nCount ); - void RemoveHead( size_t nCount ); - void RemoveAt( size_t nPosition, size_t nCount ); - - CUtlString GetFileName(); - CUtlString GetFileExtension(); - CUtlString GetDirectory(); - CUtlString RemoveHeadFile(); - - char *GetString( void ); - size_t GetLenght( void ); - operator char*( void ); - operator CUtlVector&( void ); - CUtlString& operator=(const CUtlString &sz); - bool operator==(const char* psz); - bool operator!=(const char* psz); - bool operator==(CUtlString& string); - bool operator!=(CUtlString& string); -private: - CUtlVector m_data = 0; -}; -inline CUtlString::CUtlString( void ) -{ - m_data.Reserve(1); - m_data[0]=0; -} - -inline CUtlString::CUtlString( const char *szFormat, ... ) -{ - if (szFormat == 0) - { - m_data.Reserve(1); - m_data[0]=0; - return; - } - va_list vlArgs; - va_start(vlArgs, szFormat); - va_list vlArgs2; - va_copy(vlArgs2, vlArgs); - size_t nSize = V_vsnprintf(NULL, 0, szFormat, vlArgs2); - m_data.Reserve(nSize + 1); - va_end(vlArgs2); - V_vsnprintf(m_data.GetData(), nSize + 1, szFormat, vlArgs); - m_data.Resize(nSize + 1); - va_end(vlArgs); -} - -inline CUtlString::CUtlString( const CUtlString &sz ) -{ - m_data = sz.m_data; -}; - -inline void CUtlString::AppendTail( const char *psz ) -{ - m_data.Resize(V_strlen(m_data.GetData())); - m_data.AppendTail(psz,V_strlen(psz)); - m_data.Reserve(m_data.GetSize()+1); - m_data[m_data.GetSize()] = 0; -} - -inline void CUtlString::AppendHead( const char *psz ) -{ - m_data.AppendHead(psz,V_strlen(psz)); -} - -inline void CUtlString::AppendTail( char ch ) -{ - m_data.Resize(V_strlen(m_data.GetData())); - m_data.AppendTail(ch); - m_data.Reserve(m_data.GetSize()+1); - m_data[m_data.GetSize()] = 0; -} - -inline void CUtlString::AppendHead( char ch ) -{ - m_data.AppendHead(ch); -} -inline void CUtlString::AppendAt( size_t nPosition, const char *psz ) -{ - -} - -inline void CUtlString::RemoveTail( size_t nCount ) -{ - m_data.RemoveTail(nCount); - m_data[m_data.GetSize()-1] = 0; -} - -inline void CUtlString::RemoveHead( size_t nCount ) -{ - m_data.RemoveHead(nCount); -} - -inline void CUtlString::RemoveAt( size_t nPosition, size_t nCount ) -{ - -} - -inline CUtlString CUtlString::GetFileName() -{ - CUtlString szFileName = GetString(); - if (GetLenght() == 0) - return ""; - - char *pLast = &m_data[GetLenght()-1]; - while (pLast != m_data.GetData()) - { - if (*pLast=='/') - { - pLast++; - break; - } - pLast--; - } - - return pLast; -} - -inline CUtlString CUtlString::GetFileExtension() -{ - CUtlString szFileName = GetString(); - - char *pLast = &m_data[GetLenght()-1]; - while (pLast != m_data.GetData()) - { - if (*pLast=='.') - break; - if (*pLast=='/') - return NULL; - pLast--; - } - - return pLast+1; -} - - - -inline CUtlString CUtlString::GetDirectory() -{ - if (GetLenght() == 0) - return NULL; - size_t iNumDeleted = 0; - char *pLast = &m_data[GetLenght()-1]; - CUtlString szDirectory = GetString(); - while (pLast != m_data.GetData()) - { - if (*pLast=='/') - { - iNumDeleted++; - break; - } - pLast--; - iNumDeleted++; - } - - szDirectory.RemoveTail(iNumDeleted); - - return szDirectory; -} - -inline CUtlString CUtlString::RemoveHeadFile() -{ - size_t iLenght = GetLenght(); - size_t iNumDeleted = 0; - char *pc = GetString(); - CUtlString szDirectory = pc; - - if (GetLenght() == 0) - return NULL; - while ( iNumDeleted < iLenght ) - { - if (*pc == '/') - goto remove_slashes; - pc++; - iNumDeleted++; - } - return NULL; -remove_slashes: - while ( iNumDeleted < iLenght ) - { - if (*pc != '/') - { - szDirectory.RemoveHead(iNumDeleted); - return szDirectory; - } - pc++; - iNumDeleted++; - } - return NULL; -} - -inline char *CUtlString::GetString( void ) -{ - return m_data.GetData(); -} - -inline size_t CUtlString::GetLenght( void ) -{ - return V_strlen(GetString()); -} - -inline CUtlString::operator char*( void ) -{ - return GetString(); -} - -inline CUtlString::operator CUtlVector&( void ) -{ - return m_data; -} - -inline CUtlString &CUtlString::operator=(const CUtlString &sz) -{ - if (this != &sz) - { - m_data = sz.m_data; - } - return *this; -} - -inline bool CUtlString::operator==(const char *psz) -{ - if (psz==0) - psz = ""; - if (!V_strcmp(GetString(), psz)) - return true; - return false; -} - -inline bool CUtlString::operator!=(const char *psz) -{ - if (psz==0) - psz = ""; - if (!V_strcmp(GetString(), psz)) - return false; - return true; -} - -inline bool CUtlString::operator==(CUtlString &string) -{ - if (!V_strcmp(GetString(), string.GetString())) - return true; - return false; -} - -inline bool CUtlString::operator!=(CUtlString &string) -{ - if (!V_strcmp(GetString(), string.GetString())) - return false; - return true; -} -#endif diff --git a/public/tier1/utlvector.h b/public/tier1/utlvector.h deleted file mode 100644 index 0c24440..0000000 --- a/public/tier1/utlvector.h +++ /dev/null @@ -1,447 +0,0 @@ -//================= Copyright kotofyt, All rights reserved ==================// -// Purpose: Own implementation of vectors, it is better to use them in local -// namespaces for own . -//===========================================================================// - -#ifndef TIER1_UTL_VECTOR_H -#define TIER1_UTL_VECTOR_H - -#include "tier0/lib.h" -#include "tier1/utlbuffer.h" -#include "tier1/utlinitlist.h" - -//----------------------------------------------------------------------------- -// Basic vector implementation. There isn't much in them but they work. -//----------------------------------------------------------------------------- -template -class CUtlVector -{ -public: - CUtlVector( void ); - CUtlVector( size_t nSize ); - CUtlVector( CUtlInitializerList initalizerList ); - CUtlVector( const CUtlVector &vector ); - ~CUtlVector(); - - void AppendHead( const T &data ); - void AppendHead( const T *pData, size_t n ); - void AppendTail( const T &data ); - void AppendTail( const T *data, size_t n ); - void AppendAt( size_t nIndex, const T &data ); - void AppendAt( size_t nIndex, const T *data, size_t n ); - - void RemoveHead(); - void RemoveHead( size_t n ); - void RemoveTail(); - void RemoveTail( size_t n ); - void RemoveAt( size_t nIndex ); - void RemoveAt( size_t nIndex, size_t n ); - - T *GetData( void ); - size_t GetSize( void ); - void Resize( size_t nSize, size_t nDataOffset = 0 ); - void Reserve( size_t nSize, size_t nDataOffset = 0 ); - - T &operator[]( size_t nIndex ); - T &operator[]( size_t nIndex ) const; - CUtlVector &operator=(const CUtlVector &vec); - - // Iterator stuff - // Do we really need it? - struct Iterator { - T *m_pCurrent; - Iterator( T *pCurrent ) : m_pCurrent(pCurrent) {} - T& operator*( void ) const { return *m_pCurrent;} - Iterator& operator++( void ) { - ++m_pCurrent; - return *this; - } - bool operator!=( const Iterator& other ) const - { - return m_pCurrent != other.m_pCurrent; - } - }; - - - Iterator begin( void ) const - { - return Iterator((T*)m_data.GetMemory()); - } - Iterator end( void ) const - { - return Iterator((T*)m_data.GetMemory()+m_nSize); - } - -private: - size_t m_nSize = 0; - CUtlResizableBuffer m_data; -}; - -//---------------------------------------------------------------------------- -// Constructor -//---------------------------------------------------------------------------- -template -CUtlVector::CUtlVector( void ) -{ - -}; - -//---------------------------------------------------------------------------- -// Constructor -//---------------------------------------------------------------------------- -template -CUtlVector::CUtlVector( size_t nSize ) -{ - m_data.Resize(nSize); - V_memset(m_data.GetMemory(),0,m_data.GetSize()*sizeof(T)); - m_nSize = nSize; -}; - -//---------------------------------------------------------------------------- -// Fancy constructor -//---------------------------------------------------------------------------- -template -CUtlVector::CUtlVector( CUtlInitializerList initalizerList ) -{ - m_data.Resize(initalizerList.size()); - V_memset(m_data.GetMemory(),0,m_data.GetSize()*sizeof(T)); - m_nSize = m_data.GetSize(); - for (size_t i = 0; i -CUtlVector::CUtlVector( const CUtlVector& vector ) -{ - *this = vector; -} -template -CUtlVector::~CUtlVector() -{ -} - -template -void CUtlVector::AppendHead( const T &data ) -{ - AppendHead(&data,1); -} - -template -void CUtlVector::AppendHead( const T *pData, size_t n ) -{ - size_t nOldSize = m_nSize; - m_data.Resize(m_nSize+n); - for (size_t i = nOldSize; i > 0; --i) - { - new (&m_data[i + n - 1]) T(m_data[i - 1]); - m_data[i - 1].~T(); - } - for (size_t i = 0; i < n; ++i) - { - new (&m_data[i]) T(pData[i]); - } - m_nSize+=n; -} - -template -void CUtlVector::AppendTail( const T &data ) -{ - AppendTail(&data,1); -} - -template -void CUtlVector::AppendTail( const T *pData, size_t n ) -{ - m_data.Resize(m_data.GetSize()+n); - for ( size_t i = 0; i < n; i++ ) - new (&m_data[i+m_nSize]) T(pData[i]); - m_nSize+=n; -} - -template -void CUtlVector::AppendAt( size_t nIndex, const T &data ) -{ - AppendAt(nIndex, &data, 1); -} - -template -void CUtlVector::AppendAt( size_t nIndex, const T *pData, size_t n ) -{ - size_t nOldSize = m_nSize; - m_data.Resize(m_nSize+n); - for (size_t i = nOldSize; i > nIndex; --i) - { - new (&m_data[i + n - 1]) T(m_data[i - 1]); - m_data[i - 1].~T(); - } - for (size_t i = 0; i < n; ++i) - { - new (&m_data[nIndex + i]) T(pData[i]); - } - m_nSize+=n; -} - -template -void CUtlVector::RemoveHead() -{ - RemoveHead( 1 ); -} -template -void CUtlVector::RemoveHead( size_t n ) -{ - RemoveAt(0, n); -} -template -void CUtlVector::RemoveTail() -{ - RemoveTail( 1 ); -} -template -void CUtlVector::RemoveTail( size_t n ) -{ - if (n > m_nSize) - n = m_nSize; - m_data.Resize(m_nSize-n); - m_nSize -= n; -} -template -void CUtlVector::RemoveAt( size_t nIndex ) -{ - RemoveAt( nIndex, 1 ); -} -template -void CUtlVector::RemoveAt( size_t nIndex, size_t n ) -{ - if ( nIndex >= m_nSize ) - { - return; - } - if ( nIndex + n > m_nSize ) - { - n = m_nSize - nIndex; - } - for ( size_t i = nIndex; i < nIndex + n; i++ ) - { - m_data[i].~T(); - } - - size_t nElementsToMove = m_nSize - (nIndex + n); - for ( size_t i = 0; i < nElementsToMove; i++ ) - { - new (&m_data[nIndex + i]) T(m_data[nIndex + n + i]); - m_data[nIndex + n + i].~T(); - } - m_nSize -= n; -} - -template -T *CUtlVector::GetData( void ) -{ - return (T*)m_data.GetMemory(); -} - -template -size_t CUtlVector::GetSize( void ) -{ - return m_nSize; -} - -template -void CUtlVector::Resize( size_t nSize, size_t nDataOffset ) -{ - m_data.Resize(nSize, nDataOffset); - m_nSize = nSize; -} -template -void CUtlVector::Reserve( size_t nSize, size_t nDataOffset ) -{ - m_data.Resize(nSize, nDataOffset); -} -template -CUtlVector &CUtlVector::operator=(const CUtlVector &vec) -{ - if (this != &vec) - { - m_nSize = vec.m_nSize; - m_data = vec.m_data; - } - return *this; -} - -template -T &CUtlVector::operator[]( size_t nIndex ) -{ - return m_data[nIndex]; -} - -template -T &CUtlVector::operator[]( size_t nIndex ) const -{ - return m_data[nIndex]; -} - - -//----------------------------------------------------------------------------- -// Self referencing arrays are quite cool. -// They allow to append stuff in head and tail of the array and use less memory -// copying. Downside is their indexing is O(n/2) -// -// Implements the same stuff as CUtlVector does. -//----------------------------------------------------------------------------- -template -class CUtlSelfReferencingVector -{ -private: - template - struct SelfData_t; -public: - CUtlSelfReferencingVector(); - ~CUtlSelfReferencingVector(); - - void AppendHead( const T& data ); - void AppendTail( const T& data ); - void AppendAt( size_t nIndex, const T& data ); - - void RemoveHead( void ); - void RemoveTail( void ); - void RemoveAt( size_t nIndex ); - - T &GetFirst(); - T &GetLast(); - - size_t GetSize(); - - T operator[]( size_t nIndex ); - T& operator[]( size_t nIndex ) const; - - - // Iterator stuff - struct Iterator { - SelfData_t *m_pCurrent; - Iterator( SelfData_t *pCurrent ) : m_pCurrent(pCurrent) {} - T& operator*( void ) const { return m_pCurrent->data;} - Iterator& operator++( void ) { - if (m_pCurrent) m_pCurrent = m_pCurrent->pNext; - return *this; - } - bool operator!=( const Iterator& other ) const - { - return m_pCurrent != other.m_pCurrent; - } - }; - - Iterator begin( void ) const - { - return Iterator(m_pHead); - } - Iterator end( void ) const - { - return Iterator(NULL); - } - -private: - size_t m_nSize = 0; - - template - struct SelfData_t - { - SelfData_t *pNext = NULL; - SelfData_t *pPrev = NULL; - A data; - }; - SelfData_t *m_pTail = NULL; - SelfData_t *m_pHead = NULL; -}; - - -//---------------------------------------------------------------------------- -// Constructor -//---------------------------------------------------------------------------- -template -CUtlSelfReferencingVector::CUtlSelfReferencingVector() -{ - -}; - -//---------------------------------------------------------------------------- -// Destructor -//---------------------------------------------------------------------------- -template -CUtlSelfReferencingVector::~CUtlSelfReferencingVector() -{ - SelfData_t *pNext = NULL; - for (SelfData_t *pCurrent = m_pHead; pCurrent; pCurrent=pNext) - { - pNext = pCurrent->pNext; - delete pCurrent; - } -}; - -//---------------------------------------------------------------------------- -// Inserts new element in the start of the vector. -//---------------------------------------------------------------------------- -template -void CUtlSelfReferencingVector::AppendHead( const T& data ) -{ - SelfData_t* pData = new SelfData_t; - pData->data = data; - pData->pNext = m_pHead; - if (m_pHead) - m_pHead->pPrev = pData; - pData->pPrev = 0; - m_pHead = pData; - if (m_pTail == 0) - m_pTail = m_pHead; - m_nSize++; -}; - -//---------------------------------------------------------------------------- -// Inserts new element in the end of the vector. -//---------------------------------------------------------------------------- -template -void CUtlSelfReferencingVector::AppendTail( const T& data ) -{ - SelfData_t* pData = new SelfData_t; - pData->data = data; - if (m_pTail) - m_pTail->pNext = pData; - pData->pPrev = m_pTail; - m_pTail = pData; - if (m_pHead == 0) - m_pHead = m_pTail; - - m_nSize++; -}; - -//---------------------------------------------------------------------------- -// Removes element in the start of the vector. -//---------------------------------------------------------------------------- -template -void CUtlSelfReferencingVector::RemoveHead( void ) -{ - if (m_pHead == m_pTail) - m_pHead = 0; -}; -//---------------------------------------------------------------------------- -// Removes element in the end of the vector. -//---------------------------------------------------------------------------- -template -void CUtlSelfReferencingVector::RemoveTail( void ) -{ - -} - -template -T &CUtlSelfReferencingVector::GetFirst() -{ - return m_pHead->data; -} - -template -T &CUtlSelfReferencingVector::GetLast() -{ - return m_pTail->data; -} - - -#endif diff --git a/public/tier2/fileformats/ini.h b/public/tier2/fileformats/ini.h deleted file mode 100644 index 6508e87..0000000 --- a/public/tier2/fileformats/ini.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef TIER2_INI_H -#define TIER2_INI_H - -#include "tier0/platform.h" -#include "tier1/utlstring.h" -#include "tier1/utlvector.h" - -abstract_class IINISection -{ -public: - virtual bool GetBoolValue( const char *szKeyName ) = 0; - virtual int GetIntValue( const char *szKeyName ) = 0; - virtual const char *GetStringValue( const char *szKeyName ) = 0; - virtual CUtlString GetUTLStringValue( const char *szKeyName ) = 0; -}; - -abstract_class IINIFile -{ -public: - virtual IINISection *GetSection( const char *szSectionName ) = 0; -}; - -abstract_class IINIManager -{ -public: - virtual IINIFile *ReadFile( const char *psz ) = 0; - virtual IINIFile *ReadString( const char *psz ) = 0; - virtual void ReleaseFile( IINIFile *pFile ) = 0; -}; - -IINIManager *INIManager(); - -#endif diff --git a/public/tier2/fileformats/json.h b/public/tier2/fileformats/json.h deleted file mode 100644 index d27a629..0000000 --- a/public/tier2/fileformats/json.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef TIER2_JSON_H -#define TIER2_JSON_H - -#include "tier0/platform.h" -#include "tier1/utlstring.h" - -class IJSONObject; -class IJSONArray; -class IJSONValue; - -enum EJSONParameterType -{ - JSON_PARAMETER_NULL, - JSON_PARAMETER_STRING, - JSON_PARAMETER_NUMBER, - JSON_PARAMETER_BOOLEAN, - JSON_PARAMETER_ARRAY, - JSON_PARAMETER_OBJECT, -}; - -enum EJSONParameterNotes -{ - JSON_PARAMETER_NOTE_NONE = 0, - JSON_PARAMETER_NOTE_BINARY, -}; - -abstract_class IJSONArray -{ -public: - virtual uint32_t GetCount() = 0; - virtual IJSONValue *GetParameter( uint32_t i ) = 0; - - virtual void SetArray( uint32_t uCount, IJSONValue **ppValues ) = 0; - - virtual void CopyTo( IJSONArray *pObject ) = 0; - virtual void Free() = 0; -}; - -abstract_class IJSONValue -{ -public: - virtual EJSONParameterType GetType( void ) = 0; - virtual - virtual const char *GetStringValue() = 0; - virtual float GetNumberValue() = 0; - virtual bool GetBooleanValue() = 0; - virtual IJSONArray *GetArray() = 0; - virtual IJSONObject *GetObject() = 0; - - virtual void MakeNULL() = 0; - virtual void SetStringValue( const char *szString ) = 0; - virtual void SetNumberValue( float fValue ) = 0; - virtual void SetBooleanValue( bool bValue ) = 0; - virtual void SetArrayValue( IJSONArray *pValue ) = 0; - virtual void SetObjectValue( IJSONObject *pValue ) = 0; - - virtual void CopyTo( IJSONValue *pObject ) = 0; - virtual void Free() = 0; -}; - -abstract_class IJSONObject -{ -public: - virtual IJSONValue *GetValue( const char *szName ) = 0; - virtual void SetValue( const char *szName, IJSONValue *pValue ) = 0; - - virtual void CopyTo( IJSONObject *pObject ) = 0; - virtual void Free() = 0; -}; - -abstract_class IJSONManager -{ -public: - virtual IJSONObject *CreateObject( ) = 0; - virtual void FreeObject( IJSONObject *pObject ) = 0; - virtual IJSONArray *CreateArray( ) = 0; - virtual void FreeArray( IJSONArray *pArray ) = 0; - virtual IJSONValue *CreateValue( ) = 0; - virtual void FreeValue( IJSONValue *pValue ) = 0; - - virtual IJSONValue *ReadString( const char *szString ) = 0; - virtual CUtlString WriteString( IJSONValue *pValue ) = 0; -}; - -IJSONManager *JSONManager(); - -#endif diff --git a/public/tier2/fileformats/plist.h b/public/tier2/fileformats/plist.h deleted file mode 100644 index e115466..0000000 --- a/public/tier2/fileformats/plist.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef TIER2_PLIST_H -#define TIER2_PLIST_H - -#include "tier2/fileformats/json.h" - -abstract_class IPropertyListManager -{ -public: - virtual IJSONObject *ReadString( const char *psz ) = 0; -}; - -IPropertyListManager *PropertyListManager(); -#endif diff --git a/public/tier2/fileformats/xml.h b/public/tier2/fileformats/xml.h deleted file mode 100644 index fc062d3..0000000 --- a/public/tier2/fileformats/xml.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef TIER2_XML_H -#define TIER2_XML_H - -#include "tier0/platform.h" -#include "tier1/utlstring.h" - -struct XMLParam_t -{ - CUtlString m_szName; - CUtlString m_szValue; -}; - -enum EXMLObjectType -{ - XML_OBJECT_ELEMENT, - XML_OBJECT_TEXT, - XML_OBJECT_COMMENT, - XML_OBJECT_CDATA, - XML_OBJECT_PROCESSING_INSTRUCTION, - XML_OBJECT_DOCUMENT_TYPE, -}; - -abstract_class IXMLObject -{ -public: - virtual EXMLObjectType GetType() = 0; - virtual const char *GetValue() = 0; - virtual void SetType( EXMLObjectType eType ) = 0; - virtual void SetValue( const char *psz ) = 0; - - virtual CUtlVector &GetParams() = 0; - - virtual CUtlVector &GetChildren() = 0; - - virtual void Free() = 0; - - inline IXMLObject *FindFirstTag( const char *szName ) - { - for ( auto &c: GetChildren() ) - { - if ( c->GetType() != XML_OBJECT_ELEMENT ) continue; - if ( V_strcmp(c->GetValue(), szName) ) continue; - return c; - } - return NULL; - }; -}; - -struct XMLFile_t -{ - IXMLObject *m_pRoot; - CUtlString m_szRootObjectName; - CUtlString m_szFPI; - CUtlString m_szURI; -}; - -abstract_class IXMLManager -{ -public: - virtual XMLFile_t ReadString( const char *szData ) = 0; - virtual CUtlString WriteString( IXMLObject *pObject ) = 0; - - virtual IXMLObject *CreateObject() = 0; - virtual void FreeObject( IXMLObject *pObject ) = 0; -}; - -IXMLManager *XMLManager(); - -#endif diff --git a/public/tier2/iappsystem.h b/public/tier2/iappsystem.h deleted file mode 100644 index fb4ad2c..0000000 --- a/public/tier2/iappsystem.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef APP_SYSTEM_H -#define APP_SYSTEM_H - -#include "tier1/interface.h" - -//---------------------------------------------------------------------------- -// App system is a module which has different applications based on the user's system. -// For example rendering could use either Vulkan or Metal based on the system. -//---------------------------------------------------------------------------- -abstract_class IAppSystem -{ -public: - virtual void Init() = 0; - virtual void Shutdown() = 0; -}; - -#endif diff --git a/public/tier2/ifilesystem.h b/public/tier2/ifilesystem.h deleted file mode 100644 index 75f1721..0000000 --- a/public/tier2/ifilesystem.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef FILESYSTEM_H -#define FILESYSTEM_H - -#include "iappsystem.h" -#include "tier0/platform.h" -#include "tier1/utlbuffer.h" - -enum EFileMode -{ - FILEMODE_READ = 0x01, - FILEMODE_WRITE = 0x02, - FILEMODE_APPEND = 0x04, -}; - -enum ESeekMode -{ - SEEKMODE_RELATIVE_CURRENT, - SEEKMODE_RELATIVE_START, - SEEKMODE_RELATIVE_END, -}; - -abstract_class IFileSystem; - -class IFileHandle -{ -public: - IFileSystem *m_pFileSystem; -}; - -abstract_class IDirectoryHandle -{ -}; - -//---------------------------------------------------------------------------- -// IFileSystem is an app system which manages files, could have different -// file systems etc. Because of that there is base file system which manages -// others. PAK files are opened first, then mounted stuff comes second and -// host's system last. -//---------------------------------------------------------------------------- -abstract_class IFileSystem: public IAppSystem -{ -public: - virtual IFileHandle *Open( const char *szFileName, int eOpCode ) = 0; - virtual size_t Write( IFileHandle *pFile, const void *pData, size_t nDataSize ) = 0; - virtual size_t Read( IFileHandle *pFile, void *pData, size_t nDataSize ) = 0; - - virtual size_t Seek( IFileHandle *pFile, ESeekMode eSeekMode, size_t nOffset ) = 0; - virtual size_t Tell( IFileHandle *pFile ) = 0; - virtual size_t Size( IFileHandle *pFile ) = 0; - - virtual void Close( IFileHandle *pFile ) = 0; - - // Some cool stuff - virtual CUtlBuffer Read( IFileHandle *pFile ) = 0; - - // Leaks memory - // Should be cleaned by the user - virtual const char *ReadString( IFileHandle *pFile ) = 0; - - // Directory stuff - virtual IDirectoryHandle *OpenDir( const char *szDirName ) = 0; - virtual void CloseDir( IDirectoryHandle *pDir ) = 0; - - IFileSystem *m_pNext; - - void RegisterFileSystem(); -}; - -#define FILESYSTEM_INTERFACE_VERSION "FileSystem001" - -extern IFileSystem *filesystem; - -#endif diff --git a/public/tier2/tokenizer.h b/public/tier2/tokenizer.h deleted file mode 100644 index 2da7ca3..0000000 --- a/public/tier2/tokenizer.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef TIER2_TOKENIZER_H -#define TIER2_TOKENIZER_H -#include "tier0/platform.h" -#include "tier1/utlstring.h" -#include "tier1/utlvector.h" - -struct Token_t -{ - CUtlString m_szValue; - bool m_bIsQuoted; - - uint32_t m_iLine; - uint32_t m_iCharacter; -}; - -typedef bool( *IsAlphabetSymbolFn )( char c ); - -struct TokenizeProperties_t -{ - IsAlphabetSymbolFn m_pfnIsAlphabetSymbol; - IsAlphabetSymbolFn m_pfnIsFirstAlphabetSymbol; - bool m_bAllowSlashToContinueString; -}; - -CUtlVector Tokenize( const char *szString ); -CUtlVector Tokenize( const char *szString, IsAlphabetSymbolFn pfnIsAlphabetSymbol ); - - -#endif diff --git a/public/tier2/uuid.h b/public/tier2/uuid.h deleted file mode 100644 index e69de29..0000000 diff --git a/public/tier3/lexer.h b/public/tier3/lexer.h deleted file mode 100644 index 264cff1..0000000 --- a/public/tier3/lexer.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef BRB_LEXER_H -#define BRB_LEXER_H - -#include "tier0/platform.h" - -abstract_class ILexerWord -{ -public: - virtual int GetType() = 0; -}; - -abstract_class ILexer -{ -public: - virtual ILexerWord *ParseTokens( CUtlVector tokens ) = 0; -}; - -#endif diff --git a/shadercompiler/__build.cpp b/shadercompiler/build.cpp similarity index 83% rename from shadercompiler/__build.cpp rename to shadercompiler/build.cpp index 0ad2a72..3edaefd 100644 --- a/shadercompiler/__build.cpp +++ b/shadercompiler/build.cpp @@ -3,33 +3,31 @@ #include "ld.h" #include "target.h" -CUtlString shadercompiler_lib; -CUtlString shadercompiler_exe; DECLARE_BUILD_STAGE(libshadercompiler) { CProject_t stProject; LinkProject_t stLinkProject; CUtlString szOutput; - stProject.m_szName = "shadercompiler"; - stProject.m_target = Target_t::HostTarget(); + stProject.m_szName = "ShaderCompiler"; stProject.bFPIC = true; stProject.includeDirectories = { - "public", - "external/slang/include", - "external/Vulkan-Headers/include", + "../public", + "../external/slang/include", + "../external/Vulkan-Headers/include", }; stProject.files = { - "shadercompiler/slang/vulkan_spirv.cpp", - "materialsystem/compiledshader.cpp", + "slang/vulkan_spirv.cpp", + "../materialsystem/compiledshader.cpp", }; stLinkProject = ccompiler->Compile(&stProject); stLinkProject.linkType = ELINK_STATIC_LIBRARY; szOutput = linker->Link(&stLinkProject); - shadercompiler_lib = szOutput; - return 1; + ADD_OUTPUT_OBJECT("lib", szOutput); + + return 0; } DECLARE_BUILD_STAGE(shadercompiler) { @@ -41,7 +39,7 @@ DECLARE_BUILD_STAGE(shadercompiler) stProject.m_target = Target_t::HostTarget(); stProject.includeDirectories = {"public"}; stProject.files = { - "shadercompiler/main.cpp", + "main.cpp", }; stLinkProject = ccompiler->Compile(&stProject); @@ -53,15 +51,18 @@ DECLARE_BUILD_STAGE(shadercompiler) stLinkProject.libraries = {"slang-compiler","slang-glslang-2025.24.2"}; stLinkProject.libraryDirectories = {"external/linux"}; szOutput = linker->Link(&stLinkProject); + /* filesystem2->MakeDirectory(CUtlString("%s/bin/tools", szOutputDir.GetString())); filesystem2->CopyFile(CUtlString("%s/bin/tools", szOutputDir.GetString()), szOutput); filesystem2->CopyFile(CUtlString("%s/bin/tools", szOutputDir.GetString()), "external/linux/libslang-compiler.so.0.2025.24.2"); filesystem2->CopyFile(CUtlString("%s/bin/tools", szOutputDir.GetString()), "external/linux/libslang-glslang-2025.24.2.so"); shadercompiler_exe = CUtlString("%s/bin/tools/fsc", szOutputDir.GetString()); + */ return 1; } +/* DECLARE_BUILD_STAGE(compileshaders) { if (CommandLine()->CheckParam("-nofsc")) @@ -73,3 +74,4 @@ DECLARE_BUILD_STAGE(compileshaders) runner->Wait(); return 0; }; +*/ diff --git a/stdfilesystems/build.cpp b/stdfilesystems/build.cpp deleted file mode 100644 index 36f365d..0000000 --- a/stdfilesystems/build.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "helper.h" -#include "c.h" -#include "ld.h" -#include "tier1/utlstring.h" - -ADD_DEPENDENCY_BUILD_FILE(tier0, "../tier0/build.cpp") -ADD_DEPENDENCY_BUILD_FILE(tier1, "../tier1/build.cpp") - -CUtlVector fs_CompiledFiles = { - "filesystem_libc.cpp", -}; - -DECLARE_BUILD_STAGE(filesystem_std) -{ - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - CUtlString szOutputProject = ""; - - compileProject.m_szName = "filesystem_std"; - compileProject.files = fs_CompiledFiles; - compileProject.includeDirectories = {"../public"}; - compileProject.bFPIC = true; - ldProject = ccompiler->Compile(&compileProject); - - ldProject.linkType = ELINK_DYNAMIC_LIBRARY; - ldProject.libraryObjects = { - GET_PROJECT_LIBRARY(tier0, "tier0"), - GET_PROJECT_LIBRARY(tier1, "tier1"), - }; - szOutputProject = linker->Link(&ldProject); - - ADD_OUTPUT_OBJECT("fs", szOutputProject); - - return 0; -}; diff --git a/stdfilesystems/filesystem_libc.cpp b/stdfilesystems/filesystem_libc.cpp deleted file mode 100644 index eed1215..0000000 --- a/stdfilesystems/filesystem_libc.cpp +++ /dev/null @@ -1,165 +0,0 @@ -#include "tier2/ifilesystem.h" -#include "tier1/interface.h" -#include "tier0/lib.h" -#include "errno.h" -#include "dirent.h" - -class CLIBCFileHandle : public IFileHandle -{ -public: - FILE *m_pFile; - size_t m_nSize; - -}; - -class CLIBCDirectoryHandle: public IDirectoryHandle -{ -public: - DIR *m_pDir; -}; - -class CLIBCFileSystem : public IFileSystem -{ -public: - virtual void Init() override { - - }; - virtual void Shutdown() override {}; - - virtual IFileHandle *Open( const char *szFileName, int eOpCode ) override - { - const char *szOperation; - FILE *pFile; - CLIBCFileHandle *pHandle = NULL; - - switch (eOpCode) - { - case FILEMODE_READ: - szOperation = "rb"; - break; - case FILEMODE_WRITE: - szOperation = "wb"; - break; - default: - V_printf("Operation is not supported\n"); - break; - } - - pFile = V_fopen(szFileName, szOperation); - if (!pFile) - { - return NULL; - } - - pHandle = new CLIBCFileHandle; - pHandle->m_pFileSystem = this; - pHandle->m_pFile = pFile; - Seek(pHandle,SEEKMODE_RELATIVE_END, 0); - pHandle->m_nSize = Tell(pHandle); - Seek(pHandle, SEEKMODE_RELATIVE_START, 0); - return pHandle; - } - virtual size_t Write( IFileHandle *pFile, const void *pData, size_t nDataSize ) override - { - CLIBCFileHandle *pHandle = (CLIBCFileHandle*)pFile; - if (!pHandle) - return 0; - return V_fwrite( pData, 1, nDataSize, pHandle->m_pFile); - } - virtual size_t Read( IFileHandle *pFile, void *pData, size_t nDataSize ) override - { - CLIBCFileHandle *pHandle = (CLIBCFileHandle*)pFile; - if (!pHandle) - return 0; - return V_fread( pData, 1, nDataSize, pHandle->m_pFile ); - } - - virtual size_t Seek( IFileHandle *pFile, ESeekMode eSeekMode, size_t nOffset ) override - { - CLIBCFileHandle *pHandle = (CLIBCFileHandle*)pFile; - int eLibcSeekMode = 0; - - if (!pHandle) - return 0; - - switch (eSeekMode) { - case SEEKMODE_RELATIVE_CURRENT: - eLibcSeekMode = SEEK_CUR; - break; - case SEEKMODE_RELATIVE_END: - eLibcSeekMode = SEEK_END; - break; - case SEEKMODE_RELATIVE_START: - eLibcSeekMode = SEEK_SET; - break; - } - - return V_fseek( pHandle->m_pFile, nOffset, eLibcSeekMode ); - } - - virtual size_t Tell( IFileHandle *pFile ) override - { - CLIBCFileHandle *pHandle = (CLIBCFileHandle*)pFile; - if (!pHandle) - return 0; - return V_ftell(pHandle->m_pFile); - } - - virtual size_t Size( IFileHandle *pFile ) override - { - CLIBCFileHandle *pHandle = (CLIBCFileHandle*)pFile; - if (!pHandle) - return 0; - return pHandle->m_nSize; - } - - - - virtual void Close( IFileHandle *pFile ) override - { - CLIBCFileHandle *pHandle = (CLIBCFileHandle*)pFile; - if (!pHandle) - return; - V_fclose(pHandle->m_pFile); - delete pHandle; - } - - virtual CUtlBuffer Read( IFileHandle *pFile ) override { return {}; }; - virtual const char *ReadString( IFileHandle *pFile ) override { - char *szData = NULL; - size_t uSize = Size(pFile); - - szData = (char*)V_malloc(uSize+1); - Read(pFile, szData,uSize); - szData[uSize] = 0; - - - return szData; - }; - - virtual IDirectoryHandle *OpenDir( const char *szDirName ) override - { - CLIBCDirectoryHandle *pHandle = NULL; - DIR *pDir = opendir(szDirName); - if (pDir == NULL) - return NULL; - - pHandle = new CLIBCDirectoryHandle; - pHandle->m_pDir = pDir; - return pHandle; - - }; - - virtual void CloseDir( IDirectoryHandle *pDir ) override - { - if (!pDir) - return; - CLIBCDirectoryHandle *pCDir = (CLIBCDirectoryHandle*)pDir; - - closedir(pCDir->m_pDir); - - delete (CLIBCDirectoryHandle*)pDir; - }; -}; - -EXPOSE_INTERFACE(CLIBCFileSystem, IFileSystem, FILESYSTEM_INTERFACE_VERSION) diff --git a/tests/ini/build.cpp b/tests/ini/build.cpp deleted file mode 100644 index 2ef1f20..0000000 --- a/tests/ini/build.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "c.h" -#include "target.h" -#include "helper.h" - -DECLARE_BUILD_STAGE(ini_test) -{ - CProject_t p = { - .files = { - "../../tier0/lib.cpp", - "../../tier0/mem.cpp", - "../../tier0/platform.cpp", - "../../tier1/interface.cpp", - "../../tier1/utlbuffer.cpp", - "../../tier1/utlstring.cpp", - "../../tier1/utlvector.cpp", - "../../tier1/utlmap.cpp", - "../../tier1/commandline.cpp", - "../../tier2/fileformats/ini.cpp", - "../../tier2/filesystem.cpp", - "../../tier2/filesystem_libc.cpp", - "main.cpp", - }, - .includeDirectories = - { - "../../public" - }, - }; - p.m_szName = "initest"; - LinkProject_t l = ccompiler->Compile(&p); - CUtlString szPath = linker->Link(&l); - filesystem2->CopyFile("./", szPath); - - - return 0; -} diff --git a/tests/ini/initest b/tests/ini/initest deleted file mode 100644 index 8726a998bb32b83206b0320d63d5138f4ddc1f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172032 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 Nn)vVX1n|6C{~z;wPM-h( diff --git a/tests/ini/main.cpp b/tests/ini/main.cpp deleted file mode 100644 index 4dbf0fe..0000000 --- a/tests/ini/main.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include "tier0/lib.h" -#include "tier0/mem.h" -#include "tier1/utlbuffer.h" -#include "tier2/fileformats/ini.h" -#include "tier2/ifilesystem.h" - -int main( int argc, char **argv ) -{ - - const char *szFileName; - IFileHandle *pHandle = NULL; - size_t nSize = 0; - CUtlBuffer szData; - - CommandLine()->CreateCommandLine(argc, argv); - filesystem->Init(); - - // Get file - szFileName = CommandLine()->ParamValue("-f"); - if (!szFileName) - return 0; - - // Load it - pHandle = filesystem->Open(szFileName, FILEMODE_READ); - if (!pHandle) - return 0; - - // Get size - pHandle->Seek(SEEKMODE_RELATIVE_END, 0); - nSize = pHandle->Tell(); - pHandle->Seek(SEEKMODE_RELATIVE_START, 0); - - // Read it - szData = CUtlBuffer(nSize+1); - pHandle->Read(szData, nSize); - pHandle->Close(); - - szData[nSize] = 0; - - IINIFile *pIniFile = INIManager()->ReadString(szData); - if (!pIniFile) - return 0; - IINISection *pTestValues = pIniFile->GetSection("Test_Values"); - if (!pTestValues) - return 0; - V_printf("%s\n",pTestValues->GetStringValue("abc3d")); - return 0; -}; diff --git a/tests/ini/test1.ini b/tests/ini/test1.ini deleted file mode 100644 index cf31c5e..0000000 --- a/tests/ini/test1.ini +++ /dev/null @@ -1,13 +0,0 @@ - -[Test_Values] -a = "Hello world!\n" -b = true -c = false -c = 3.1415926 -d = 123456 -e = -2.71828 -f = -890 -g = .34 -abc3d = "Hello world from the funny engine, you can use \" to add quotes" - - diff --git a/tests/ini/test2.ini b/tests/ini/test2.ini deleted file mode 100644 index 558ed37..0000000 --- a/tests/ini/test2.ini +++ /dev/null @@ -1 +0,0 @@ -[ diff --git a/tests/ini/test3.ini b/tests/ini/test3.ini deleted file mode 100644 index 95ef80c..0000000 --- a/tests/ini/test3.ini +++ /dev/null @@ -1 +0,0 @@ -[Hello diff --git a/tests/ini/test4.ini b/tests/ini/test4.ini deleted file mode 100644 index e849c76..0000000 --- a/tests/ini/test4.ini +++ /dev/null @@ -1 +0,0 @@ -[Test Hello] diff --git a/tests/ini/test5.ini b/tests/ini/test5.ini deleted file mode 100644 index 5ef5672..0000000 --- a/tests/ini/test5.ini +++ /dev/null @@ -1,2 +0,0 @@ -["Hello world"] -Test diff --git a/tests/ini/test6.ini b/tests/ini/test6.ini deleted file mode 100644 index 53973bf..0000000 --- a/tests/ini/test6.ini +++ /dev/null @@ -1,2 +0,0 @@ -[Test] -a b diff --git a/tests/ini/test7.ini b/tests/ini/test7.ini deleted file mode 100644 index 4df87f3..0000000 --- a/tests/ini/test7.ini +++ /dev/null @@ -1,2 +0,0 @@ -[Test] -a = diff --git a/tests/ini/test8.ini b/tests/ini/test8.ini deleted file mode 100644 index f6da3f4..0000000 --- a/tests/ini/test8.ini +++ /dev/null @@ -1,5 +0,0 @@ -[Test] -a = b -c = d - -d = test diff --git a/tier0/__build.cpp b/tier0/__build.cpp deleted file mode 100644 index 954cbdb..0000000 --- a/tier0/__build.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "helper.h" -#include "c.h" -#include "ld.h" -#include "tier1/utlstring.h" -#include "tier1/commandline.h" - -CUtlVector tier0_CompiledFiles = { - "tier0/lib.cpp", - "tier0/mem.cpp", - "tier0/platform.cpp", - "tier0/network.cpp", -}; - -DECLARE_BUILD_STAGE(tier0) -{ - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - CUtlString szOutputProject = ""; - - compileProject.m_szName = "tier0"; - compileProject.files = tier0_CompiledFiles; - compileProject.includeDirectories = all_IncludeDirectories; - compileProject.bFPIC = true; - ldProject = ccompiler->Compile(&compileProject); - if (bStaticBuild) - { - ldProject.linkType = ELINK_STATIC_LIBRARY; - szOutputProject = linker->Link(&ldProject); - tier0_lib = szOutputProject; - } - else - { - ldProject.linkType = ELINK_DYNAMIC_LIBRARY; - szOutputProject = linker->Link(&ldProject); - filesystem2->MakeDirectory(CUtlString("%s/bin",szOutputDir.GetString())); - filesystem2->CopyFile(CUtlString("%s/bin", szOutputDir.GetString()), szOutputProject); - - ldProject.linkType = ELINK_STATIC_LIBRARY; - szOutputProject = linker->Link(&ldProject); - tier0_lib = szOutputProject; - } - - return 0; -}; diff --git a/tier0/build.cpp b/tier0/build.cpp deleted file mode 100644 index 5c7ea99..0000000 --- a/tier0/build.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "helper.h" -#include "c.h" -#include "ld.h" -#include "tier1/utlstring.h" - -CUtlVector tier0_CompiledFiles = { - "lib.cpp", - "mem.cpp", - "platform.cpp", - "network.cpp", - "commandline.cpp", - "rand.cpp", -}; - -DECLARE_BUILD_STAGE(tier0) -{ - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - CUtlString szOutputProject = ""; - - compileProject.m_szName = "tier0"; - compileProject.files = tier0_CompiledFiles; - compileProject.includeDirectories = {"../public"}; - compileProject.bFPIC = true; - ldProject = ccompiler->Compile(&compileProject); - - ldProject.linkType = ELINK_DYNAMIC_LIBRARY; - szOutputProject = linker->Link(&ldProject); - - ADD_OUTPUT_OBJECT("tier0", szOutputProject); - - return 0; -}; diff --git a/tier0/commandline.cpp b/tier0/commandline.cpp deleted file mode 100644 index 8190f81..0000000 --- a/tier0/commandline.cpp +++ /dev/null @@ -1,85 +0,0 @@ -#include "tier0/commandline.h" -#include "tier1/utlvector.h" - - -class CCommandLine : public ICommandLine -{ -public: - virtual void CreateCommandLine( int argc, char **argv ) override; - - virtual bool CheckParam( const char *psz ) override; - virtual char *ParamValue( const char* psz, const char *szDefaultValue = 0 ) override; - - virtual void AddParam( char *psz ) override; - virtual void RemoveParam( char *psz ) override; - - virtual int ParamCount() override; - virtual int FindParam( const char *psz ) override; - virtual const char *GetParam(int nIndex) override; -private: - CUtlVector m_params; -}; - - -void CCommandLine::CreateCommandLine( int argc, char **argv ) -{ - m_params.AppendTail(argv,argc); -} - -bool CCommandLine::CheckParam( const char *psz ) -{ - for (auto szParam: m_params) { - if (!V_strcmp(szParam, psz)) - { - return true; - } - } - return false; -} - -char *CCommandLine::ParamValue( const char *psz, const char *szDefaultValue ) -{ - int i = 0; - for (auto szParam: m_params) { - i++; - if (i>=m_params.GetSize()) - break; - if (!V_strcmp(szParam, psz)) - return m_params[i]; - } - return (char*)szDefaultValue; -} - -void CCommandLine::AddParam( char *psz ) -{ - m_params.AppendTail(psz); -} - -void CCommandLine::RemoveParam( char *psz ) -{ - -} -int CCommandLine::ParamCount() -{ - return m_params.GetSize(); -} -int CCommandLine::FindParam( const char *psz ) -{ - int i = 0; - for (auto szParam: m_params) { - if (!V_strcmp(szParam, psz)) - return i; - i++; - } - return 0; -} -const char *CCommandLine::GetParam(int nIndex) -{ - return m_params[nIndex]; -} - -ICommandLine *CommandLine() -{ - static CCommandLine s_CommandLine; - return &s_CommandLine; -} diff --git a/tier0/lib.cpp b/tier0/lib.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/tier0/mem.cpp b/tier0/mem.cpp deleted file mode 100644 index 10e445f..0000000 --- a/tier0/mem.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "tier0/mem.h" -#include "stdlib.h" -#include "tier0/platform.h" - -//----------------------------------------------------------------------------- -// These functions copy over libc memory functions -//----------------------------------------------------------------------------- - -void* V_malloc(int nSize) -{ - void *pMemory = malloc(nSize); - if (!pMemory) - Plat_FatalErrorFunc("Failed to allocate memory"); - return pMemory; -} - -void V_free(void *pMem) -{ - return free(pMem); -} - -void* V_realloc(void *pMem, int nSize) -{ - return realloc(pMem, nSize); -} - -void *operator new( size_t nCount ) -{ - return V_malloc(nCount); -} - -void *operator new ( size_t nCount, void *pPtr ) -{ - return pPtr; -} - -void operator delete( void *pMem ) noexcept -{ - return V_free(pMem); -} diff --git a/tier0/network.cpp b/tier0/network.cpp deleted file mode 100644 index cc32de6..0000000 --- a/tier0/network.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "tier0/network.h" - -void Net_Init() -{ -} - -void Net_Deinit() -{ - -} - diff --git a/tier0/platform.cpp b/tier0/platform.cpp deleted file mode 100644 index 41bf345..0000000 --- a/tier0/platform.cpp +++ /dev/null @@ -1,310 +0,0 @@ -#include "tier0/platform.h" -#include "tier0/lib.h" -#include "stdarg.h" -#include "unistd.h" -#include "sys/stat.h" -#include "dirent.h" -#include "time.h" -#include "signal.h" - -#ifdef __linux__ -#include "dlfcn.h" -#ifdef __GLIBC__ -#include "execinfo.h" -#endif -#endif -#ifdef __APPLE__ -#include "dlfcn.h" -#endif -#ifdef __WIN32__ -#include "windows.h" -#include "direct.h" -#endif - -PLATFORM_INTERFACE void Plat_FatalErrorFunc(const char* szFormat, ...) -{ - va_list list; - va_start(list, szFormat); - V_vprintf(szFormat, list); - va_end(list); - fflush(stdout); -#if defined(__WIN32__) - __debugbreak(); -#elif defined(__wasm32__) -#else - raise(SIGTRAP); -#endif - Plat_Exit(1); -} - -PLATFORM_INTERFACE void Plat_ListDirRecursive(const char* szPath, ListDirCallbackFn file, ListDirCallbackFn dir) -{ - struct dirent *entry; - DIR *dp = opendir(szPath); - - if (!dp) { - return; - } - - while ((entry = readdir(dp)) != NULL) { - char full_path[1024]; - if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) - continue; - - snprintf(full_path, sizeof(full_path), "%s/%s", szPath, entry->d_name); - - struct stat statbuf; - if (stat(full_path, &statbuf) == -1) { - continue; - } - - if (S_ISDIR(statbuf.st_mode)) { - if (dir) - dir(full_path); - Plat_ListDirRecursive(full_path, file, dir); - } else { - if (file) - file(full_path); - } - } - - closedir(dp); -} -PLATFORM_INTERFACE void Plat_ListDir(const char* szPath, ListDirCallbackFn file, ListDirCallbackFn dir) -{ - struct dirent *entry; - DIR *dp = opendir(szPath); - - if (!dp) { - return; - } - - while ((entry = readdir(dp)) != NULL) { - char full_path[1024]; - if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) - continue; - - snprintf(full_path, sizeof(full_path), "%s/%s", szPath, entry->d_name); - - struct stat statbuf; - if (stat(full_path, &statbuf) == -1) { - continue; - } - - if (S_ISDIR(statbuf.st_mode)) { - if (dir) - dir(full_path); - } else { - if (file) - file(full_path); - } - } - - closedir(dp); -} - -PLATFORM_INTERFACE char *Plat_GetExtension( const char *szPath ) -{ - char *last = (char*)szPath + V_strlen(szPath) - 1; - while (last != szPath) - { - if (*last=='.') - { - break; - }; - if (*last=='/') - { - return 0; - } - last--; - } - return last+1; -} -PLATFORM_INTERFACE void Plat_MakeDir( const char *szPath, int iPermissions ) -{ -#ifdef __WIN32__ - _mkdir(szPath); -#endif -#ifdef POSIX -#ifndef ACCESSPERMS -#define ACCESSPERMS 0777 -#endif - mkdir(szPath, ACCESSPERMS); -#endif -} - -PLATFORM_INTERFACE void Plat_Backtrace( void ) -{ -#ifdef __linux__ -#ifdef __GLIBC__ - void *buffer[64]; - int nptrs = backtrace(buffer, 64); - char **symbols = backtrace_symbols(buffer, nptrs); - - if (symbols == NULL) { - V_printf("Backtrace failed\n"); - exit(EXIT_FAILURE); - } - - for (int i = 0; i < nptrs; i++) { - V_printf(" [%d] %s\n", i, symbols[i]); - } - - free(symbols); -#endif -#endif -#ifdef __WIN32__ - /* - void* buffer[64]; - USHORT nptrs = CaptureStackBackTrace(0, 64, buffer, NULL); - - HANDLE process = GetCurrentProcess(); - SymInitialize(process, NULL, TRUE); - - SYMBOL_INFO* symbol = (SYMBOL_INFO*)calloc(sizeof(SYMBOL_INFO) + 256, 1); - symbol->MaxNameLen = 255; - symbol->SizeOfStruct = sizeof(SYMBOL_INFO); - - if (!symbol) { - V_printf("Backtrace failed\n"); - return; - } - - for (USHORT i = 0; i < nptrs; i++) { - if (SymFromAddr(process, (DWORD64)(buffer[i]), 0, symbol)) { - V_printf(" [%d] %s - 0x%0llX\n", i, symbol->Name, symbol->Address); - } else { - V_printf(" [%d] ??? - 0x%0llX\n", i, (DWORD64)(buffer[i])); - } - } - - free(symbol); - */ -#endif -}; - -PLATFORM_INTERFACE void *Plat_LoadLibrary( const char *psz ) -{ -#ifdef __linux__ - void *lib = dlopen(psz, RTLD_NOW); - if (!lib) - V_printf("Failed to open %s\n\t%s\n", psz, dlerror()); - return lib; -#endif -#ifdef __APPLE__ - void *lib = dlopen(psz, RTLD_GLOBAL | RTLD_NOW); - if (!lib) - V_printf("Failed to open %s\n\t%s\n", psz, dlerror()); - return lib; -#endif -#ifdef __WIN32__ - return LoadLibraryA(psz); -#endif -} -PLATFORM_INTERFACE void *Plat_GetProc( void *lib, const char *psz ) -{ -#ifdef __linux__ - return dlsym(lib, psz); -#endif -#ifdef __APPLE__ - return dlsym(lib, psz); -#endif -#ifdef __WIN32__ - return (void*)GetProcAddress((HMODULE)lib, psz); -#endif -} - -PLATFORM_INTERFACE void Plat_SetEnv( const char *szVar, const char *psz ) -{ -#ifdef POSIX - setenv(szVar, psz, true); -#endif -#ifdef __WIN32__ - SetEnvironmentVariable(szVar, psz); -#endif -} - -PLATFORM_INTERFACE const char *Plat_GetEnv( const char *szVar ) -{ - return getenv(szVar); -} - - -PLATFORM_INTERFACE void Plat_SetWorkingDir( const char *psz ) -{ - chdir(psz); -} -#ifndef MAX_PATH -#define MAX_PATH 4096 -#endif - -PLATFORM_INTERFACE const char *Plat_GetWorkingDir( void ) -{ - static char szCwd[MAX_PATH]; - getcwd(szCwd, MAX_PATH); - return szCwd; -} - - -static char s_szExecutablePath[MAX_PATH]; -#ifdef __linux__ -static ssize_t s_iExecutablePathSize = readlink("/proc/self/exe", s_szExecutablePath, MAX_PATH); -#endif - -PLATFORM_INTERFACE const char *Plat_GetExecutablePath( void ) -{ - return s_szExecutablePath; -} -PLATFORM_INTERFACE const char *Plat_GetParentDir( const char *psz ) -{ -} - -PLATFORM_INTERFACE void Plat_UnloadLibrary( void *lib ) -{ -#ifdef __linux__ - dlclose(lib); -#endif -#ifdef __WIN32__ - FreeLibrary((HMODULE)lib); -#endif -}; - -PLATFORM_INTERFACE double Plat_GetTime( void ) -{ -#ifndef __WIN32__ - struct timespec tp; - clock_gettime(CLOCK_MONOTONIC, &tp); - static time_t s_starttime = tp.tv_sec; - - return (tp.tv_sec-s_starttime)+tp.tv_nsec/1e9; -#else - static LARGE_INTEGER s_startcount; - static LARGE_INTEGER s_frequency; - static int s_initialized = 0; - - LARGE_INTEGER tp; - - if (!s_initialized) { - QueryPerformanceFrequency(&s_frequency); - QueryPerformanceCounter(&s_startcount); - s_initialized = 1; - } - - QueryPerformanceCounter(&tp); - - return (double)(tp.QuadPart - s_startcount.QuadPart) / s_frequency.QuadPart; -#endif -} - -PLATFORM_INTERFACE void Plat_Exit( int status ) -{ -#ifdef __linux__ - _exit(status); -#endif -#ifdef __APPLE__ - _exit(status); -#endif -#ifdef __WIN32__ - _exit(status); -#endif -}; diff --git a/tier0/rand.cpp b/tier0/rand.cpp deleted file mode 100644 index 764d1b1..0000000 --- a/tier0/rand.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "tier0/rand.h" -#include "tier0/lib.h" - -static bool b_sIsRandInit = false; -static FILE *s_pURandom = NULL; - -PLATFORM_INTERFACE void Plat_InitRandom() -{ - if (b_sIsRandInit) - return; - s_pURandom = V_fopen("/dev/urandom","rb"); - if (!s_pURandom) - Plat_FatalErrorFunc("/dev/urandom wasn't found somehow\n"); - b_sIsRandInit = true; -} - -PLATFORM_INTERFACE void Plat_ShutdownRandom() -{ - b_sIsRandInit = false; -} - -PLATFORM_INTERFACE void Plat_URandom( size_t uBufferSize, uint8_t *szBuffer ) -{ - if (!b_sIsRandInit) - Plat_InitRandom(); - - V_fread(szBuffer, 1, uBufferSize, s_pURandom); -} - diff --git a/tier1/__build.cpp b/tier1/__build.cpp deleted file mode 100644 index 14422e5..0000000 --- a/tier1/__build.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "helper.h" -#include "c.h" -#include "ld.h" -#include "tier1/utlstring.h" -#include "tier1/commandline.h" - -CUtlVector tier1_CompiledFiles = { - "tier1/interface.cpp", - "tier1/appinit.cpp", - "tier1/commandline.cpp", - "tier1/utlbuffer.cpp", - "tier1/utlmap.cpp", - "tier1/utlstring.cpp", - "tier1/utlvector.cpp", -}; -CUtlString tier1_lib; - -DECLARE_BUILD_STAGE(tier1) -{ - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - - compileProject.m_szName = "tier1"; - compileProject.files = tier1_CompiledFiles; - compileProject.includeDirectories = all_IncludeDirectories; - compileProject.bFPIC = true; - ldProject = ccompiler->Compile(&compileProject); - ldProject.linkType = ELINK_STATIC_LIBRARY; - - CUtlString outputProject = linker->Link(&ldProject); - tier1_lib = outputProject; - - return 0; -}; diff --git a/tier1/appinit.cpp b/tier1/appinit.cpp deleted file mode 100644 index 805aa0a..0000000 --- a/tier1/appinit.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "tier1/appinit.h" -#include "tier1/utlstring.h" -#include "tier0/platform.h" - -void AppInitializePath() -{ - const char *szPath = Plat_GetExecutablePath(); - CUtlString szEnv = Plat_GetEnv("PATH"); - printf("%s\n",szEnv.GetString()); - szEnv.AppendTail(":"); - szEnv.AppendTail(szPath); - Plat_SetEnv("PATH", szEnv); -} diff --git a/tier1/build.cpp b/tier1/build.cpp deleted file mode 100644 index 7287323..0000000 --- a/tier1/build.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include "helper.h" -#include "c.h" -#include "ld.h" -#include "tier1/utlstring.h" - -CUtlVector tier1_CompiledFiles = { - "interface.cpp", - "appinit.cpp", - "utlbuffer.cpp", - "utlmap.cpp", - "utlstring.cpp", - "utlvector.cpp", -}; - -DECLARE_BUILD_STAGE(tier1) -{ - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - - compileProject.m_szName = "tier1"; - compileProject.files = tier1_CompiledFiles; - compileProject.includeDirectories = {"../public"}; - compileProject.bFPIC = true; - ldProject = ccompiler->Compile(&compileProject); - ldProject.linkType = ELINK_STATIC_LIBRARY; - - CUtlString szOutputDir = linker->Link(&ldProject); - - ADD_OUTPUT_OBJECT("tier1", szOutputDir) - - return 0; -}; diff --git a/tier1/interface.cpp b/tier1/interface.cpp deleted file mode 100644 index 286e737..0000000 --- a/tier1/interface.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include "tier1/interface.h" -#include "tier1/utlvector.h" -#include "tier1/utlstring.h" -#include "dlfcn.h" - -static CInterfaceRegistry *s_pInterfaceRegistries; - -CInterfaceRegistry::CInterfaceRegistry( InstantiateInterfaceFn fn, const char *szName ) - : m_szName(szName) -{ - m_CreateFn = fn; - m_pNext = s_pInterfaceRegistries; - s_pInterfaceRegistries = this; - Dl_info info = {}; - dladdr((void *)&s_pInterfaceRegistries, &info); - //printf("%p: %s in %s\n",&s_pInterfaceRegistries, m_szName, info.dli_fname); -}; - -DLL_EXPORT void *CreateInterface( const char *szName, int *pReturnCode ) -{ - CInterfaceRegistry *pRegistry = s_pInterfaceRegistries; - while (pRegistry) - { - if (!V_strcmp(szName, pRegistry->m_szName)) - { - if (pReturnCode) - *pReturnCode = 0; - return pRegistry->m_CreateFn(); - } - pRegistry = pRegistry->m_pNext; - } - if (pReturnCode) - *pReturnCode = 1; - return 0; -} - -CreateInterfaceFn Sys_GetFactory( void *lib ) -{ - return (CreateInterfaceFn)Plat_GetProc(lib, "CreateInterface"); -} -CreateInterfaceFn Sys_GetFactory( const char *szLibrary ) -{ - void *pLib = NULL; - CUtlString szLib = szLibrary; -#if defined(__linux) - szLib = CUtlString("lib%s.so", szLib.GetFileName().GetString()); - pLib = Plat_LoadLibrary(szLib); -#endif - if ( !pLib ) - return NULL; - return Sys_GetFactory(pLib); -} diff --git a/tier1/utlbuffer.cpp b/tier1/utlbuffer.cpp deleted file mode 100644 index 4c24633..0000000 --- a/tier1/utlbuffer.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "tier1/utlbuffer.h" \ No newline at end of file diff --git a/tier1/utlmap.cpp b/tier1/utlmap.cpp deleted file mode 100644 index 64d632c..0000000 --- a/tier1/utlmap.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "tier1/utlmap.h" \ No newline at end of file diff --git a/tier1/utlmutex.cpp b/tier1/utlmutex.cpp deleted file mode 100644 index 8844e28..0000000 --- a/tier1/utlmutex.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "tier1/utlmutex.h" -#include "pthread.h" - -CUtlLock::CUtlLock() -{ - pthread_mutex_init(&m_lock); -}; - -CUtlLock::~CUtlLock() -{ - -}; - -void CUtlLock::Lock() -{ - -}; - -void CUtlLock::Unlock() -{ - -}; diff --git a/tier1/utlstring.cpp b/tier1/utlstring.cpp deleted file mode 100644 index 18a3f95..0000000 --- a/tier1/utlstring.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "tier1/utlstring.h" - diff --git a/tier1/utlvector.cpp b/tier1/utlvector.cpp deleted file mode 100644 index 5af842f..0000000 --- a/tier1/utlvector.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "tier1/utlvector.h" \ No newline at end of file diff --git a/tier2/__build.cpp b/tier2/__build.cpp deleted file mode 100644 index bbb42ee..0000000 --- a/tier2/__build.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "helper.h" -#include "c.h" -#include "ld.h" -#include "tier1/utlstring.h" -#include "tier1/commandline.h" - -CUtlVector tier2_CompiledFiles = { - "fileformats/ini.cpp", - "fileformats/json.cpp", - "filesystem.cpp", - "filesystem_libc.cpp", -}; -CUtlString tier2_lib; - -DECLARE_BUILD_STAGE(tier2) -{ - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - - compileProject.m_szName = "tier2"; - compileProject.files = tier2_CompiledFiles; - compileProject.includeDirectories = all_IncludeDirectories; - compileProject.bFPIC = true; - ldProject = ccompiler->Compile(&compileProject); - ldProject.linkType = ELINK_STATIC_LIBRARY; - - CUtlString outputProject = linker->Link(&ldProject); - tier2_lib = outputProject; - - return 0; -}; diff --git a/tier2/build.cpp b/tier2/build.cpp deleted file mode 100644 index 3cd95df..0000000 --- a/tier2/build.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "helper.h" -#include "c.h" -#include "ld.h" -#include "tier1/utlstring.h" - -CUtlVector tier2_CompiledFiles = { - "fileformats/ini.cpp", - "fileformats/json.cpp", - "fileformats/xml.cpp", - "fileformats/plist.cpp", - "tokenizer.cpp", - "filesystem.cpp", -}; - - -DECLARE_BUILD_STAGE(tier2) -{ - CProject_t compileProject = {}; - LinkProject_t ldProject = {}; - - compileProject.m_szName = "tier2"; - compileProject.files = tier2_CompiledFiles; - compileProject.includeDirectories = {"../public"}; - compileProject.bFPIC = true; - ldProject = ccompiler->Compile(&compileProject); - ldProject.linkType = ELINK_STATIC_LIBRARY; - - CUtlString szOutputProject = linker->Link(&ldProject); - - ADD_OUTPUT_OBJECT("tier2", szOutputProject) - - return 0; -}; diff --git a/tier2/fileformats/ini.cpp b/tier2/fileformats/ini.cpp deleted file mode 100644 index 33c83cb..0000000 --- a/tier2/fileformats/ini.cpp +++ /dev/null @@ -1,335 +0,0 @@ - -#include "tier2/fileformats/ini.h" -#include "tier0/platform.h" -#include "tier1/utlstring.h" -#include "tier1/utlvector.h" -#include "tier0/lib.h" -#include "tier2/ifilesystem.h" - -enum ESectionType -{ - SECTIONTYPE_STRING, - SECTIONTYPE_BOOLEAN, - SECTIONTYPE_FLOAT, -}; - - -struct SectionData_t -{ - ESectionType m_eSectionType; - CUtlString m_szKey; - - bool m_bData; - float m_fData; - CUtlString m_szData; -}; - -abstract_class CINISection: public IINISection -{ -public: - virtual bool GetBoolValue( const char *szKeyName ) override; - virtual int GetIntValue( const char *szKeyName ) override; - virtual const char *GetStringValue( const char *szKeyName ) override; - virtual CUtlString GetUTLStringValue( const char *szKeyName ) override; - - CUtlVector m_values; - CUtlString m_szSectionName; -}; - -bool CINISection::GetBoolValue( const char *szKeyName ) -{ - -} - -int CINISection::GetIntValue( const char *szKeyName ) -{ - -} - -const char *CINISection::GetStringValue( const char *szKeyName ) -{ - for (auto &value: m_values) - { - if (value->m_szKey == szKeyName) - return value->m_szData; - } - return 0; -} - -CUtlString CINISection::GetUTLStringValue( const char *szKeyName ) -{ - for (auto &value: m_values) - { - if (value->m_szKey == szKeyName) - return value->m_szData; - } - return 0; -} - -class CINIFile: public IINIFile -{ -public: - virtual IINISection *GetSection( const char *szSectionName ) override; - - CUtlVector m_sections; -}; - -IINISection *CINIFile::GetSection( const char *szSectionName ) -{ - for ( auto §ion: m_sections ) - { - if ( section->m_szSectionName == szSectionName ) - return (IINISection*)section; - } - return 0; -} - - -class CINIManager: public IINIManager -{ -public: - virtual IINIFile *ReadFile( const char *psz ) override; - virtual IINIFile *ReadString( const char *psz ) override; - virtual void ReleaseFile( IINIFile *pFile ) override; - bool IsWordSymbol( char c ); - CUtlVector TokenizeString(); -}; -IINIFile *CINIManager::ReadFile( const char *psz ) -{ - IFileHandle *pFile; - const char *szData; - - pFile = filesystem->Open(psz, FILEMODE_READ); - if (!pFile) - return NULL; - szData = filesystem->ReadString(pFile); - filesystem->Close(pFile); - - return ReadString(szData); -} - -IINIFile *CINIManager::ReadString( const char *psz ) -{ - CINIFile *pFile = new CINIFile; - *pFile = {}; - bool bIsQuoted = false; - bool bIsSlash = false; - - bool bIsVarName; - bool bIsVarValue; - bool bIsSectionName; - - CINISection *pCurrentSection = 0; - SectionData_t *pCurrentSectionData = 0; - size_t i = 0; - - char c; - - CUtlString szStringValue; - - CUtlVector tokens; - uint32_t nCurrentLine = 0; - - while (true) - { - c = psz[i]; - i++; - if (c == '\0') - break; - if (c == '\n') - nCurrentLine++; - - - if (bIsQuoted) - { - // text within "" - if (bIsSlash) - { - // reading \n \t etc. - bIsSlash = false; - switch (c) - { - case '\\': - szStringValue.AppendTail('\\'); - continue; - case '"': - szStringValue.AppendTail('"'); - continue; - case 'n': - szStringValue.AppendTail('\n'); - continue; - case 't': - szStringValue.AppendTail('\t'); - continue; - // allow for strings to go to next line with by ending with backward slash - case '\n': - szStringValue.AppendTail('\n'); - continue; - default: - szStringValue.AppendTail(c); - continue; - } - } else { - // react to special symbols witin a string - switch (c) - { - - // enables reading \n \t etc. - case '\\': - bIsSlash = true; - continue; - - case '\n': - // newline - // we do want to end it to prevent parsing errors - // and there is no standart - V_printf("line %i: new line was found but the string wasn't finished, did you forget to place \" in the end of the line?\n", nCurrentLine); - case '"': - // end string - bIsQuoted = false; - if (szStringValue == 0) - continue; - tokens.AppendTail(szStringValue); - szStringValue = 0; - continue; - default: - szStringValue.AppendTail(c); - continue; - } - } - - } else { - // " makes it use a string - if (c == '"') - { - bIsQuoted = true; - } - - if (IsWordSymbol(c)) - { - szStringValue.AppendTail(c); - continue; - } else { - if (szStringValue != 0) - tokens.AppendTail(szStringValue); - szStringValue = 0; - if (V_isgraph(c) && c != '"') - tokens.AppendTail(CUtlString("%c", c)); - } - } - }; - - - // tokenize - // shitty tokenize - // must be reworked - for ( int i = 0; i < tokens.GetSize(); i++ ) - { - if (tokens[i] == "]") - { - V_printf("Error: unexpected ]\n"); - return pFile; - } - if (tokens[i] == "[") - { - i++; - if (i>=tokens.GetSize()) - { - V_printf("Error: Trailing section start\n"); - return pFile; - } - - pCurrentSection = (CINISection*)pFile->GetSection(tokens[i]); - if (!pCurrentSection) - { - pCurrentSection = new CINISection; - *pCurrentSection = {}; - pFile->m_sections.AppendTail(pCurrentSection); - } - pCurrentSection->m_szSectionName = tokens[i]; - - i++; - if (i>=tokens.GetSize()) - { - V_printf("Error: Trailing section name\n"); - return pFile; - } - if (tokens[i] != "]") - { - V_printf("Error: expected ]\n"); - return pFile; - } - continue; - } - if (!pCurrentSection) - { - V_printf("Error: section wasn't specified\n"); - return pFile; - } - if (tokens[i] == "=") - { - V_printf("Error: expected key\n"); - return pFile; - } - - pCurrentSectionData = new SectionData_t; - pCurrentSectionData->m_eSectionType = SECTIONTYPE_STRING; - pCurrentSectionData->m_szKey = tokens[i]; - - i++; - if (i>=tokens.GetSize()) - { - V_printf("Error: trailing key\n"); - delete pCurrentSectionData; - return pFile; - } - if (tokens[i] != "=") - { - V_printf("Error: expected =\n"); - delete pCurrentSectionData; - return pFile; - } - - i++; - - if (i>=tokens.GetSize()) - { - V_printf("Error: expected value\n"); - delete pCurrentSectionData; - return pFile; - } - pCurrentSectionData->m_szData = tokens[i]; - - pCurrentSection->m_values.AppendTail(pCurrentSectionData); - } - return (IINIFile*)pFile; -} - -void CINIManager::ReleaseFile( IINIFile *pFile ) -{ - delete (CINIFile*)pFile; -} - -bool CINIManager::IsWordSymbol( char c ) -{ - if (V_isalnum(c)) - return true; - switch (c) - { - case '-': - case '_': - case '.': - return true; - default: - return false; - } -} - -CUtlVector TokenizeString(); - -IINIManager *INIManager() -{ - static CINIManager manager; - return &manager; -} - diff --git a/tier2/fileformats/json.cpp b/tier2/fileformats/json.cpp deleted file mode 100644 index f183c4d..0000000 --- a/tier2/fileformats/json.cpp +++ /dev/null @@ -1,559 +0,0 @@ -#include "tier2/fileformats/json.h" -#include "tier2/tokenizer.h" - -abstract_class CJSONArray: public IJSONArray -{ -public: - virtual uint32_t GetCount() override; - virtual IJSONValue *GetParameter( uint32_t i ) override; - - virtual void SetArray( uint32_t uCount, IJSONValue **ppValues ) override; - - virtual void CopyTo( IJSONArray *pObject ) override; - virtual void Free() override; - - CUtlVector m_values; -}; - -uint32_t CJSONArray::GetCount() -{ - return m_values.GetSize(); -} - -IJSONValue *CJSONArray::GetParameter( uint32_t i ) -{ - return m_values[i]; -} - - -void CJSONArray::SetArray( uint32_t uCount, IJSONValue **ppValues ) -{ - m_values.Resize(uCount); - for ( uint32_t u = 0; u < uCount; u++) - m_values[u] = ppValues[u]; -} - -void CJSONArray::CopyTo( IJSONArray *pObject ) -{ - -} - -void CJSONArray::Free() -{ - for ( auto &value: m_values) - JSONManager()->FreeValue(value); - m_values = {}; -} - -abstract_class CJSONValue: public IJSONValue -{ -public: - virtual EJSONParameterType GetType( void ) override; - virtual const char *GetStringValue() override; - virtual float GetNumberValue() override; - virtual bool GetBooleanValue() override; - virtual IJSONArray *GetArray() override; - virtual IJSONObject *GetObject() override; - - virtual void MakeNULL() override; - virtual void SetStringValue( const char *szString ) override; - virtual void SetNumberValue( float fValue ) override; - virtual void SetBooleanValue( bool bValue ) override; - virtual void SetArrayValue( IJSONArray *pValue ) override; - virtual void SetObjectValue( IJSONObject *pValue ) override; - - virtual void CopyTo( IJSONValue *pObject ) override; - virtual void Free() override; - - EJSONParameterType m_eType; - CUtlString m_szString; - float m_fValue; - bool m_bValue; - IJSONArray *m_pArray; - IJSONObject *m_pObject; -}; - -EJSONParameterType CJSONValue::GetType( void ) -{ - return m_eType; -} - -const char * CJSONValue::GetStringValue() -{ - return m_szString; -} - -float CJSONValue::GetNumberValue() -{ - return m_fValue; -} - -bool CJSONValue::GetBooleanValue() -{ - return m_fValue; -} - -IJSONArray *CJSONValue::GetArray() -{ - return m_pArray; -} - -IJSONObject *CJSONValue::GetObject() -{ - return m_pObject; -} - - -void CJSONValue::MakeNULL() -{ - if ( GetType() == JSON_PARAMETER_OBJECT ) - { - JSONManager()->FreeObject(m_pObject); - m_pObject = NULL; - } - if ( GetType() == JSON_PARAMETER_ARRAY ) - { - - JSONManager()->FreeArray(m_pArray); - m_pArray = NULL; - } - if ( GetType() == JSON_PARAMETER_STRING ) - m_szString = NULL; -} - -void CJSONValue::SetStringValue( const char *szString ) -{ - MakeNULL(); - m_eType = JSON_PARAMETER_STRING; - m_szString = szString; -} - -void CJSONValue::SetNumberValue( float fValue ) -{ - MakeNULL(); - m_eType = JSON_PARAMETER_NUMBER; - m_fValue = fValue; -} - -void CJSONValue::SetBooleanValue( bool bValue ) -{ - MakeNULL(); - m_eType = JSON_PARAMETER_BOOLEAN; -} - -void CJSONValue::SetArrayValue( IJSONArray *pValue ) -{ - MakeNULL(); - m_eType = JSON_PARAMETER_ARRAY; - m_pArray = pValue; -} - -void CJSONValue::SetObjectValue( IJSONObject *pValue ) -{ - MakeNULL(); - m_eType = JSON_PARAMETER_OBJECT; - m_pObject = pValue; -} - - -void CJSONValue::CopyTo( IJSONValue *pObject ) -{ - MakeNULL(); -} - -void CJSONValue::Free() -{ - MakeNULL(); -} - - -abstract_class CJSONObject: public IJSONObject -{ -public: - virtual IJSONValue *GetValue( const char *szName ) override; - virtual void SetValue( const char *szName, IJSONValue *pValue ) override; - - virtual void CopyTo( IJSONObject *pObject ) override; - virtual void Free() override; - - struct JSONObjectParam_t - { - CUtlString m_szName; - IJSONValue *m_pValue; - }; - CUtlVector m_params; -}; - -IJSONValue *CJSONObject::GetValue( const char *szName ) -{ - int i; - JSONObjectParam_t *pParam; - for ( i = 0; i < m_params.GetSize(); i++ ) - { - if ( m_params[i].m_szName != szName ) - continue; - return m_params[i].m_pValue; - } - return NULL; - -} - -void CJSONObject::SetValue( const char *szName, IJSONValue *pValue ) -{ - int i; - JSONObjectParam_t *pParam; - for ( i = 0; i < m_params.GetSize(); i++ ) - { - if ( m_params[i].m_szName != szName ) - continue; - - - // Scary - if ( pValue == NULL ) - m_params.RemoveAt(i); - else - m_params[i].m_pValue = pValue; - return; - } - if ( pValue == NULL ) - return; - m_params.AppendTail({szName, pValue}); -} - - -void CJSONObject::CopyTo( IJSONObject *pObject ) -{ - -} - -void CJSONObject::Free() -{ - for ( auto ¶m: m_params ) - { - JSONManager()->FreeValue(param.m_pValue); - } -} - -abstract_class CJSONManager: public IJSONManager -{ -public: - virtual IJSONObject *CreateObject( ) override; - virtual void FreeObject( IJSONObject *pObject ) override; - virtual IJSONArray *CreateArray( ) override; - virtual void FreeArray( IJSONArray *pArray ) override; - virtual IJSONValue *CreateValue( ) override; - virtual void FreeValue( IJSONValue *pValue ) override; - - virtual IJSONValue *ReadString( const char *szString ) override; - virtual CUtlString WriteString( IJSONValue *pValue ) override; - -private: - CUtlString RealWriteString( IJSONValue *pValue, uint32_t uOffest ); - CUtlString GetAsJsonString( CUtlString szString ); - - static bool ExpectedToken( Token_t &token, const char *szValue ); - static CUtlString GetQuotedToken( Token_t &token ); - IJSONObject *ParseObject( Token_t *&pToken, const Token_t *pEnding ); - IJSONArray *ParseArray( Token_t *&pToken, const Token_t *pEnding ); - IJSONValue *ParseValue( Token_t *&pToken, const Token_t *pEnding ); -}; - -IJSONObject *CJSONManager::CreateObject( ) -{ - return new CJSONObject; -} - -void CJSONManager::FreeObject( IJSONObject *pObject ) -{ - pObject->Free(); - delete (CJSONObject*)pObject; -} - -IJSONArray *CJSONManager::CreateArray( ) -{ - return new CJSONArray; -} - -void CJSONManager::FreeArray( IJSONArray *pArray ) -{ - pArray->Free(); - delete (CJSONObject*)pArray; -} - -IJSONValue *CJSONManager::CreateValue( ) -{ - return new CJSONValue; -} - -void CJSONManager::FreeValue( IJSONValue *pValue ) -{ - pValue->Free(); - delete (CJSONValue*)pValue; -} - -#define NEXT_TOKEN() \ -pToken++; \ -if (pToken == pEnding) \ - goto eof \ - -bool CJSONManager::ExpectedToken( Token_t &token, const char *szValue ) -{ - if ( token.m_szValue == szValue && !token.m_bIsQuoted ) - return true; - return false; -} -CUtlString CJSONManager::GetQuotedToken( Token_t &token ) -{ - if ( token.m_bIsQuoted ) - return token.m_szValue; - return NULL; -} - -IJSONObject *CJSONManager::ParseObject( Token_t *&pToken, const Token_t *pEnding ) -{ - IJSONObject *pObject; - CUtlString szParamName; - IJSONValue *pValue; - - if ( !ExpectedToken(*(pToken), "{") ) - return NULL; - NEXT_TOKEN(); - pObject = CreateObject(); - - // object might be empty - if ( ExpectedToken(*pToken, "}") ) - { - NEXT_TOKEN(); - return pObject; - } - - while(true) - { - szParamName = NULL; - pValue = NULL; - if ( GetQuotedToken(*pToken) == NULL ) - goto not_quoted; - - szParamName = pToken->m_szValue; - NEXT_TOKEN(); - - if ( !ExpectedToken(*pToken, ":") ) - goto not_colon; - NEXT_TOKEN(); - - pValue = ParseValue(pToken, pEnding); - pObject->SetValue(szParamName, pValue); - - if ( !ExpectedToken(*pToken, ",") ) - { - if ( !ExpectedToken(*pToken, "}") ) - { - goto not_comma; - } - return pObject; - } - NEXT_TOKEN(); - } - return pObject; -not_comma: - V_printf("%i: comma (,) or } was expected but got %s\n", pToken->m_iLine, pToken->m_szValue.GetString()); - return NULL; -not_colon: - V_printf("%i: colon (:) was expected but got %s\n", pToken->m_iLine, pToken->m_szValue.GetString()); - return NULL; - -not_quoted: - V_printf("%s was not quoted\n", szParamName.GetString()); - return NULL; - -eof: - V_printf("EOF\n"); - return NULL; -} - -IJSONArray *CJSONManager::ParseArray( Token_t *&pToken, const Token_t *pEnding ) -{ - IJSONArray *pObject; - CUtlString szParamName; - IJSONValue *pValue; - CUtlVector values; - - if ( !ExpectedToken(*(pToken), "[") ) - return NULL; - NEXT_TOKEN(); - pObject = CreateArray(); - - // object might be empty - if ( ExpectedToken(*pToken, "]") ) - { - NEXT_TOKEN(); - return pObject; - } - - while(true) - { - pValue = ParseValue(pToken, pEnding); - values.AppendTail(pValue); - - if ( !ExpectedToken(*pToken, ",") ) - { - if ( !ExpectedToken(*pToken, "]") ) - { - goto not_comma; - } - - pObject->SetArray(values.GetSize(), values.GetData()); - return pObject; - } - NEXT_TOKEN(); - } - return pObject; -not_comma: - V_printf("%i: comma (,) or } was expected but got %s\n", pToken->m_iLine, pToken->m_szValue.GetString()); - return NULL; - -eof: - V_printf("EOF\n"); - pObject->SetArray(values.GetSize(), values.GetData()); - return pObject; -} - -IJSONValue *CJSONManager::ParseValue( Token_t *&pToken, const Token_t *pEnding ) -{ - IJSONObject *pObject = ParseObject(pToken, pEnding); - IJSONArray *pArray = ParseArray(pToken, pEnding); - IJSONValue *pValue = CreateValue(); - if (pObject) - { - pValue->SetObjectValue(pObject); - return pValue; - } - if (pArray) - { - pValue->SetArrayValue(pArray); - return pValue; - } - if ( GetQuotedToken(*pToken) != NULL ) - { - pValue->SetStringValue(pToken->m_szValue); - NEXT_TOKEN(); - return pValue; - } - return NULL; -eof: - V_printf("EOF\n"); - return NULL; -} - - -IJSONValue *CJSONManager::ReadString( const char *psz ) -{ - CUtlVector tokens; - CUtlVector stack; - IJSONValue *pGlobalObject = NULL; - - tokens = Tokenize(psz); - Token_t *pCurrentToken = tokens.GetData(); - pGlobalObject = ParseValue(pCurrentToken, tokens.end().m_pCurrent); - - return pGlobalObject; -}; - -CUtlString CJSONManager::WriteString( IJSONValue *pValue ) -{ - return RealWriteString(pValue, 0); -} -CUtlString CJSONManager::GetAsJsonString( CUtlString szString ) -{ - CUtlString szOut = "\""; - for ( int i = 0; i < szString.GetLenght(); i++ ) - { - char c = szString[i]; - switch (c) - { - case '\"': - szOut.AppendTail("\\\""); - break; - case '\n': - szOut.AppendTail("\\n"); - break; - case '\r': - szOut.AppendTail("\\r"); - break; - case '\t': - szOut.AppendTail("\\t"); - break; - case '\\': - szOut.AppendTail("\\\\"); - break; - default: - szOut.AppendTail(c); - break; - } - }; - szOut.AppendTail("\""); - return szOut; -} - -CUtlString CJSONManager::RealWriteString( IJSONValue *pValue, uint32_t uOffset ) -{ - IJSONArray *pArray; - CJSONObject *pObject; - CUtlString szString = ""; - if (pValue) - switch (pValue->GetType()) - { - case JSON_PARAMETER_NULL: - return CUtlString("null", pValue->GetNumberValue()); - case JSON_PARAMETER_BOOLEAN: - if (pValue->GetBooleanValue()) - return "true"; - return "false"; - case JSON_PARAMETER_NUMBER: - return CUtlString("%f", pValue->GetNumberValue()); - case JSON_PARAMETER_STRING: - return GetAsJsonString(pValue->GetStringValue()); - case JSON_PARAMETER_ARRAY: - pArray = pValue->GetArray(); - szString.AppendTail("[\n"); - for ( uint32_t i = 0; i < pArray->GetCount(); i++ ) - { - for ( uint32_t j = 0; j <= uOffset; j++) - szString.AppendTail("\t"); - szString.AppendTail(RealWriteString( pArray->GetParameter(i), uOffset+1 )); - if ( i != pArray->GetCount() - 1 ) - szString.AppendTail(","); - szString.AppendTail("\n"); - } - for ( uint32_t j = 0; j < uOffset; j++) - szString.AppendTail("\t"); - szString.AppendTail("]"); - return szString; - case JSON_PARAMETER_OBJECT: - pObject = (CJSONObject*)pValue->GetObject(); - szString.AppendTail("{\n"); - for ( uint32_t i = 0; i < pObject->m_params.GetSize(); i++ ) - { - for ( uint32_t j = 0; j <= uOffset; j++) - szString.AppendTail("\t"); - - szString.AppendTail(GetAsJsonString(pObject->m_params[i].m_szName)); - szString.AppendTail(": "); - - szString.AppendTail(RealWriteString( pObject->m_params[i].m_pValue, uOffset+1 )); - if ( i != pObject->m_params.GetSize() - 1 ) - szString.AppendTail(","); - szString.AppendTail("\n"); - } - for ( uint32_t j = 0; j < uOffset; j++) - szString.AppendTail("\t"); - szString.AppendTail("}"); - return szString; - } -} - -IJSONManager *JSONManager() -{ - static CJSONManager mgr; - return &mgr; -} diff --git a/tier2/fileformats/plist.cpp b/tier2/fileformats/plist.cpp deleted file mode 100644 index 039a823..0000000 --- a/tier2/fileformats/plist.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include "tier2/fileformats/xml.h" -#include "tier2/fileformats/plist.h" - -class CPropertyListManager: public IPropertyListManager -{ -public: - IJSONObject *ReadDict( IXMLObject *pDict ); - virtual IJSONObject *ReadString( const char *psz ) override; -}; - -IJSONObject *CPropertyListManager::ReadString( const char *psz ) -{ - XMLFile_t file = XMLManager()->ReadString(psz); - IJSONObject *pObject; - - IXMLObject *pList = file.m_pRoot->FindFirstTag(file.m_szRootObjectName); - if (pList == NULL) - return NULL; - - IXMLObject *pDict = pList->FindFirstTag("dict"); - if (pDict == NULL) - return NULL; - - - pObject = ReadDict(pDict); - return pObject; -} -IJSONObject *CPropertyListManager::ReadDict( IXMLObject *pDict ) -{ - CUtlString szKeyToCreate = NULL; - IJSONObject *pObject = JSONManager()->CreateObject(); - for ( auto &c: pDict->GetChildren() ) - { - if (c->GetType() != XML_OBJECT_ELEMENT) - continue; - if ( !V_strcmp(c->GetValue(), "key")) - { - szKeyToCreate = c->GetChildren()[0]->GetValue(); - } - if ( !V_strcmp(c->GetValue(), "string") || !V_strcmp(c->GetValue(), "data") ) - { - if ( szKeyToCreate == NULL ) - continue; - IJSONValue *pVal = JSONManager()->CreateValue(); - if (c->GetChildren().GetSize()>0) - pVal->SetStringValue(c->GetChildren()[0]->GetValue()); - else - pVal->SetStringValue(""); - pObject->SetValue(szKeyToCreate, pVal); - szKeyToCreate = NULL; - } - if ( !V_strcmp(c->GetValue(), "integer") ) - { - if ( szKeyToCreate == NULL ) - continue; - IJSONValue *pVal = JSONManager()->CreateValue(); - if (c->GetChildren().GetSize()>0) - pVal->SetNumberValue(atol(c->GetChildren()[0]->GetValue())); - else - pVal->SetNumberValue(0); - pObject->SetValue(szKeyToCreate, pVal); - szKeyToCreate = NULL; - } - if ( !V_strcmp(c->GetValue(), "dict")) - { - if ( szKeyToCreate == NULL ) - continue; - IJSONValue *pVal = JSONManager()->CreateValue(); - pVal->SetObjectValue(ReadDict(c)); - pObject->SetValue(szKeyToCreate, pVal); - szKeyToCreate = NULL; - } - } - return pObject; -} - -IPropertyListManager *PropertyListManager() -{ - static CPropertyListManager mgr = {}; - return &mgr; -} diff --git a/tier2/fileformats/xml.cpp b/tier2/fileformats/xml.cpp deleted file mode 100644 index d3cc753..0000000 --- a/tier2/fileformats/xml.cpp +++ /dev/null @@ -1,420 +0,0 @@ -#include "tier2/fileformats/xml.h" -#include "tier2/tokenizer.h" - -class CXMLObject: public IXMLObject -{ -public: - virtual EXMLObjectType GetType() override; - virtual const char *GetValue() override; - virtual void SetType( EXMLObjectType eType ) override; - virtual void SetValue( const char *psz ) override; - virtual CUtlVector &GetChildren() override; - virtual CUtlVector &GetParams() override; - virtual void Free() override; - - EXMLObjectType m_eType; - CUtlString m_szValue; - CUtlVector m_children; - CUtlVector m_params; -}; - -EXMLObjectType CXMLObject::GetType() -{ - return m_eType; -} - -const char *CXMLObject::GetValue() -{ - return m_szValue.GetString(); -} - -void CXMLObject::SetType( EXMLObjectType eType ) -{ - m_eType = eType; -} - -void CXMLObject::SetValue( const char *psz ) -{ - m_szValue = psz; -} - - -CUtlVector &CXMLObject::GetChildren() -{ - return m_children; -} - -CUtlVector &CXMLObject::GetParams() -{ - return m_params; -} - -void CXMLObject::Free() -{ - -} - - -class CXMLManager: public IXMLManager -{ -public: - virtual XMLFile_t ReadString( const char *szData ) override; - virtual CUtlString WriteString( IXMLObject *pObject ) override; - - virtual IXMLObject *CreateObject() override; - virtual void FreeObject( IXMLObject *pObject ) override; - - IXMLObject *ReadTagParams( CUtlString szTag ); - XMLFile_t ReadDoctype( const char *szData ); - - bool BIsValidAtStart( char c ); - bool BIsValidAtMid( char c ); - void SkipWhiteSpaces( const char *&psz ); -}; - -static char XML_TAG[] = "<"; -static char XML_TAG_END[] = ">"; -static char XML_SELF_CLOSE_END[] = "/>"; -static char XML_CLOSE_TAG[] = ""; - -XMLFile_t CXMLManager::ReadString( const char *szString ) -{ - CUtlString szTagStack = {}; - CUtlString szRootObjectName; - IXMLObject *pRootObject = CreateObject(); - IXMLObject *pLastObject = pRootObject; - CUtlVector stack = {pRootObject}; - - enum EXMLParsingMode - { - XML_PARSING_MODE_TEXT, - XML_PARSING_MODE_PREPROCESS_TAG, - XML_PARSING_MODE_TAG, - XML_PARSING_MODE_CLOSE_TAG, - XML_PARSING_MODE_DOCTYPE, - XML_PARSING_MODE_COMMENT, - } eMode = XML_PARSING_MODE_TEXT; - - const char *psz = szString; - CUtlString szTag = ""; - CUtlString szText = ""; - XMLFile_t stFile = {}; - while (*psz) - { - switch (eMode) - { - case XML_PARSING_MODE_TEXT: - if (!V_strncmp(XML_DOCTYPE, psz, sizeof(XML_DOCTYPE)-1)) - { - psz+=sizeof(XML_DOCTYPE)-1; - szTag = NULL; - - eMode = XML_PARSING_MODE_DOCTYPE; - if (szText != NULL) - { - IXMLObject *pText = CreateObject(); - pText->SetType(XML_OBJECT_TEXT); - pText->SetValue(szText); - pLastObject->GetChildren().AppendTail(pText); - szText = NULL; - } - - break; - } - if (!V_strncmp(XML_PREPROCESSOR_BEGIN, psz, sizeof(XML_PREPROCESSOR_BEGIN)-1)) - { - psz+=sizeof(XML_PREPROCESSOR_BEGIN)-1; - szTag = NULL; - - eMode = XML_PARSING_MODE_PREPROCESS_TAG; - if (szText != NULL) - { - IXMLObject *pText = CreateObject(); - pText->SetType(XML_OBJECT_TEXT); - pText->SetValue(szText); - pLastObject->GetChildren().AppendTail(pText); - szText = NULL; - } - break; - } - if (!V_strncmp(XML_CLOSE_TAG, psz, sizeof(XML_CLOSE_TAG)-1)) - { - psz+=sizeof(XML_CLOSE_TAG)-1; - szTag = NULL; - - eMode = XML_PARSING_MODE_CLOSE_TAG; - if (szText != NULL) - { - IXMLObject *pText = CreateObject(); - pText->SetType(XML_OBJECT_TEXT); - pText->SetValue(szText); - pLastObject->GetChildren().AppendTail(pText); - szText = NULL; - } - break; - } - if (!V_strncmp(XML_TAG, psz, sizeof(XML_TAG)-1)) - { - psz+=sizeof(XML_TAG)-1; - szTag = NULL; - - eMode = XML_PARSING_MODE_TAG; - if (szText != NULL) - { - IXMLObject *pText = CreateObject(); - pText->SetType(XML_OBJECT_TEXT); - pText->SetValue(szText); - pLastObject->GetChildren().AppendTail(pText); - szText = NULL; - } - break; - } - szText.AppendTail(*psz); - psz++; - break; - case XML_PARSING_MODE_PREPROCESS_TAG: - if (!V_strncmp(XML_PREPROCESSOR_END, psz, sizeof(XML_PREPROCESSOR_END)-1)) - { - psz+=sizeof(XML_PREPROCESSOR_END)-1; - eMode = XML_PARSING_MODE_TEXT; - V_printf("preprocess: %s\n", szTag.GetString()); - break; - } - szTag.AppendTail(*psz); - psz++; - break; - case XML_PARSING_MODE_TAG: - if (!V_strncmp(XML_SELF_CLOSE_END, psz, sizeof(XML_SELF_CLOSE_END)-1)) - { - psz+=sizeof(XML_SELF_CLOSE_END)-1; - eMode = XML_PARSING_MODE_TEXT; - IXMLObject *pObject = ReadTagParams(szTag); - pLastObject->GetChildren().AppendTail(pObject); - - break; - } - - if (!V_strncmp(XML_TAG_END, psz, sizeof(XML_TAG_END)-1)) - { - psz+=sizeof(XML_TAG_END)-1; - eMode = XML_PARSING_MODE_TEXT; - IXMLObject *pObject = ReadTagParams(szTag); - stack.AppendTail(pObject); - pLastObject->GetChildren().AppendTail(pObject); - pLastObject = pObject; - break; - } - - szTag.AppendTail(*psz); - psz++; - break; - case XML_PARSING_MODE_CLOSE_TAG: - if (!V_strncmp(XML_TAG_END, psz, sizeof(XML_TAG_END)-1)) - { - psz+=sizeof(XML_TAG_END)-1; - eMode = XML_PARSING_MODE_TEXT; - - - if (!V_strcmp(pLastObject->GetValue(), szTag)) - { - stack.RemoveTail(); - pLastObject = stack[stack.GetSize()-1]; - } - else - V_printf("\"%s\" != \"%s\"\n",pLastObject->GetValue(), szTag.GetString()); - break; - } - szTag.AppendTail(*psz); - psz++; - break; - case XML_PARSING_MODE_DOCTYPE: - if (!V_strncmp(XML_TAG_END, psz, sizeof(XML_TAG_END)-1)) - { - psz+=sizeof(XML_TAG_END)-1; - eMode = XML_PARSING_MODE_TEXT; - - stFile = ReadDoctype(szTag); - break; - } - szTag.AppendTail(*psz); - psz++; - break; - case XML_PARSING_MODE_COMMENT: - break; - }; - }; - stFile.m_pRoot = pRootObject; - return stFile; -} -CUtlString CXMLManager::WriteString( IXMLObject *pObject ) -{ -}; - -IXMLObject *CXMLManager::ReadTagParams( CUtlString szTag ) -{ - const char *psz = szTag; - CUtlVector params; - CUtlString szTagName = NULL; - CUtlString szParamName = NULL; - IXMLObject *pObject = CreateObject(); - // Read tag name - if (!BIsValidAtStart(*psz)) - { - V_printf("tag must start with letter or _"); - FreeObject(pObject); - return NULL; - } - - szTagName.AppendTail(*psz++); - while (BIsValidAtMid(*psz)) - { - szTagName.AppendTail(*psz); - psz++; - } - pObject->SetType(XML_OBJECT_ELEMENT); - pObject->SetValue(szTagName); - - while (*psz) - { - while (V_isspace(*psz)) - { - psz++; - continue; - } - if (*psz && (!V_isalpha(*psz) || *psz == '_')) - { - V_printf("parameter must start with letter or _\n"); - return {}; - } - while (*psz && (*psz != ' ' || *psz != '=')) - { - psz++; - continue; - } - while (V_isspace(*psz)) - { - psz++; - continue; - } - szParamName.AppendTail(*psz); - }; - return pObject; -}; - -static bool XMLGetWordSymbol( char c ) -{ - if (V_isalnum(c)) - return true; - switch(c) - { - case ':': - return true; - case '.': - return true; - case '_': - return true; - case '-': - return true; - default: - break; - } - return false; -}; - -XMLFile_t CXMLManager::ReadDoctype( const char *szData ) -{ - const char *psz = szData; - XMLFile_t stFile = {}; - CUtlString dtdType = NULL; - CUtlVector tokens; - int i = 0; - - if (!V_isspace(*psz)) - return stFile; - - SkipWhiteSpaces(psz); - - tokens = Tokenize(psz, XMLGetWordSymbol); - if ( tokens.GetSize() < i + 1 ) - return stFile; - if ( tokens[i].m_bIsQuoted ) - return stFile; - - stFile.m_szRootObjectName = tokens[i++].m_szValue; - - // parse ddt - if ( tokens.GetSize() < i + 1 ) - return stFile; - - if ( tokens[i].m_szValue == "PUBLIC" && !tokens[i].m_bIsQuoted ) - { - i++; - if ( tokens.GetSize() < i + 2 ) - return stFile; - if (!tokens[i].m_bIsQuoted || !tokens[i+1].m_bIsQuoted) - return stFile; - stFile.m_szFPI = tokens[i++].m_szValue; - stFile.m_szURI = tokens[i++].m_szValue; - } else if ( tokens[i].m_szValue == "SYSTEM" && !tokens[i].m_bIsQuoted ) - { - } else - { - - } - - - - // read root element - return stFile; -} - -bool CXMLManager::BIsValidAtStart( char c ) -{ - if (V_isalpha(c)) - return true; - if (c == '_') - return true; - return false; -} - -bool CXMLManager::BIsValidAtMid( char c ) -{ - if (V_isalnum(c)) - return true; - if (c == '_') - return true; - if (c == '-') - return true; - if (c == '.') - return true; - return false; -} -void CXMLManager::SkipWhiteSpaces( const char *&psz ) -{ - while (V_isspace(*psz)) - { - psz++; - continue; - } -} - -IXMLObject *CXMLManager::CreateObject() -{ - return new CXMLObject; -} - -void CXMLManager::FreeObject( IXMLObject *pObject ) -{ - pObject->Free(); - delete (CXMLObject*)pObject; -} - - -IXMLManager *XMLManager() -{ - static CXMLManager mgr; - return &mgr; -}; diff --git a/tier2/filesystem.cpp b/tier2/filesystem.cpp deleted file mode 100644 index 64c0e18..0000000 --- a/tier2/filesystem.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "tier2/ifilesystem.h" - -IFileSystem *filesystem; - diff --git a/tier2/tokenizer.cpp b/tier2/tokenizer.cpp deleted file mode 100644 index 07ddd91..0000000 --- a/tier2/tokenizer.cpp +++ /dev/null @@ -1,130 +0,0 @@ -#include "tier2/tokenizer.h" - -static bool IsWordSymbol( char c ) -{ - if (V_isalnum(c)) - return true; - switch (c) - { - case '_': - return true; - default: - return false; - } -} - -CUtlVector Tokenize( const char *psz ) -{ - return Tokenize(psz, IsWordSymbol); -} - -CUtlVector Tokenize( const char *psz, IsAlphabetSymbolFn fnIsAlphabetSymbol ) -{ - CUtlVector tokens = {}; - size_t i = 0; - char c; - uint32_t nCurrentLine = 1; - uint32_t nCurrentCharacter = 0; - uint32_t nStartingCharacter = 0; - bool bIsQuoted = false; - bool bIsSlash = false; - CUtlString szStringValue; - - while (true) - { - c = psz[i]; - if (c == '\0') - break; - if (c == '\n') - { - nCurrentCharacter = 0; - nStartingCharacter = 0; - nCurrentLine++; - } - else - nCurrentCharacter++; - i++; - - - if (bIsQuoted) - { - // text within "" - if (bIsSlash) - { - // reading \n \t etc. - bIsSlash = false; - switch (c) - { - case '\\': - szStringValue.AppendTail('\\'); - continue; - case '"': - szStringValue.AppendTail('"'); - continue; - case 'n': - szStringValue.AppendTail('\n'); - continue; - case 't': - szStringValue.AppendTail('\t'); - continue; - // allow for strings to go to next line with by ending with backward slash - case '\n': - szStringValue.AppendTail('\n'); - continue; - default: - szStringValue.AppendTail(c); - continue; - } - } else { - // react to special symbols witin a string - switch (c) - { - - // enables reading \n \t etc. - case '\\': - bIsSlash = true; - continue; - - case '\n': - // newline - // we do want to end it to prevent parsing errors - // and there is no standart - V_printf("line %i: new line was found but the string wasn't finished, did you forget to place \" in the end of the line?\n", nCurrentLine); - case '"': - // end string - bIsQuoted = false; - if (szStringValue == 0) - continue; - tokens.AppendTail({szStringValue, true, nCurrentLine, nStartingCharacter}); - szStringValue = 0; - continue; - default: - szStringValue.AppendTail(c); - continue; - } - } - - } else { - // " makes it use a string - if (c == '"') - { - bIsQuoted = true; - } - - if (fnIsAlphabetSymbol(c)) - { - szStringValue.AppendTail(c); - continue; - } else { - if (szStringValue != 0) - tokens.AppendTail({szStringValue, false, nCurrentLine, nStartingCharacter}); - - nStartingCharacter = nCurrentCharacter; - szStringValue = 0; - if (V_isgraph(c) && c != '"') - tokens.AppendTail({CUtlString("%c", c), false, nCurrentLine, nStartingCharacter}); - } - } - }; - return tokens; -}; diff --git a/tier2/uuid.cpp b/tier2/uuid.cpp deleted file mode 100644 index e69de29..0000000