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

Obsah / Utility / TEXT / TextInitChar

Zdrojový kód: INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM


TextInitChar - Inicializace textového řetězce jedním znakem

Funkce TextInitChar inicializuje textovou proměnnou jedním znakem.


; -----------------------------------------------------------------------------
;                 Initialize text string with one character
; -----------------------------------------------------------------------------
; INPUT:	EAX = Unicode character
;		EBX = pointer to TEXT
; OUTPUT:	CY = memory error (text becomes empty)
; -----------------------------------------------------------------------------

Funkce TextInitChar inicializuje novou textovou proměnnou, na niž ukazuje ukazatel v registru EBX, jedním znakem v ködu Unicode. Kód znaku je v registru EAX. Pokud dojde k chybě paměti, funkce navrátí příznak chyby CY a textová proměnná bude inicializována na prázdný text.


; ------------- Push registers

TextInitChar:	push	eax		; push EAX
		push	edi		; push EDI
		push	ebp		; push EBP

; ------------- Prepare length of character (-> EAX, push character -> EBP)

		xor	edi,edi		; EDI <- 0, character length counter
		mov	ebp,eax		; EBP <- push EAX (character)
		call	CharUTF8Size	; get character size
		xchg	eax,edi		; EAX <- text length

Po úschově registrů je pomocí funkce CharUTF8Size zjištěna velikost nového znaku v bajtech. Délka textu je uložena do registru EAX.


; ------------- Create new text buffer

		mov	dword [ebx],EmptyTextData ; set pointer to empty text
		call	TextNew		; create new text buffer
		jc	TextInitChar2	; memory error

Pomocí funkce TextNew je alokován nový datový buffer o délce textu EAX. Pokud nastane chyba paměti, funkce se ukončí s chybovým kódem CY. Pro tento případ je proměnná nejdříve inicializována na prázdný text EmptyTextData.


; ------------- Store character into buffer

		xchg	eax,ebp		; EBP <- size of buffer, EAX <- char
		mov	edi,[ebx]	; EDI <- new text data
		add	edi,TEXT_Text	; EDI <- start of buffer
		call	CharUTF8Write	; write character into buffer

; ------------- Pop registers

		clc			; clear error flag
TextInitChar2:	pop	ebp		; pop EBP
		pop	edi		; pop EDI
		pop	eax		; pop EAX
		ret

Znak je uložen do datového bufferu pomocí funkce CharUTF8Write. Ukládací adresa je zjištěna z ukazatele na data textové proměnné (načteného z textové proměnné [EBX]) posunutého na začátek textu v datech textového řetězce.


Obsah / Utility / TEXT / TextInitChar