| >r u8!+ r> r> swap - true |
>r u8!+ r> r> swap - true |
| then ; |
then ; |
| |
|
| : u8addrlen ( u8-addr -- u ) |
: u8addrlen ( u8-addr u -- u ) drop |
| \ length of UTF-8 char starting at u8-addr (accesses only u8-addr) |
\ length of UTF-8 char starting at u8-addr (accesses only u8-addr) |
| c@ |
c@ |
| dup $80 u< if drop 1 exit endif |
dup $80 u< if drop 1 exit endif |
| |
|
| : -u8trailing-garbage ( addr u1 -- addr u2 ) |
: -u8trailing-garbage ( addr u1 -- addr u2 ) |
| 2dup + dup u8<< ( addr u1 end1 end2 ) |
2dup + dup u8<< ( addr u1 end1 end2 ) |
| 2dup dup u8addrlen + = if \ last character ok |
2dup dup over over - u8addrlen + = if \ last character ok |
| 2drop |
2drop |
| else |
else |
| nip nip over - |
nip nip over - |
| [ [IFDEF] x-width ] |
[ [IFDEF] x-width ] |
| ['] u8width is x-width |
['] u8width is x-width |
| [ [THEN] ] |
[ [THEN] ] |
| |
[ [IFDEF] x-size ] |
| |
['] u8addrlen is x-size |
| |
[ [THEN] ] |
| ['] -u8trailing-garbage is -trailing-garbage |
['] -u8trailing-garbage is -trailing-garbage |
| ; |
; |
| |
|