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

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