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

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