From c031c7c3def1988070681a987b4aaf5498326499 Mon Sep 17 00:00:00 2001 From: Adam Heinermann Date: Tue, 24 Feb 2026 00:23:25 -0800 Subject: [PATCH] chore: fix some calling conventions and return types for WoW --- CMakeLists.txt | 8 ++++++++ storm/Core.cpp | 4 ++-- storm/Core.hpp | 8 +++++++- storm/String.cpp | 16 ++++++++-------- storm/String.hpp | 22 ++++++++++++++-------- storm/Unicode.cpp | 2 +- storm/Unicode.hpp | 8 +++++++- test/Core.cpp | 15 ++++++++++++--- 8 files changed, 59 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 28b385fd..09e16da1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,10 +50,18 @@ if(WHOA_STORM_FLAVOR MATCHES "(SC1|WC2|D1|D2)") add_definitions(-DWHOA_RECT_USES_SCREEN_COORDINATES) add_definitions(-DWHOA_SSTRHASH64_SUBTRACTS) add_definitions(-DWHOA_SUPPORTS_KOREAN_CODEPAGE) + add_definitions(-DWHOA_DESTROY_HAS_RETVAL) + add_definitions(-DWHOA_SSTRCHR_IS_APICALL) + add_definitions(-DWHOA_SUNIGET_IS_APICALL) elseif(WHOA_STORM_FLAVOR STREQUAL "WOW") message(STATUS "Building Storm with World of Warcraft flavoring") add_definitions(-DWHOA_FLAVOR_WOW) add_definitions(-DWHOA_DISPLAY_ERR_EXTRA_ARG) + + # Not sure which version this was changed + if(WHOA_WOW_VERSION LESS_EQUAL 3368) + add_definitions(-DWHOA_SUNIGET_IS_APICALL) + endif() else() message(STATUS "Building Storm with default flavoring") add_definitions(-DWHOA_FLAVOR_GENERIC) diff --git a/storm/Core.cpp b/storm/Core.cpp index 994bebf1..2e62f91c 100644 --- a/storm/Core.cpp +++ b/storm/Core.cpp @@ -8,7 +8,7 @@ #include #endif -int32_t STORMAPI StormDestroy() { +STORM_DESTROY_RETTYPE STORMAPI StormDestroy() { // Combined list of all destroy calls found in every game (as documentation) // SErrSetBlizzardErrorFunction(nullptr); // SC 1.17 @@ -31,7 +31,7 @@ int32_t STORMAPI StormDestroy() { // SErrDestroy(); // WoW 3.3.5 (mac) // SLogDestroy(); // WoW 3.3.5 (mac) STransDestroy(); // SC 1.17 - return 1; + return (STORM_DESTROY_RETTYPE)1; } // NOTE: If squall is built as a DLL in the future, this should be updated to return hinstDLL from DllMain instead. diff --git a/storm/Core.hpp b/storm/Core.hpp index 32af33d5..018c24c0 100644 --- a/storm/Core.hpp +++ b/storm/Core.hpp @@ -22,7 +22,13 @@ typedef void* LPOVERLAPPED; typedef void* HINSTANCE; #endif -int32_t STORMAPI StormDestroy(); +#if defined(WHOA_DESTROY_HAS_RETVAL) +#define STORM_DESTROY_RETTYPE int32_t +#else +#define STORM_DESTROY_RETTYPE void +#endif + +STORM_DESTROY_RETTYPE STORMAPI StormDestroy(); HINSTANCE STORMAPI StormGetInstance(); diff --git a/storm/String.cpp b/storm/String.cpp index 03d1ab43..97f7f4ed 100644 --- a/storm/String.cpp +++ b/storm/String.cpp @@ -220,7 +220,7 @@ void STORMAPI SStrInitialize() { } } -char* STORMAPI SStrChr(char* string, char search) { +char* SSTRCHR_CALL SStrChr(char* string, char search) { STORM_VALIDATE_BEGIN; STORM_VALIDATE(string); STORM_VALIDATE_END; @@ -240,7 +240,7 @@ char* STORMAPI SStrChr(char* string, char search) { return string; } -const char* STORMAPI SStrChr(const char* string, char search) { +const char* SSTRCHR_CALL SStrChr(const char* string, char search) { STORM_VALIDATE_BEGIN; STORM_VALIDATE(string); STORM_VALIDATE_END; @@ -273,7 +273,7 @@ const char* STORMAPI SStrChrBidir(const char* string, char search, int32_t rever } } -char* STORMAPI SStrChrR(char* string, char search) { +char* SSTRCHR_CALL SStrChrR(char* string, char search) { STORM_VALIDATE_BEGIN; STORM_VALIDATE(string); STORM_VALIDATE_END; @@ -289,7 +289,7 @@ char* STORMAPI SStrChrR(char* string, char search) { return result; } -const char* STORMAPI SStrChrR(const char* string, char search) { +const char* SSTRCHR_CALL SStrChrR(const char* string, char search) { STORM_VALIDATE_BEGIN; STORM_VALIDATE(string); STORM_VALIDATE_END; @@ -577,7 +577,7 @@ size_t STORMCDECL SStrVPrintf(char* dest, size_t maxchars, const char* format, v return ISStrVPrintf(dest, maxchars, format, arglist); } -char* STORMAPI SStrStr(char* string, const char* search) { +char* SSTRCHR_CALL SStrStr(char* string, const char* search) { STORM_VALIDATE_BEGIN; STORM_VALIDATE(string); STORM_VALIDATE(search); @@ -593,7 +593,7 @@ char* STORMAPI SStrStr(char* string, const char* search) { return nullptr; } -const char* STORMAPI SStrStr(const char* string, const char* search) { +const char* SSTRCHR_CALL SStrStr(const char* string, const char* search) { STORM_VALIDATE_BEGIN; STORM_VALIDATE(string); STORM_VALIDATE(search); @@ -609,7 +609,7 @@ const char* STORMAPI SStrStr(const char* string, const char* search) { return nullptr; } -char* STORMAPI SStrStrI(char* string, const char* search) { +char* SSTRCHR_CALL SStrStrI(char* string, const char* search) { STORM_VALIDATE_BEGIN; STORM_VALIDATE(string); STORM_VALIDATE(search); @@ -625,7 +625,7 @@ char* STORMAPI SStrStrI(char* string, const char* search) { return nullptr; } -const char* STORMAPI SStrStrI(const char* string, const char* search) { +const char* SSTRCHR_CALL SStrStrI(const char* string, const char* search) { STORM_VALIDATE_BEGIN; STORM_VALIDATE(string); STORM_VALIDATE(search); diff --git a/storm/String.hpp b/storm/String.hpp index b0f4ba31..ee9d8946 100644 --- a/storm/String.hpp +++ b/storm/String.hpp @@ -10,15 +10,21 @@ #define SSTR_HASH_CASESENSITIVE 1 -char* STORMAPI SStrChr(char* string, char search); +#if defined(WHOA_SSTRCHR_IS_APICALL) +#define SSTRCHR_CALL STORMAPI +#else +#define SSTRCHR_CALL +#endif + +char* SSTRCHR_CALL SStrChr(char* string, char search); -const char* STORMAPI SStrChr(const char* string, char search); +const char* SSTRCHR_CALL SStrChr(const char* string, char search); const char* STORMAPI SStrChrBidir(const char* string, char search, int32_t reverse); -char* STORMAPI SStrChrR(char* string, char search); +char* SSTRCHR_CALL SStrChrR(char* string, char search); -const char* STORMAPI SStrChrR(const char* string, char search); +const char* SSTRCHR_CALL SStrChrR(const char* string, char search); int32_t STORMAPI SStrCmp(const char* string1, const char* string2, size_t maxchars = STORM_MAX_STR); @@ -46,13 +52,13 @@ size_t STORMCDECL SStrPrintf(char* dest, size_t maxchars, const char* format, .. size_t STORMCDECL SStrVPrintf(char* dest, size_t maxchars, const char* format, va_list arglist); -char* STORMAPI SStrStr(char* string, const char* search); +char* SSTRCHR_CALL SStrStr(char* string, const char* search); -const char* STORMAPI SStrStr(const char* string, const char* search); +const char* SSTRCHR_CALL SStrStr(const char* string, const char* search); -char* STORMAPI SStrStrI(char* string, const char* search); +char* SSTRCHR_CALL SStrStrI(char* string, const char* search); -const char* STORMAPI SStrStrI(const char* string, const char* search); +const char* SSTRCHR_CALL SStrStrI(const char* string, const char* search); void STORMAPI SStrTokenize(const char** string, char* buffer, size_t bufferchars, const char* whitespace, int32_t* quoted); diff --git a/storm/Unicode.cpp b/storm/Unicode.cpp index 63540ca7..17a0a341 100644 --- a/storm/Unicode.cpp +++ b/storm/Unicode.cpp @@ -197,7 +197,7 @@ int32_t STORMAPI SUniFindUTF8ChrStart(const char* utf8String, int32_t index) { return FindUTF8Character(utf8String, index, -1); } -uint32_t STORMAPI SUniSGetUTF8(const uint8_t* strptr, int32_t* chars) { +uint32_t SUNIGET_CALL SUniSGetUTF8(const uint8_t* strptr, int32_t* chars) { if (chars) { *chars = 0; } diff --git a/storm/Unicode.hpp b/storm/Unicode.hpp index f27ab928..14635c3b 100644 --- a/storm/Unicode.hpp +++ b/storm/Unicode.hpp @@ -4,6 +4,12 @@ #include "Core.hpp" #include +#if defined(WHOA_SUNIGET_IS_APICALL) +#define SUNIGET_CALL STORMAPI +#else +#define SUNIGET_CALL +#endif + ptrdiff_t STORMAPI SUniConvertUTF16ToDos(char* dest, const char16_t* source, uint32_t destsize); ptrdiff_t STORMAPI SUniConvertUTF16ToMac(char* dest, const char16_t* source, uint32_t destsize); @@ -22,7 +28,7 @@ int32_t STORMAPI SUniFindAfterUTF8Chr(const char* utf8String, int32_t index); // Assumes index is within the bounds of utf8String int32_t STORMAPI SUniFindUTF8ChrStart(const char* utf8String, int32_t index); -uint32_t STORMAPI SUniSGetUTF8(const uint8_t* strptr, int32_t* chars); +uint32_t SUNIGET_CALL SUniSGetUTF8(const uint8_t* strptr, int32_t* chars); void STORMAPI SUniSPutUTF8(uint32_t c, char* strptr); diff --git a/test/Core.cpp b/test/Core.cpp index b23eb6a5..9a1044d6 100644 --- a/test/Core.cpp +++ b/test/Core.cpp @@ -5,18 +5,27 @@ #if defined(WHOA_SYSTEM_WIN) #include +#endif #if defined(WHOA_TEST_STORMDLL) #define EXPECTED_MODULE_NAME "Storm.dll" #else #define EXPECTED_MODULE_NAME "StormTest.exe" #endif + +#if defined(WHOA_DESTROY_HAS_RETVAL) +#define CHECK_DESTROY(x) CHECK(x == 1); +#else +#define CHECK_DESTROY(x) x; #endif TEST_CASE("StormDestroy", "[core]") { + +#if defined(WHOA_DESTROY_HAS_RETVAL) SECTION("always returns 1") { CHECK(StormDestroy() == 1); } +#endif SECTION("SEvt") { EventHandlerTest test; @@ -29,7 +38,7 @@ TEST_CASE("StormDestroy", "[core]") { CHECK(SEvtDispatch(1, 1, 1, nullptr) == 1); CHECK(test.NumCalls() == 2); - CHECK(StormDestroy() == 1); + CHECK_DESTROY(StormDestroy()); // Can't increment calls since the handler was destroyed CHECK(SEvtDispatch(1, 1, 1, nullptr) == 0); @@ -40,7 +49,7 @@ TEST_CASE("StormDestroy", "[core]") { // not ideal but it's official behaviour SEvtBreakHandlerChain(nullptr); - CHECK(StormDestroy() == 1); + CHECK_DESTROY(StormDestroy()); SEvtRegisterHandler(0, 0, 0, 0, &TestEventHandler1); CHECK(SEvtDispatch(0, 0, 0, nullptr) == 0); @@ -54,7 +63,7 @@ TEST_CASE("StormDestroy", "[core]") { SRgnCreate(&rgn); REQUIRE(rgn != nullptr); // valid handle - CHECK(StormDestroy() == 1); + CHECK_DESTROY(StormDestroy()); // fails to duplicate because handle is invalid HSRGN newrgn;