Add new utf16 procedures: decode, decode_to_utf8

This commit is contained in:
gingerBill
2021-11-27 14:57:20 +00:00
parent db9326f31d
commit 7876660d8c

View File

@@ -1,5 +1,7 @@
package utf16
import "core:unicode/utf8"
REPLACEMENT_CHAR :: '\ufffd'
MAX_RUNE :: '\U0010ffff'
@@ -80,3 +82,49 @@ encode_string :: proc(d: []u16, s: string) -> int {
}
return n
}
decode :: proc(d: []rune, s: []u16) -> (n: int) {
for i := 0; i < len(s); i += 1 {
if n >= len(d) {
return
}
r := rune(REPLACEMENT_CHAR)
switch c := s[i]; {
case c < _surr1, _surr3 <= c:
r = rune(c)
case _surr1 <= c && c < _surr2 && i+1 < len(s) &&
_surr2 <= s[i+1] && s[i+1] < _surr3:
r = decode_surrogate_pair(rune(c), rune(s[i+1]))
i += 1
}
d[n] = r
n += 1
}
return
}
decode_to_utf8 :: proc(d: []byte, s: []u16) -> (n: int) {
for i := 0; i < len(s); i += 1 {
if n >= len(d) {
return
}
r := rune(REPLACEMENT_CHAR)
switch c := s[i]; {
case c < _surr1, _surr3 <= c:
r = rune(c)
case _surr1 <= r && r < _surr2 && i+1 < len(s) &&
_surr2 <= s[i+1] && s[i+1] < _surr3:
r = decode_surrogate_pair(rune(r), rune(s[i+1]))
i += 1
}
b, w := utf8.encode_rune(rune(r))
n += copy(d[n:], b[:w])
}
return
}