From 4afa49824e87b82e518548cc0c55974d16d917c7 Mon Sep 17 00:00:00 2001 From: LC Date: Mon, 13 Jul 2026 17:23:20 -0400 Subject: [PATCH] StringUtils: Handle strings entirely composed of whitespace in trims Previously this wouldn't handle fully whitespaced strings. --- FEXCore/include/FEXCore/Utils/StringUtils.h | 16 ++++++++-------- unittests/APITests/StringUtils.cpp | 6 ++++++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/FEXCore/include/FEXCore/Utils/StringUtils.h b/FEXCore/include/FEXCore/Utils/StringUtils.h index 88963cdfa..ab97c3589 100644 --- a/FEXCore/include/FEXCore/Utils/StringUtils.h +++ b/FEXCore/include/FEXCore/Utils/StringUtils.h @@ -5,21 +5,21 @@ namespace FEXCore::StringUtils { // Trim the left side of the string of whitespace and new lines inline fextl::string LeftTrim(fextl::string String, std::string_view TrimTokens = " \t\n\r\f\v") { - size_t pos = fextl::string::npos; - if ((pos = String.find_first_not_of(TrimTokens)) != fextl::string::npos) { - String.erase(0, pos); + const size_t pos = String.find_first_not_of(TrimTokens); + if (pos == fextl::string::npos) { + return ""; } - - return String; + return String.erase(0, pos); } // Trim the right side of the string of whitespace and new lines inline fextl::string RightTrim(fextl::string String, std::string_view TrimTokens = " \t\n\r\f\v") { - size_t pos = fextl::string::npos; - if ((pos = String.find_last_not_of(TrimTokens)) != fextl::string::npos) { - String.erase(String.begin() + pos + 1, String.end()); + const size_t pos = String.find_last_not_of(TrimTokens); + if (pos == fextl::string::npos) { + return ""; } + String.erase(String.begin() + pos + 1, String.end()); return String; } diff --git a/unittests/APITests/StringUtils.cpp b/unittests/APITests/StringUtils.cpp index 6f9314abb..b046b863d 100644 --- a/unittests/APITests/StringUtils.cpp +++ b/unittests/APITests/StringUtils.cpp @@ -5,6 +5,8 @@ using namespace FEXCore::StringUtils; TEST_CASE("ltrim") { CHECK(LeftTrim("") == ""); + CHECK(LeftTrim(" ") == ""); + CHECK(LeftTrim(" \t\n\r\f\v") == ""); CHECK(LeftTrim("FEXInterpreter") == "FEXInterpreter"); CHECK(LeftTrim("FEXInterpreter\n") == "FEXInterpreter\n"); @@ -31,6 +33,8 @@ TEST_CASE("ltrim") { TEST_CASE("rtrim") { CHECK(RightTrim("") == ""); + CHECK(RightTrim(" ") == ""); + CHECK(RightTrim(" \t\n\r\f\v") == ""); CHECK(RightTrim("FEXInterpreter") == "FEXInterpreter"); CHECK(RightTrim("FEXInterpreter\n") == "FEXInterpreter"); @@ -57,6 +61,8 @@ TEST_CASE("rtrim") { TEST_CASE("trim") { CHECK(Trim("") == ""); + CHECK(Trim(" ") == ""); + CHECK(Trim(" \t\n\r\f\v") == ""); CHECK(Trim("FEXInterpreter") == "FEXInterpreter"); CHECK(Trim("FEXInterpreter\n") == "FEXInterpreter");