diff --git a/src/zstring.cpp b/src/zstring.cpp index f4f57c4f3..ea9c249bb 100644 --- a/src/zstring.cpp +++ b/src/zstring.cpp @@ -1162,6 +1162,49 @@ void FString::ReallocBuffer (size_t newlen) } } +TArray FString::Split(const FString &delimiter, const EmptyTokenType keepEmpty) const +{ + return Split(delimiter.GetChars(), keepEmpty); +} + +TArray FString::Split(const char *const delimiter, const EmptyTokenType keepEmpty) const +{ + TArray tokens; + Split(tokens, delimiter, keepEmpty); + return tokens; +} + +void FString::Split(TArray& tokens, const FString &delimiter, EmptyTokenType keepEmpty) const +{ + Split(tokens, delimiter.GetChars(), keepEmpty); +} + +void FString::Split(TArray& tokens, const char *delimiter, EmptyTokenType keepEmpty) const +{ + assert(nullptr != delimiter); + + const long selfLen = static_cast(Len()); + const long delimLen = static_cast(strlen(delimiter)); + long lastPos = 0; + + while (lastPos <= selfLen) + { + long pos = IndexOf(delimiter, lastPos); + + if (-1 == pos) + { + pos = selfLen; + } + + if (pos != lastPos || TOK_KEEPEMPTY == keepEmpty) + { + tokens.Push(FString(GetChars() + lastPos, pos - lastPos)); + } + + lastPos = pos + delimLen; + } +} + // Under Windows, use the system heap functions for managing string memory. // Under other OSs, use ordinary memory management instead. diff --git a/src/zstring.h b/src/zstring.h index b30bef2dc..c6cd44fc9 100644 --- a/src/zstring.h +++ b/src/zstring.h @@ -312,6 +312,17 @@ public: int CompareNoCase(const FString &other, int len) const { return strnicmp(Chars, other.Chars, len); } int CompareNoCase(const char *other, int len) const { return strnicmp(Chars, other, len); } + enum EmptyTokenType + { + TOK_SKIPEMPTY = 0, + TOK_KEEPEMPTY = 1, + }; + + TArray Split(const FString &delimiter, EmptyTokenType keepEmpty = TOK_KEEPEMPTY) const; + TArray Split(const char *delimiter, EmptyTokenType keepEmpty = TOK_KEEPEMPTY) const; + void Split(TArray& tokens, const FString &delimiter, EmptyTokenType keepEmpty = TOK_KEEPEMPTY) const; + void Split(TArray& tokens, const char *delimiter, EmptyTokenType keepEmpty = TOK_KEEPEMPTY) const; + protected: const FStringData *Data() const { return (FStringData *)Chars - 1; } FStringData *Data() { return (FStringData *)Chars - 1; }