Obsah / Utility / CHARSET / CharUTF16LER
Zdrojový kód: INCLUDE\UTIL\CHARSET.INC, UTIL\CHARSET.ASM
CharUTF16LER - Načtení znaku z bufferu ve formátu UTF-16LE
Funkce CharUTF16LER načte znak z bufferu ve formátu UTF-16LE, little endian (tj. formát PC Intel, v paměti je uložen nejdříve nižší bajt dat a poté vyší bajt).
|
Na vstupu funkce obsahuje registr ESI ukazatel na data ve vstupním bufferu, registr ECX počet bajtů ve vstupním bufferu a registr EDX Unicode kód znaku, který se použije v případě neplatných dat v bufferu. Na výstupu z funkce je v registru EAX navrácen Unicode kód načteného znaku (nebo neplatný kód z registru EDX, pokud nejsou k dispozici další data), v registru ESI nový ukazatel na vstupní data a v registru ECX nová velikost vstupních dat.
|
Na začátku funkce je nejdříve provedena kontrola, zda jsou k dispozici další 2 bajty vstupních dat. Pokud ne, bude navrácen obsah registru EDX jako příznak chyby. Jsou-li k dospozici další 2 bajty, je načteno do registru AX další připravené slovo dat.
|
Leží-li hodnota prvního slova dat v rozsahu 0000h až 0D7FFh nebo 0E000h až 0FFFFh, jedná se o platný kód znaku o velikosti 16 bitů a funkce se ihned ukončí. Slovo s hodnotou 0DC00h až 0DFFFh je pro první slovo kódu neplatné a funkce se v tom případě ukončí s chybou. Jinak se pokračuje obsluhou kódu o velikosti 2 slov.
|
Kód o velikosti 2 slov ukládá znaky o velikosti 20 bitů. Z prvního slova je uchováno 10 bitů a ze vstupního bufferu je načteno další slovo. Druhé slovo má povolený rozsah hodnot 0DC00h až 0DFFFh. Je-li rozsah hodnot v pořádku, uchová se z druhého slova 10 bitů a sloučí se do jednoho kódu s 10 bity z prvního slova. K výslednému kódu se přičte korekce 10000h, protože 2-slovní kódy ukládají znaky s kódem 10000h a výše.
|
V případě neplatného znaku se navrátí ukazatel zdrojových dat (pokud byl posunut) a navrátí se v registru EAX buď neplatný znak z registru EDX nebo implicitní neplatný znak UNINOASC, pokud byl obsah registru EDX nulový.
Obsah / Utility / CHARSET / CharUTF16LER