aboutsummaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-08-02 12:20:35 +0100
committergingerBill <gingerBill@users.noreply.github.com>2025-08-02 12:20:35 +0100
commitbb4bc316a4bd86774953f1e8fcefffb5ed8bbf37 (patch)
treebd48bf739dd69c0bc6578fb2a69cc5823ddee6f8 /base
parentae02d3d02d2eb5132fa7c6573ed7db20d7e18f3e (diff)
`for in string16`; Support `string16` across core
Diffstat (limited to 'base')
-rw-r--r--base/runtime/internal.odin62
1 files changed, 62 insertions, 0 deletions
diff --git a/base/runtime/internal.odin b/base/runtime/internal.odin
index 660af58ab..4f9509b23 100644
--- a/base/runtime/internal.odin
+++ b/base/runtime/internal.odin
@@ -781,6 +781,68 @@ string_decode_last_rune :: proc "contextless" (s: string) -> (rune, int) {
return r, size
}
+
+string16_decode_rune :: #force_inline proc "contextless" (s: string16) -> (rune, int) {
+ REPLACEMENT_CHAR :: '\ufffd'
+ _surr1 :: 0xd800
+ _surr2 :: 0xdc00
+ _surr3 :: 0xe000
+ _surr_self :: 0x10000
+
+ r := rune(REPLACEMENT_CHAR)
+
+ if len(s) < 1 {
+ return r, 0
+ }
+
+ w := 1
+ switch c := s[0]; {
+ case c < _surr1, _surr3 <= c:
+ r = rune(c)
+ case _surr1 <= c && c < _surr2 && 1 < len(s) &&
+ _surr2 <= s[1] && s[1] < _surr3:
+ r1, r2 := rune(c), rune(s[1])
+ if _surr1 <= r1 && r1 < _surr2 && _surr2 <= r2 && r2 < _surr3 {
+ r = (r1-_surr1)<<10 | (r2 - _surr2) + _surr_self
+ }
+ w += 1
+ }
+ return r, w
+}
+
+string16_decode_last_rune :: proc "contextless" (s: string16) -> (rune, int) {
+ REPLACEMENT_CHAR :: '\ufffd'
+ _surr1 :: 0xd800
+ _surr2 :: 0xdc00
+ _surr3 :: 0xe000
+ _surr_self :: 0x10000
+
+ r := rune(REPLACEMENT_CHAR)
+
+ if len(s) < 1 {
+ return r, 0
+ }
+
+ n := len(s)-1
+ c := s[n]
+ w := 1
+ if _surr2 <= c && c < _surr3 {
+ if n >= 1 {
+ r1 := rune(s[n-1])
+ r2 := rune(c)
+ if _surr1 <= r1 && r1 < _surr2 {
+ r = (r1-_surr1)<<10 | (r2 - _surr2) + _surr_self
+ }
+ w = 2
+ }
+ } else if c < _surr1 || _surr3 <= c {
+ r = rune(c)
+ }
+ return r, w
+}
+
+
+
abs_complex32 :: #force_inline proc "contextless" (x: complex32) -> f16 {
p, q := abs(real(x)), abs(imag(x))
if p < q {