asm_dip/toolchain/fasmw17332/INCLUDE/ENCODING/UTF8.INC
2024-11-24 23:13:28 -05:00

78 lines
2.2 KiB
C++

; UTF-8
macro du [arg]
{ local current,..input,char
if arg eqtype ''
virtual at 0
..input::
db arg
count = $
end virtual
current = 0
while current < count
load char byte from ..input:current
wide = char
current = current + 1
if char > 0C0h
if char < 0E0h
wide = char and 11111b
load char byte from ..input:current
wide = wide shl 6 + (char and 111111b)
current = current + 1
else if char < 0F0h
wide = char and 1111b
load char byte from ..input:current
wide = wide shl 6 + (char and 111111b)
load char byte from ..input:current+1
wide = wide shl 6 + (char and 111111b)
current = current + 2
else if char < 0F8h
wide = char and 111b
load char byte from ..input:current
wide = wide shl 6 + (char and 111111b)
load char byte from ..input:current+1
wide = wide shl 6 + (char and 111111b)
load char byte from ..input:current+2
wide = wide shl 6 + (char and 111111b)
current = current + 3
else if char < 0FCh
wide = char and 11b
load char byte from ..input:current
wide = wide shl 6 + (char and 111111b)
load char byte from ..input:current+1
wide = wide shl 6 + (char and 111111b)
load char byte from ..input:current+2
wide = wide shl 6 + (char and 111111b)
load char byte from ..input:current+3
wide = wide shl 6 + (char and 111111b)
current = current + 4
else
wide = char and 1
load char byte from ..input:current
wide = wide shl 6 + (char and 111111b)
load char byte from ..input:current+1
wide = wide shl 6 + (char and 111111b)
load char byte from ..input:current+2
wide = wide shl 6 + (char and 111111b)
load char byte from ..input:current+3
wide = wide shl 6 + (char and 111111b)
load char byte from ..input:current+4
wide = wide shl 6 + (char and 111111b)
current = current + 5
end if
end if
if wide < 10000h
dw wide
else
dw 0D7C0h + wide shr 10,0DC00h or (wide and 3FFh)
end if
end while
else
dw arg
end if }
struc du [args]
{ common label . word
du args }