diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/string.cpp | 23 | ||||
-rw-r--r-- | src/string_func.h | 9 |
2 files changed, 32 insertions, 0 deletions
diff --git a/src/string.cpp b/src/string.cpp index 54a484b79..bad29649d 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -162,6 +162,29 @@ void str_validate(char *str, const char *last, bool allow_newlines, bool ignore) *dst = '\0'; } +bool StrValid(const char *str, const char *last) +{ + /* Assume the ABSOLUTE WORST to be in str as it comes from the outside. */ + + while (str <= last && *str != '\0') { + size_t len = Utf8EncodedCharLen(*str); + /* Encoded length is 0 if the character isn't known. + * The length check is needed to prevent Utf8Decode to read + * over the terminating '\0' if that happens to be placed + * within the encoding of an UTF8 character. */ + if (len == 0 || str + len > last) return false; + + WChar c; + len = Utf8Decode(&c, str); + if (!IsPrintable(c) || (c >= SCC_SPRITE_START && c <= SCC_SPRITE_END)) { + return false; + } + + str += len; + } + + return *str == '\0'; +} void str_strip_colours(char *str) { diff --git a/src/string_func.h b/src/string_func.h index b2e88f52b..802b62e50 100644 --- a/src/string_func.h +++ b/src/string_func.h @@ -118,6 +118,15 @@ void str_strip_colours(char *str); void strtolower(char *str); /** + * Checks whether the given string is valid, i.e. contains only + * valid (printable) characters and is properly terminated. + * @param str The string to validate. + * @param last The last character of the string, i.e. the string + * must be terminated here or earlier. + */ +bool StrValid(const char *str, const char *last); + +/** * Check if a string buffer is empty. * * @param s The pointer to the firste element of the buffer |