Obsah / Utility / CHARSET / CharUTF8Read
Zdrojový kód: INCLUDE\UTIL\CHARSET.INC, UTIL\CHARSET.ASM
CharUTF8Read - Načtení znaku z bufferu ve formátu UTF-8
Funkce CharUTF8Read načte znak z bufferu ve formátu UTF-8.
|
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ší vstupní data. Pokud ne, bude navrácen obsah registru EDX jako příznak chyby. Jsou-li k dospozici další data, je načten do registru EAX další připravený bajt. Jedná-li se o bajt s hodnotou 0 až 7Fh, je jeho hodnota ihned navrácena, protože znaky v tomto rozsahu (7 bitů) jsou v kódu UTF-8 ukládány jako jeden bajt.
|
Před další obsluhou je ověřena platnost bajtu. První bajt posloupnosti bajtů nesmí mít hodnotu v rozsahu 80h až 0BFh, tento rozsah hodnot je vyhrazen pro další bajty posloupnosti. Proto v případě výskystu na první pozici posloupnosti je navrácen chybový kód. Bajty s hodnotou 0FEh až 0FFh jsou rezervovány jako detekční bajty, s jejichž pomocí se rozlišuje kódování textů big-endian nebo little-endian, a proto se při načítání přeskakují a ignorují.
|
Je-li bajt v rozsahu 0C0h až 0DFh, jedná se o 2-bajtový kód (znak je 11-bitový). Zamaskováním nižších 5 bitů obdržíme nejvyšších 5 bitů kódu znaku, hodnota se uchová do registru AH. Dále je potřeba načíst další bajt dat - opět nejdříve s kontrolou registru ECX, zda jsou další data k dispozici a pokud ne, navrátí se chybový kód.
Pokud je k dispozici další bajt, načte se do registru AL a ověří se jeho platnost, zda leží v rozsahu 80h až 0BFh. Z bajtu se použije nižší 6 bitů, bity se sloučí s dříve načteným kódem v registru EAX. Do tohoto místa funkce skáče i z následujících obsluh včetně obsluhy načtení 31-bitového znaku, pro zajištění rozsahu čísla se proto kromě registru EAX použije i obsah příznaku CF, v němž je uchován případný nejvyšší bit 30.
|
Je-li bajt v rozsahu 0E0h až 0EFh, jedná se o 3-bajtový kód (znak je 16-bitový). Zamaskováním nižších 4 bitů obdržíme nejvyšší 4 bity kódu znaku, hodnota se uchová do registru AH. Dále je potřeba načíst další bajt dat - opět nejdříve s kontrolou registru ECX, zda jsou další data k dispozici a pokud ne, navrátí se chybový kód.
Pokud je k dispozici další bajt, načte se do registru AL a ověří se jeho platnost, zda leží v rozsahu 80h až 0BFh. Z bajtu se použije nižší 6 bitů, bity se sloučí s dříve načteným kódem v registru EAX.
|
Je-li bajt v rozsahu 0F0h až 0F7h, jedná se o 4-bajtový kód (znak je 21-bitový). Zamaskováním nižších 3 bitů obdržíme nejvyšší 3 bity kódu znaku, hodnota se uchová do registru AH. Dále je potřeba načíst další bajt dat - opět nejdříve s kontrolou registru ECX, zda jsou další data k dispozici a pokud ne, navrátí se chybový kód.
Pokud je k dispozici další bajt, načte se do registru AL a ověří se jeho platnost, zda leží v rozsahu 80h až 0BFh. Z bajtu se použije nižší 6 bitů, bity se sloučí s dříve načteným kódem v registru EAX.
|
Je-li bajt v rozsahu 0F8h až 0FBh, jedná se o 5-bajtový kód (znak je 26-bitový). Zamaskováním nižších 2 bitů obdržíme nejvyšší 2 bity kódu znaku, hodnota se uchová do registru AH. Dále je potřeba načíst další bajt dat - opět nejdříve s kontrolou registru ECX, zda jsou další data k dispozici a pokud ne, navrátí se chybový kód.
Pokud je k dispozici další bajt, načte se do registru AL a ověří se jeho platnost, zda leží v rozsahu 80h až 0BFh. Z bajtu se použije nižší 6 bitů, bity se sloučí s dříve načteným kódem v registru EAX.
|
Je-li bajt v rozsahu 0FCh až 0FDh, jedná se o 6-bajtový kód (znak je 31-bitový). Zamaskováním nejnižšího bitu obdržíme nejvyšší bit kódu znaku, hodnota se uchová do registru AH. Dále je potřeba načíst další bajt dat - opět nejdříve s kontrolou registru ECX, zda jsou další data k dispozici a pokud ne, navrátí se chybový kód.
Pokud je k dispozici další bajt, načte se do registru AL a ověří se jeho platnost, zda leží v rozsahu 80h až 0BFh. Z bajtu se použije nižší 6 bitů, bity se sloučí s dříve načteným kódem v registru EAX.
|
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 / CharUTF8Read