Odin's core/strings and all of core/fmt take an allocator; core/unicode/utf8 does not, because decoding is classification and every answer is a number. That line is where the port stops, and the refusals at the foot of the file say so by name rather than leaving a caller to find out. The accept_sizes table becomes a cond over the lead byte. Its four awkward rows are the ones a hand-written decoder gets wrong one at a time, so they are written out: 0xc0/0xc1 lead nothing, 0xe0 and 0xf0 have a raised second-byte floor against overlongs, 0xed has a lowered ceiling against the surrogates. Two divergences from Odin, both the parse-i64 argument again. A malformed sequence carries ok:false instead of decoding to U+FFFD, which is a real code point a caller cannot tell from a failure; and encode-rune! answers None rather than silently substituting U+FFFD for a rune it was not given. Width stays 1 on a bad byte, which is Odin's rule and load-bearing: every loop here advances by it, and a 0 would hang rather than answer wrong. split cannot return a sequence it would have to own, so the cursor is what survives. It follows the allocating strings.split rather than Odin's own iterator, which drops a trailing empty field and disagrees with it. Case conversion is byte-wise and not in place: a literal is emitted into read-only memory, so lowering (bytes "Hi") would type check and segfault.
Description
Languages
OCaml
67.2%
Emacs Lisp
15.2%
C
10.4%
HTML
2.9%
Standard ML
2.8%
Other
1.5%