fabric: UTF-8 decoder (DECODE-UTF8)
Punch list §25 item 4.3.6a complete. capsules/fabric.4th blocks 4918-4920: UTF8-SEQ-LEN/UTF8-CONT? verbatim from §27.6.2, DECODE-UTF8 dispatching to four UTF8-ASSEMBLE-N helpers (1/2/3/4-byte). Factored into helpers after the single-word draft hit mkcapsule's real 64-char x 16-line block limit. Verified live on amd64: a 6-byte test buffer (ASCII + deg-sign + em-dash) decoded to 65/176/8212 across three sequential calls, exact match against hand-computed codepoints, buffer fully consumed. Three-arch acceptance boot clean, Stadium conservation unaffected. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
82e948afe9
commit
24d6b9e20e
@@ -197,3 +197,45 @@ VARIABLE GX1 VARIABLE GY1 VARIABLE GX2 VARIABLE GY2
|
||||
GX2 @ EM-X GY2 @ EM-Y 0
|
||||
GCOLOR @
|
||||
LINE ;
|
||||
|
||||
Block 4918
|
||||
( UTF-8 lead-byte classification. Item 4.3.6a. )
|
||||
: UTF8-SEQ-LEN ( lead -- n ) ( 0 = invalid lead byte )
|
||||
DUP 128 < IF DROP 1 EXIT THEN
|
||||
DUP 224 AND 192 = IF DROP 2 EXIT THEN
|
||||
DUP 240 AND 224 = IF DROP 3 EXIT THEN
|
||||
DUP 248 AND 240 = IF DROP 4 EXIT THEN
|
||||
DROP 0 ;
|
||||
: UTF8-CONT? ( byte -- flag ) ( true if 10xxxxxx )
|
||||
192 AND 128 = ;
|
||||
|
||||
Block 4919
|
||||
( UTF-8 codepoint assembly, per byte-length. Item 4.3.6a. )
|
||||
VARIABLE UADDR VARIABLE ULEN VARIABLE ULEAD
|
||||
VARIABLE USEQLEN VARIABLE UCP
|
||||
: UTF8-ASSEMBLE-1 ( -- cp ) ULEAD @ ;
|
||||
: UTF8-ASSEMBLE-2 ( -- cp )
|
||||
ULEAD @ 31 AND 6 LSHIFT
|
||||
UADDR @ 1+ C@ 63 AND OR ;
|
||||
: UTF8-ASSEMBLE-3 ( -- cp )
|
||||
ULEAD @ 15 AND 12 LSHIFT
|
||||
UADDR @ 1+ C@ 63 AND 6 LSHIFT OR
|
||||
UADDR @ 2 + C@ 63 AND OR ;
|
||||
|
||||
Block 4920
|
||||
( UTF8-ASSEMBLE-4 + DECODE-UTF8 dispatch. Item 4.3.6a. )
|
||||
: UTF8-ASSEMBLE-4 ( -- cp )
|
||||
ULEAD @ 7 AND 18 LSHIFT
|
||||
UADDR @ 1+ C@ 63 AND 12 LSHIFT OR
|
||||
UADDR @ 2 + C@ 63 AND 6 LSHIFT OR
|
||||
UADDR @ 3 + C@ 63 AND OR ;
|
||||
: DECODE-UTF8 ( addr u -- codepoint addr' u' )
|
||||
ULEN ! UADDR !
|
||||
UADDR @ C@ ULEAD !
|
||||
ULEAD @ UTF8-SEQ-LEN USEQLEN !
|
||||
USEQLEN @ 1 = IF UTF8-ASSEMBLE-1 UCP ! ELSE
|
||||
USEQLEN @ 2 = IF UTF8-ASSEMBLE-2 UCP ! ELSE
|
||||
USEQLEN @ 3 = IF UTF8-ASSEMBLE-3 UCP ! ELSE
|
||||
USEQLEN @ 4 = IF UTF8-ASSEMBLE-4 UCP ! ELSE
|
||||
65533 UCP ! 1 USEQLEN ! THEN THEN THEN THEN
|
||||
UCP @ UADDR @ USEQLEN @ + ULEN @ USEQLEN @ - ;
|
||||
|
||||
Reference in New Issue
Block a user