summaryrefslogtreecommitdiff
path: root/src/support/string.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/support/string.cpp')
-rw-r--r--src/support/string.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/support/string.cpp b/src/support/string.cpp
index 31d0e9170..01fe4e522 100644
--- a/src/support/string.cpp
+++ b/src/support/string.cpp
@@ -195,9 +195,21 @@ std::optional<uint32_t> takeWTF8CodePoint(std::string_view& str) {
}
str = str.substr(1 + trailingBytes);
+
if (!valid) {
return std::nullopt;
}
+
+ size_t expectedTrailing = u < 0x80 ? 0
+ : u < 0x800 ? 1
+ : u < 0x10000 ? 2
+ : u < 0x110000 ? 3
+ : -1;
+ if (trailingBytes != expectedTrailing) {
+ // Overlong encoding or overlarge code point.
+ return std::nullopt;
+ }
+
return u;
}
@@ -404,4 +416,14 @@ std::ostream& printEscapedJSON(std::ostream& os, std::string_view str) {
return os << '"';
}
+bool isUTF8(std::string_view str) {
+ while (str.size()) {
+ auto u = takeWTF8CodePoint(str);
+ if (!u || (0xD800 <= *u && *u < 0xE000)) {
+ return false;
+ }
+ }
+ return true;
+}
+
} // namespace wasm::String