aboutsummaryrefslogtreecommitdiff
path: root/src/string_immutable.zig
diff options
context:
space:
mode:
authorGravatar Ciro Spaciari <ciro.spaciari@gmail.com> 2023-01-30 17:21:23 -0300
committerGravatar GitHub <noreply@github.com> 2023-01-30 12:21:23 -0800
commitaa10799d8a9a69b828e36cd9d295f6d5867fb511 (patch)
treefde30e5b530ce25acb417e766e96ee3710eedcc3 /src/string_immutable.zig
parentec2c16fefa8b98efaa1ccf84f18eea0a12c1c9ef (diff)
downloadbun-aa10799d8a9a69b828e36cd9d295f6d5867fb511.tar.gz
bun-aa10799d8a9a69b828e36cd9d295f6d5867fb511.tar.zst
bun-aa10799d8a9a69b828e36cd9d295f6d5867fb511.zip
fix utf16le fill and utf8 partial write of utf16 (#1943)
Diffstat (limited to 'src/string_immutable.zig')
-rw-r--r--src/string_immutable.zig48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/string_immutable.zig b/src/string_immutable.zig
index e949892e1..8cc2ab7b9 100644
--- a/src/string_immutable.zig
+++ b/src/string_immutable.zig
@@ -2545,6 +2545,54 @@ pub fn copyUTF16IntoUTF8WithBuffer(buf: []u8, comptime Type: type, utf16: Type,
const width: usize = replacement.utf8Width();
if (width > remaining.len) {
ended_on_non_ascii = width > 1;
+ switch (width) {
+ 2 => {
+ if (remaining.len > 0) {
+ //only first will be written
+ remaining[0] = @truncate(u8, 0xC0 | (replacement.code_point >> 6));
+ remaining = remaining[remaining.len..];
+ }
+ },
+ 3 => {
+ //only first to second written
+ switch (remaining.len) {
+ 1 => {
+ remaining[0] = @truncate(u8, 0xE0 | (replacement.code_point >> 12));
+ remaining = remaining[remaining.len..];
+ },
+ 2 => {
+ remaining[0] = @truncate(u8, 0xE0 | (replacement.code_point >> 12));
+ remaining[1] = @truncate(u8, 0x80 | (replacement.code_point >> 6) & 0x3F);
+ remaining = remaining[remaining.len..];
+ },
+ else => {},
+ }
+
+ },
+ 4 => {
+ //only 1 to 3 written
+ switch (remaining.len) {
+ 1 => {
+ remaining[0] = @truncate(u8, 0xF0 | (replacement.code_point >> 18));
+ remaining = remaining[remaining.len..];
+ },
+ 2 => {
+ remaining[0] = @truncate(u8, 0xF0 | (replacement.code_point >> 18));
+ remaining[1] = @truncate(u8, 0x80 | (replacement.code_point >> 12) & 0x3F);
+ remaining = remaining[remaining.len..];
+ },
+ 3 => {
+ remaining[0] = @truncate(u8, 0xF0 | (replacement.code_point >> 18));
+ remaining[1] = @truncate(u8, 0x80 | (replacement.code_point >> 12) & 0x3F);
+ remaining[3] = @truncate(u8, 0x80 | (replacement.code_point >> 0) & 0x3F);
+ remaining = remaining[remaining.len..];
+ },
+ else => {},
+ }
+ },
+
+ else => {},
+ }
break;
}