From cfeda020db3ec6a6409968a4611ece4d3cd5de59 Mon Sep 17 00:00:00 2001 From: Rodrigo Alfonso Date: Sun, 12 Jan 2025 08:58:38 -0300 Subject: [PATCH] Providing default implementations for common string functions --- examples/LinkWireless_demo/src/main.cpp | 1 - lib/LinkMobile.hpp | 12 ++--- lib/LinkRawWireless.hpp | 6 +-- lib/LinkUniversal.hpp | 5 +-- lib/LinkWireless.hpp | 16 +++---- lib/_link_common.hpp | 60 ++++++++++++------------- lib/c_bindings/C_LinkRawWireless.cpp | 18 ++++---- 7 files changed, 55 insertions(+), 63 deletions(-) diff --git a/examples/LinkWireless_demo/src/main.cpp b/examples/LinkWireless_demo/src/main.cpp index f19faf5..a9f8bb2 100644 --- a/examples/LinkWireless_demo/src/main.cpp +++ b/examples/LinkWireless_demo/src/main.cpp @@ -74,7 +74,6 @@ start: forwarding, retransmission, maxPlayers, isRestoringFromMultiboot ? 1000 : LINK_WIRELESS_DEFAULT_TIMEOUT, LINK_WIRELESS_DEFAULT_INTERVAL, LINK_WIRELESS_DEFAULT_SEND_TIMER_ID); - // linkWireless->debug = [](std::string str) { Common::log(str); }; // (2) Add the required interrupt service routines interrupt_init(); diff --git a/lib/LinkMobile.hpp b/lib/LinkMobile.hpp index 50d7d0c..981c7d5 100644 --- a/lib/LinkMobile.hpp +++ b/lib/LinkMobile.hpp @@ -367,7 +367,7 @@ class LinkMobile { auto request = UserRequest{.type = UserRequest::Type::PPP_LOGIN}; copyString(request.password, password, LINK_MOBILE_MAX_PASSWORD_LENGTH); - if (LINK_STRLEN(loginId) > 0) + if (Link::strlen(loginId) > 0) copyString(request.loginId, loginId, LINK_MOBILE_MAX_LOGIN_ID_LENGTH); else if (adapterConfiguration.isValid()) copyString(request.loginId, adapterConfiguration.fields._ispNumber1, @@ -397,7 +397,7 @@ class LinkMobile { result->completed = false; result->success = false; - u32 size = LINK_STRLEN(domainName); + u32 size = Link::strlen(domainName); if (size > LINK_MOBILE_MAX_DOMAIN_NAME_LENGTH) size = LINK_MOBILE_MAX_DOMAIN_NAME_LENGTH; @@ -1360,7 +1360,7 @@ class LinkMobile { void cmdDialTelephone(const char* phoneNumber) { addData(DIAL_PHONE_FIRST_BYTE[adapterType], true); - for (u32 i = 0; i < LINK_STRLEN(phoneNumber); i++) + for (u32 i = 0; i < Link::strlen(phoneNumber); i++) addData(phoneNumber[i]); sendCommandAsync(buildCommand(COMMAND_DIAL_TELEPHONE, true)); } @@ -1396,12 +1396,12 @@ class LinkMobile { } void cmdISPLogin(const char* loginId, const char* password) { - u32 loginIdLength = LINK_STRLEN(loginId); + u32 loginIdLength = Link::strlen(loginId); addData(loginIdLength, true); for (u32 i = 0; i < loginIdLength; i++) addData(loginId[i]); - u32 passwordLength = LINK_STRLEN(password); + u32 passwordLength = Link::strlen(password); addData(passwordLength); for (u32 i = 0; i < passwordLength; i++) addData(password[i]); @@ -1502,7 +1502,7 @@ class LinkMobile { } void copyString(char* target, const char* source, u32 length) { - u32 len = LINK_STRLEN(source); + u32 len = Link::strlen(source); for (u32 i = 0; i < length + 1; i++) if (i < len) diff --git a/lib/LinkRawWireless.hpp b/lib/LinkRawWireless.hpp index 51fa438..8277dbf 100644 --- a/lib/LinkRawWireless.hpp +++ b/lib/LinkRawWireless.hpp @@ -308,12 +308,12 @@ class LinkRawWireless { u16 gameId = LINK_RAW_WIRELESS_MAX_GAME_ID, bool _validateNames = true) { if (_validateNames && - LINK_STRLEN(gameName) > LINK_RAW_WIRELESS_MAX_GAME_NAME_LENGTH) { + Link::strlen(gameName) > LINK_RAW_WIRELESS_MAX_GAME_NAME_LENGTH) { _LRWLOG_("! game name too long"); return false; } if (_validateNames && - LINK_STRLEN(userName) > LINK_RAW_WIRELESS_MAX_USER_NAME_LENGTH) { + Link::strlen(userName) > LINK_RAW_WIRELESS_MAX_USER_NAME_LENGTH) { _LRWLOG_("! user name too long"); return false; } @@ -1165,7 +1165,7 @@ class LinkRawWireless { volatile bool isEnabled = false; void copyName(char* target, const char* source, u32 length) { - u32 len = LINK_STRLEN(source); + u32 len = Link::strlen(source); for (u32 i = 0; i < length + 1; i++) if (i < len) diff --git a/lib/LinkUniversal.hpp b/lib/LinkUniversal.hpp index cc01129..930c18d 100644 --- a/lib/LinkUniversal.hpp +++ b/lib/LinkUniversal.hpp @@ -566,7 +566,7 @@ class LinkUniversal { break; if (!server.isFull() && - LINK_STRCMP(server.gameName, config.gameName) == 0 && + Link::areStrEqual(server.gameName, config.gameName) && (LINK_UNIVERSAL_GAME_ID_FILTER == 0 || server.gameId == LINK_UNIVERSAL_GAME_ID_FILTER)) { u32 randomNumber = safeStoi(server.userName); @@ -588,8 +588,7 @@ class LinkUniversal { serveWait = SERVE_WAIT_FRAMES + _qran_range(1, SERVE_WAIT_FRAMES_RANDOM); u32 randomNumber = _qran_range(1, MAX_ROOM_NUMBER); char randomNumberStr[6]; - LINK_SNPRINTF(randomNumberStr, sizeof(randomNumberStr), "%d", - randomNumber); + Link::intToStr5(randomNumberStr, randomNumber); if (!linkWireless.serve(config.gameName, randomNumberStr, LINK_UNIVERSAL_GAME_ID_FILTER > 0 ? LINK_UNIVERSAL_GAME_ID_FILTER diff --git a/lib/LinkWireless.hpp b/lib/LinkWireless.hpp index 27c60b9..ced35b7 100644 --- a/lib/LinkWireless.hpp +++ b/lib/LinkWireless.hpp @@ -60,9 +60,6 @@ #include "LinkRawWireless.hpp" -// #include -// #include - #ifndef LINK_WIRELESS_QUEUE_SIZE /** * @brief Buffer size (how many incoming and outgoing messages the queues can @@ -194,7 +191,6 @@ class LinkWireless { u32 QUICK_RECEIVE = 0; #endif -// std::function debug; // #define LINK_WIRELESS_PROFILING_ENABLED #ifdef LINK_WIRELESS_PROFILING_ENABLED u32 vblankTime = 0; @@ -365,9 +361,9 @@ class LinkWireless { if (linkRawWireless.getState() != LinkWireless::State::AUTHENTICATED && linkRawWireless.getState() != LinkWireless::State::SERVING) return badRequest(WRONG_STATE); - if (LINK_STRLEN(gameName) > LINK_WIRELESS_MAX_GAME_NAME_LENGTH) + if (Link::strlen(gameName) > LINK_WIRELESS_MAX_GAME_NAME_LENGTH) return badRequest(GAME_NAME_TOO_LONG); - if (LINK_STRLEN(userName) > LINK_WIRELESS_MAX_USER_NAME_LENGTH) + if (Link::strlen(userName) > LINK_WIRELESS_MAX_USER_NAME_LENGTH) return badRequest(USER_NAME_TOO_LONG); isSendingSyncCommand = true; @@ -498,10 +494,10 @@ class LinkWireless { Server server; server.id = foundServers[i].id; server.gameId = foundServers[i].gameId; - LINK_MEMCPY(server.gameName, foundServers[i].gameName, - LINK_WIRELESS_MAX_GAME_NAME_LENGTH + 1); - LINK_MEMCPY(server.userName, foundServers[i].userName, - LINK_WIRELESS_MAX_USER_NAME_LENGTH + 1); + for (u32 j = 0; j < LINK_WIRELESS_MAX_GAME_NAME_LENGTH + 1; j++) + server.gameName[j] = foundServers[i].gameName[j]; + for (u32 j = 0; j < LINK_WIRELESS_MAX_USER_NAME_LENGTH + 1; j++) + server.userName[j] = foundServers[i].userName[j]; u8 nextClientNumber = foundServers[i].nextClientNumber; server.currentPlayerCount = nextClientNumber == 0xff ? 0 : 1 + nextClientNumber; diff --git a/lib/_link_common.hpp b/lib/_link_common.hpp index ebf5296..9eb9970 100644 --- a/lib/_link_common.hpp +++ b/lib/_link_common.hpp @@ -5,38 +5,6 @@ #pragma GCC system_header #endif -/** - * @brief strlen(...) implementation (by default, std::strlen) - */ -#ifndef LINK_STRLEN -#include -#define LINK_STRLEN std::strlen -#endif - -/** - * @brief strcmp(...) implementation (by default, std::strcmp) - */ -#ifndef LINK_STRCMP -#include -#define LINK_STRCMP std::strcmp -#endif - -/** - * @brief snprintf(...) implementation (by default, std::snprintf) - */ -#ifndef LINK_SNPRINTF -#include -#define LINK_SNPRINTF std::snprintf -#endif - -/** - * @brief memcpy(...) implementation (by default, std::memcpy) - */ -#ifndef LINK_MEMCPY -#include -#define LINK_MEMCPY std::memcpy -#endif - /** * @brief Enable mGBA debug logging. */ @@ -230,6 +198,34 @@ static inline void wait(u32 verticalLines) { }; } +static inline u32 strlen(const char* s) { + u32 len = 0; + while (s[len] != '\0') + ++len; + return len; +} + +static inline bool areStrEqual(const char* s1, const char* s2) { + while (*s1 && (*s1 == *s2)) { + ++s1; + ++s2; + } + return *s1 == *s2; +} + +static inline void intToStr5(char* buf, int num) { + char temp[6]; + int pos = 0; + do { + temp[pos++] = '0' + (num % 10); + num /= 10; + } while (num && pos < 5); + int j = 0; + while (pos) + buf[j++] = temp[--pos]; + buf[j] = '\0'; +} + // Queue template diff --git a/lib/c_bindings/C_LinkRawWireless.cpp b/lib/c_bindings/C_LinkRawWireless.cpp index 5d4bc30..d20c3ce 100644 --- a/lib/c_bindings/C_LinkRawWireless.cpp +++ b/lib/c_bindings/C_LinkRawWireless.cpp @@ -1,6 +1,8 @@ #include "C_LinkRawWireless.h" #include "../LinkRawWireless.hpp" +#include + extern "C" { C_LinkRawWireless_CommandResult fromCppResult( LinkRawWireless::CommandResult cppResult); @@ -130,10 +132,10 @@ bool C_LinkRawWireless_broadcastReadPoll( for (u32 i = 0; i < response->serversSize; i++) { response->servers[i].id = cppResponse.servers[i].id; response->servers[i].gameId = cppResponse.servers[i].gameId; - LINK_MEMCPY(response->servers[i].gameName, cppResponse.servers[i].gameName, - LINK_RAW_WIRELESS_MAX_GAME_NAME_LENGTH + 1); - LINK_MEMCPY(response->servers[i].userName, cppResponse.servers[i].userName, - LINK_RAW_WIRELESS_MAX_USER_NAME_LENGTH + 1); + for (u32 j = 0; j < LINK_RAW_WIRELESS_MAX_GAME_NAME_LENGTH + 1; j++) + response->servers[i].gameName[j] = cppResponse.servers[i].gameName[j]; + for (u32 j = 0; j < LINK_RAW_WIRELESS_MAX_USER_NAME_LENGTH + 1; j++) + response->servers[i].userName[j] = cppResponse.servers[i].userName[j]; response->servers[i].nextClientNumber = cppResponse.servers[i].nextClientNumber; } @@ -184,8 +186,8 @@ bool C_LinkRawWireless_sendDataAndWait( remoteCommand->success = cppRemoteCommand.success; remoteCommand->commandId = cppRemoteCommand.commandId; remoteCommand->dataSize = cppRemoteCommand.dataSize; - LINK_MEMCPY(remoteCommand->data, cppRemoteCommand.data, - LINK_RAW_WIRELESS_MAX_COMMAND_TRANSFER_LENGTH * sizeof(u32)); + for (u32 j = 0; j < LINK_RAW_WIRELESS_MAX_COMMAND_TRANSFER_LENGTH; j++) + remoteCommand->data[j] = cppRemoteCommand.data[j]; return success; } @@ -212,8 +214,8 @@ bool C_LinkRawWireless_wait(C_LinkRawWirelessHandle handle, remoteCommand->success = cppRemoteCommand.success; remoteCommand->commandId = cppRemoteCommand.commandId; remoteCommand->dataSize = cppRemoteCommand.dataSize; - LINK_MEMCPY(remoteCommand->data, cppRemoteCommand.data, - LINK_RAW_WIRELESS_MAX_COMMAND_TRANSFER_LENGTH * sizeof(u32)); + for (u32 j = 0; j < LINK_RAW_WIRELESS_MAX_COMMAND_TRANSFER_LENGTH; j++) + remoteCommand->data[j] = cppRemoteCommand.data[j]; return success; }