Fix change in behavior to FString::Find: when called with an empty string and IgnoreCase it should return INDEX_NONE and a recent change had changed this to return 0 instead.

#jira UE-171641
#rb Ben.Zeigler
#rnx
#preflight 6389152bb36822f1c3488a05

[CL 23362911 by Matt Peters in ue5-main branch]
This commit is contained in:
Matt Peters
2022-12-01 16:42:48 -05:00
parent d4f5f9e165
commit 9e2cf331d3
2 changed files with 12 additions and 0 deletions
@@ -409,6 +409,11 @@ int32 FString::Find(const TCHAR* SubStr, int32 SubStrLen, ESearchCase::Type Sear
Start += FMath::Clamp(StartPosition, 0, RemainingLength - 1);
RemainingLength = UE_PTRDIFF_TO_INT32(End - Start);
}
if (SubStrLen == 0 && SearchCase == ESearchCase::IgnoreCase)
{
// Legacy behavior: when SubStr is empty string and SearchCase is IgnoreCase, return INDEX_NONE
return INDEX_NONE;
}
const TCHAR* Tmp = SearchCase == ESearchCase::IgnoreCase
? FCString::Strnistr(Start, RemainingLength, SubStr, SubStrLen)
: FCString::Strnstr(Start, RemainingLength, SubStr, SubStrLen);
@@ -710,6 +710,13 @@ bool FStringFindTest::RunTest(const FString& Parameters)
RunTest(ABACADAB, EmptyString, ESearchCase::CaseSensitive, ESearchDir::FromEnd, 2, 1);
RunTest(ABACADAB, EmptyString, ESearchCase::CaseSensitive, ESearchDir::FromEnd, 0, INDEX_NONE);
// Find with an empty search string has different behavior depending on SearchCase due to legacy implementation
RunTest(ABACADAB, EmptyString, ESearchCase::IgnoreCase, ESearchDir::FromStart, 0, INDEX_NONE);
RunTest(ABACADAB, EmptyString, ESearchCase::IgnoreCase, ESearchDir::FromStart, 4, INDEX_NONE);
RunTest(ABACADAB, EmptyString, ESearchCase::IgnoreCase, ESearchDir::FromEnd, 8, 7);
RunTest(ABACADAB, EmptyString, ESearchCase::IgnoreCase, ESearchDir::FromEnd, 2, 1);
RunTest(ABACADAB, EmptyString, ESearchCase::IgnoreCase, ESearchDir::FromEnd, 0, INDEX_NONE);
// Find with a null char*
int32 Actual = FString(ABACADAB).Find(nullptr, ESearchCase::CaseSensitive, ESearchDir::FromStart, 0);
if (Actual != INDEX_NONE)