diff options
author | Andreas Kling <kling@serenityos.org> | 2020-05-17 20:03:03 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-05-17 22:35:25 +0200 |
commit | 86242f9c18103afa7364ef40a19dd27cf3c26f9e (patch) | |
tree | d62edf46a2be79a1d801cad80cd4120c2f915997 /AK | |
parent | bc6f469544a9e108237eb23b137339a6cc7f9112 (diff) | |
download | serenity-86242f9c18103afa7364ef40a19dd27cf3c26f9e.zip |
AK: Add StringBuilder::append(Utf32View)
This encodes the incoming UTF-32 sequence as UTF-8.
Diffstat (limited to 'AK')
-rw-r--r-- | AK/StringBuilder.cpp | 27 | ||||
-rw-r--r-- | AK/StringBuilder.h | 1 |
2 files changed, 28 insertions, 0 deletions
diff --git a/AK/StringBuilder.cpp b/AK/StringBuilder.cpp index ffae4e76da..f69077c6ee 100644 --- a/AK/StringBuilder.cpp +++ b/AK/StringBuilder.cpp @@ -30,6 +30,7 @@ #include <AK/String.h> #include <AK/StringBuilder.h> #include <AK/StringView.h> +#include <AK/Utf32View.h> namespace AK { @@ -112,4 +113,30 @@ void StringBuilder::clear() m_length = 0; } +void StringBuilder::append(const Utf32View& utf32_view) +{ + for (size_t i = 0; i < utf32_view.length(); ++i) { + auto codepoint = utf32_view.codepoints()[i]; + if (codepoint <= 0x7f) { + append((char)codepoint); + } else if (codepoint <= 0x07ff) { + append((char)(((codepoint >> 6) & 0x1f) | 0xc0)); + append((char)(((codepoint >> 0) & 0x3f) | 0x80)); + } else if (codepoint <= 0xffff) { + append((char)(((codepoint >> 12) & 0x0f) | 0xe0)); + append((char)(((codepoint >> 6) & 0x3f) | 0x80)); + append((char)(((codepoint >> 0) & 0x3f) | 0x80)); + } else if (codepoint <= 0x10ffff) { + append((char)(((codepoint >> 18) & 0x07) | 0xf0)); + append((char)(((codepoint >> 12) & 0x3f) | 0x80)); + append((char)(((codepoint >> 6) & 0x3f) | 0x80)); + append((char)(((codepoint >> 0) & 0x3f) | 0x80)); + } else { + append(0xef); + append(0xbf); + append(0xbd); + } + } +} + } diff --git a/AK/StringBuilder.h b/AK/StringBuilder.h index fc627b230b..53665b86ab 100644 --- a/AK/StringBuilder.h +++ b/AK/StringBuilder.h @@ -40,6 +40,7 @@ public: ~StringBuilder() {} void append(const StringView&); + void append(const Utf32View&); void append(char); void append(const char*, size_t); void appendf(const char*, ...); |