Obsah / Utility / TEXT / TextGetChar
Zdrojový kód:
INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM
TextGetChar -
Načtení znaku z textu
Funkce TextGetChar načte z
textu znak z daného ukazatele pozice.
; -----------------------------------------------------------------------------
; Get character from text
; -----------------------------------------------------------------------------
; INPUT: EBX = pointer to TEXT
; EDX = character position (it may be out of range)
; OUTPUT: EAX = Unicode character (or UNINOASC on error)
; EDX = new character position
; CY = error, position is out of range (EAX = UNINOASC)
; -----------------------------------------------------------------------------
|
Na vstupu funkce obsahuje registr EBX
ukazatel na textovou proměnnou a registr EDX pozici (offset) v
textu, pozice může být mimo platný rozsah. Funkce navrátí v
registru EAX znak z dané pozice v kódu Unicode, ukazatel EDX se
posune na další znak. Pokud pozice leží mimo platný rozsah,
navrátí funkce nastavený příznak chyby CY a registr EAX
obsahuje znak UNINOASC (otazník).
; ------------- Push registers
TextGetChar: push ecx ; push ECX
push esi ; push ESI
push edi ; push EDI
; ------------- Get data and length of text
mov edi,[ebx] ; ESI <- data buffer
mov ecx,[edi+TEXT_Length] ; ECX <- length of text
; ------------- Check character position
cmp edx,ecx ; check character position
jae TextGetChar6 ; position is not valid
|
Do registru EDI se připraví ukazatel na
textový buffer a do registru ECX délka textu v bajtech.
Porovnáním pozice v textu s délkou textu se ověří platnost
pozice.
; ------------- Read character from buffer
TextGetChar2: sub ecx,edx ; ECX <- remaining bytes
lea esi,[edi+TEXT_Text+edx] ; ESI <- character position
xor edx,edx ; EDX <- default character
call CharUTF8Read ; read character from buffer
; ------------- New character position (it exits with NC)
sub esi,edi ; ESI <- new offset in buffer
lea edx,[esi-TEXT_Text] ; EDX <- new character position
; ------------- Pop registers
TextGetChar4: pop edi ; pop EDI
pop esi ; pop ESI
pop ecx ; pop ECX
ret
|
Je-li pozice v textu platná, načte se
znak z dané pozice pomocí funkce CharUTF8Read a ukazatel v
textu se posune na další pozici v textu.
; ------------- Check if position is negative
TextGetChar6: mov eax,UNINOASC ; EAX <- invalid character
or edx,edx ; is position negative?
js TextGetChar8 ; position is negative
; ------------- Position is behind end of text
mov edx,ecx ; EDX <- limit maximal position
stc ; set error flag
jmp short TextGetChar4
; ------------- Position is before start of text
TextGetChar8: xor edx,edx ; EDX <- 0, minimal position
stc ; set error flag
jecxz TextGetChar4 ; no text
jmp short TextGetChar2
|
Není-li pozice v textu platná, připraví
se do registru EAX znak neplatného znaku k navrácení. Pokud
leží pozice za koncem textu, omezí se na offset konce textu a
funkce se navrátí s chybou. pokud pozice leží před
začátkem textu, omezí se pozice na offset 0 a buď se
navrátí neplatný znak (pokud je text prázdný) nebo se načte
první znak z textu.
Obsah / Utility / TEXT / TextGetChar