summaryrefslogtreecommitdiff
path: root/AK
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-05-17 20:03:03 +0200
committerAndreas Kling <kling@serenityos.org>2020-05-17 22:35:25 +0200
commit86242f9c18103afa7364ef40a19dd27cf3c26f9e (patch)
treed62edf46a2be79a1d801cad80cd4120c2f915997 /AK
parentbc6f469544a9e108237eb23b137339a6cc7f9112 (diff)
downloadserenity-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.cpp27
-rw-r--r--AK/StringBuilder.h1
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*, ...);