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

Obsah / Utility / TEXT / TextAddChar

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


TextAddChar - Přidání znaku na konec textového řetězce

Funkce TextAddChar přidá znak v kódu Unicode na konec textového řetězce.


; -----------------------------------------------------------------------------
;                     Add one character to end of text
; -----------------------------------------------------------------------------
; INPUT:	EAX = Unicode character
;		EBX = pointer to TEXT
; OUTPUT:	CY = memory error (text not changed)
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr EAX přidávaný znak v kódu Unicode. Registr EBX obsahuje ukazatel na textovou proměnnou, ke které se má znak přidat. V případě chyby paměti je navrácen chybový příznak CY a obsah textové proměnné se nezmění.


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

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

; ------------- Copy text on write

		call	TextCopyWrite	; copy text on write
		jc	TextAddChar2	; memory error

Před modifikací obsahu textového řetězce je nejdříve provedena duplikace textu funkcí TextCopyWrite v případě, že textová proměnná není jediným vlastníkem dat textového řetězce (nebo jedná-li se o konstantní text). V případě chyby paměti je funkce ukončena s chybovým příznakem CY.


; ------------- 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

Pomocí funkce CharUTF8Size je zjištěna velikost přidávaného znaku v bajtech.


; ------------- Resize data buffer

		mov	edi,[ebx]	; EDI <- data buffer
		mov	edi,[edi+TEXT_Length] ; EDI <- old length of text
		add	eax,edi		; EAX <- new length of text
		call	TextResize	; resize data buffer
		jc	TextAddChar2	; memory error

Funkcí TextResize se realokuje velikost datového bufferu. Délka textu se zvýší o dělku znaku, která je uložena v registru EDI. V případě chyby paměti je funkce ukončena s chybou a obsah textu zůstane nezměněn.


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

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

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

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

Znak je pomocí funkce CharUTF8Write uložen na konec textu v bufferu.


Obsah / Utility / TEXT / TextAddChar