summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/string.cpp23
-rw-r--r--src/string_func.h9
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