Providing default implementations for common string functions

This commit is contained in:
Rodrigo Alfonso 2025-01-12 08:58:38 -03:00
parent 0bfdb0b520
commit cfeda020db
7 changed files with 55 additions and 63 deletions

View File

@ -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();

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -60,9 +60,6 @@
#include "LinkRawWireless.hpp"
// #include <string>
// #include <functional>
#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<void(std::string str)> 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;

View File

@ -5,38 +5,6 @@
#pragma GCC system_header
#endif
/**
* @brief strlen(...) implementation (by default, std::strlen)
*/
#ifndef LINK_STRLEN
#include <cstring>
#define LINK_STRLEN std::strlen
#endif
/**
* @brief strcmp(...) implementation (by default, std::strcmp)
*/
#ifndef LINK_STRCMP
#include <cstdio>
#define LINK_STRCMP std::strcmp
#endif
/**
* @brief snprintf(...) implementation (by default, std::snprintf)
*/
#ifndef LINK_SNPRINTF
#include <cstdio>
#define LINK_SNPRINTF std::snprintf
#endif
/**
* @brief memcpy(...) implementation (by default, std::memcpy)
*/
#ifndef LINK_MEMCPY
#include <cstring>
#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 <typename T, u32 Size, bool Overwrite = true>

View File

@ -1,6 +1,8 @@
#include "C_LinkRawWireless.h"
#include "../LinkRawWireless.hpp"
#include <cstring>
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;
}