diff options
author | 2023-01-30 17:21:23 -0300 | |
---|---|---|
committer | 2023-01-30 12:21:23 -0800 | |
commit | aa10799d8a9a69b828e36cd9d295f6d5867fb511 (patch) | |
tree | fde30e5b530ce25acb417e766e96ee3710eedcc3 /src/string_immutable.zig | |
parent | ec2c16fefa8b98efaa1ccf84f18eea0a12c1c9ef (diff) | |
download | bun-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.zig | 48 |
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; } |