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