Obsah / Utility / TEXT / TextLength, TextLengthChar, TextCheckOff
Zdrojový kód:
INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM
TextLength -
Zjištění délky textu v bajtech
Funkce TextLength zjistí
délku textu v bajtech.
; -----------------------------------------------------------------------------
; Get text length in bytes
; -----------------------------------------------------------------------------
; INPUT: EBX = pointer to TEXT
; OUTPUT: EAX = text length in bytes
; -----------------------------------------------------------------------------
TextLength: mov eax,[ebx] ; EAX <- pointer to TEXTDATA
mov eax,[eax+TEXT_Length] ; EAX <- get text length
ret
|
Na vstupu funkce obsahuje registr EBX
ukazatel na textovou proměnnou. Na výstupu obsahuje registr EAX
délku textu v bajtech. Funkce načte do regitru EAX ukazatel na
data textového řetězce a z těch zjistí délku textu.
TextLengthChar -
Zjištění délky textu ve znacích
Funkce TextLengthChar zjistí
délku textu ve znacích.
; -----------------------------------------------------------------------------
; Get text length in characters
; -----------------------------------------------------------------------------
; INPUT: EBX = pointer to TEXT
; OUTPUT: EAX = text length in characters
; -----------------------------------------------------------------------------
; ------------- Push registers
TextLengthChar: push ecx ; push ECX
push edx ; push EDX
push esi ; push ESI
; ------------- Prepare registers
mov esi,[ebx] ; ESI <- data buffer
xor edx,edx ; EDX <- 0, length accumulator
mov ecx,[esi+TEXT_Length] ; ECX <- length of text
add esi,TEXT_Text ; ESI <- start of text
jecxz TextLengthChar8 ; no text
; ------------- Get text length
xor eax,eax ; EAX <- 0
TextLengthChar2:lodsb ; AL <- load character
cmp al,0feh ; detection bytes?
jae TextLengthChar4 ; skip detection bytes
and al,0c0h ; mask bits
cmp al,80h ; is it first byte of character?
setne al ; AL <- 1 if it is first byte
add edx,eax ; increase text length
TextLengthChar4:loop TextLengthChar2 ; next character
; ------------- Pop registers
TextLengthChar8:xchg eax,edx ; EAX <- text length
pop esi ; pop ESI
pop edx ; pop EDX
pop ecx ; pop ECX
ret
|
Na vstupu funkce obsahuje registr EBX
ukazatel na textovou proměnnou. Na výstupu obsahuje registr EAX
délku textu ve znacích.
Funkce využívá té vlastnosti kódu
UTF-8, že další bajty kódu UTF-8 (kromě prvního bajtu)
mají hodnotu 80h až 0BFh. Proto text je procházen po bajtech a
pokud má hodnotu v rozsahu 0 až 7Fh nebo 0C0h až 0FDh, je
zvýšen čítač znaků. Bajty 0FEh a 0FFh jsou
synchronizační, v kódu UTF-8 by se neměly vyskytovat a proto
nejsou započítávany jako platné znaky.
TextCheckOff -
Kontrola platnosti offsetu bajtu
Funkce TextCheckOff ověří
platnost offsetu bajtu v textu.
; -----------------------------------------------------------------------------
; Check if byte offset is valid
; -----------------------------------------------------------------------------
; INPUT: EBX = pointer to TEXT
; EDX = byte offset
; OUTPUT: CY = byte offset is not valid (it is out of valid range)
; -----------------------------------------------------------------------------
TextCheckOff: push ebx ; push EBX
mov ebx,[ebx] ; EBX <- pointer to TEXTDATA
cmp edx,[ebx+TEXT_Length] ; check byte offset
pop ebx ; pop EBX
cmc ; CY = invalid byte offset
ret
|
Na vstupu funkce obsahuje registr EBX
ukazatel na textovou proměnnou. Registr EDX obsahuje offset
bajtu v textu. Funkce porovná offset bajtu s délkou textu a
pokud offset leží před textem nebo za jeho koncem, navrátí
nastavený příznak chyby CY.
Obsah / Utility / TEXT / TextLength, TextLengthChar, TextCheckOff