Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

Obsah / Utility / CHARSET / CharUTF16LES, CharUTF16BES

Zdrojový kód: INCLUDE\UTIL\CHARSET.INC, UTIL\CHARSET.ASM


CharUTF16LES, CharUTF16BES - Zjištění velikosti znaku v kódu UTF-16LE/UTF-16BE

Funkce CharUTF16LES/CharUTF16BES navrátí velikost znaku v kódu UTF-16LE/UTF-16BE.


; -----------------------------------------------------------------------------
;                Size of character in UTF-16LE and UTF-16BE
; -----------------------------------------------------------------------------
; INPUT:	EAX = Unicode character
;		EDI = data counter
; OUTPUT:	EDI = new data counter
; DESTROYS:	EAX
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr EAX Unicode kód znaku a registr EDI čítač velikosti dat. Na výstupu funkce je čítač v registru EDI zvýšení o velikost dat, která by znak zabral ve výstupním bufferu. Obsah registru EAX je funkcí zničen.


CharUTF16LES:
CharUTF16BES:	cmp	eax,0ffffh	; 2 words?
		seta	al		; AL <- 1 if 2 words, 0 if 1 word
		movzx	eax,al		; EAX <- 1 if 2 words, 0 if 1 word
		inc	eax		; EAX <- 2 if 2 words, 1 if 1 word
		shl	eax,1		; EAX <- 4 if 2 words, 2 if 1 word
		add	edi,eax		; increase data counter
		ret

Funkce obsluhuje pouze 2 případy - znaky s kódem 0 až 0FFFFh a znaky s vyšším kódem. Namísto větvení funkce skokovou instrukcí se použije rychlejší registrová operace. Podle výsledku testu velikosti kódu znaku se nastaví obsah registru AL na hodnotu 1 pro kód větší než 0FFFFh a na hodnotu 0 pro kód menší. Přičtením 1 a vynásobením výsledku 2 se obdrží výsledná velikost znaku v bufferu - tj. 4 nebo 2 bajty.


Obsah / Utility / CHARSET / CharUTF16LES, CharUTF16BES