Files
ww/lib
Hojun-Cho 793734c1e0 lib/encoding/utf8+test: Hare port (decoder / next / encoderune / runesz / utf8sz / validate)
Hoehrmann DFA from ref/hare/encoding/utf8/decodetable.ha flattened
to 1D [2048]i8 (task #20: 2D-array jagged cgen still pending);
encoderune takes a caller buffer matching lib/encoding/hex.encode;
done/more/invalid all spelled as plain void aliases per lib/io's
eof precedent. Surface ports decoder + decode + next + encoderune
+ runesz + utf8sz + validate from ref/hare/encoding/utf8/{types,
decode,encode,rune}.ha. next() polarity rewritten from Hare's
`(state-1):uint >> 31` to an explicit `if state == 0` branch
because ww's uint is 64-bit (cmd/wcc/type.c:58); same effect, no
hidden 32-bit assumption.

Deferred (no in-tree callers): prev, slice, position, remaining,
appendrune, strencode, strdecode. String iteration (chars/
newchars/nextchar in the session-4 draft) dropped per Hare
discipline — belongs in lib/strings::iterator, not encoding/utf8.

Tests:
  - 968_utf8_run drives lib/encoding/utf8/utf8test.ww via ww run.
    21 @test fns: boundaries (ASCII, 2-byte, 3-byte, 4-byte
    encode/decode), surrogate/overlong/out-of-range/bad-continuation
    reject, max-in-range (U+10FFFF) accept, truncated→more, done@EOI,
    validate empty/mixed/malformed, encode/decode roundtrip. Two
    rows ported from ref/hare/encoding/utf8/decode.ha @test that
    were missing in the session-4 draft: bad-continuation
    [0xC2,0xFF]→invalid and max-in-range [0xF4,0x8F,0xBF,0xBF]→
    U+10FFFF.
  - 9xx stdlib runtime slot range extended from 970-989 to 960-989
    to accommodate utf8 at 968 (970-989 block was full).

90/90 ok. 995_self_rebuild stays green (ww2==ww3==ww4 byte-id).
2026-05-17 23:46:34 +09:00
..
2026-05-17 02:51:15 +09:00