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

Obsah / Utility / TEXT / TextAddText

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


TextAddText - Přidání textu na konec textového řetězce

Funkce TextAddText přidá text z jiného textového řetězce na konec textového řetězce.


; -----------------------------------------------------------------------------
;                          Add text to end of text
; -----------------------------------------------------------------------------
; INPUT:	EAX = pointer to source TEXT
;		EBX = pointer to destination TEXT
; OUTPUT:	CY = memory error (text not changed)
; NOTES:	Source and destination text can be identical.
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr EAX ukazatel na zdrojovou textovou proměnnou, jejíž text se má přidat. Registr EBX obsahuje ukazatel na cílovou textovou proměnnou, ke které se má text přidat. Proměnné mohou ukazovat na identický textový řetězec. V případě chyby paměti je navrácen chybový příznak CY a obsah textové proměnné se nezmění.


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

TextAddText:	push	ecx		; push ECX
		push	edx		; push EDX

; ------------- Safe variant of copy text to itself

		mov	edx,[eax]	; EDX <- data buffer of source text
		cmp	edx,[ebx]	; is it identical text buffer?
		je	TextAddText4	; it is identical text buffer

Datové buffery se zdrojovým a cílovým bufferem se porovnají a jsou-li identické, provede se operace speciální obsluhou.


; ------------- Add text

TextAddText2:	mov	ecx,[edx+TEXT_Length] ; ECX <- length of source text
		add	edx,byte TEXT_Text ; EDX <- start of text
		call	TextAddBuf	; add text

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

		pop	edx		; pop EDX
		pop	ecx		; pop ECX
		ret

Jsou-li datové buffery rozdílné, může se k operaci bezpečně použít funkce TextAddBuf.


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

TextAddText4:	push	eax		; push EAX
		push	esi		; push ESI
		push	edi		; push EDI

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

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

Při shodě zdrojového a cílového textu se obsah textové proměnné zkopíruje pro zápis, pokud jsou data textové proměnné vlastněna více proměnnými. V případě chyby paměti se funkce ihned ukončí s chybovým příznakem.


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

		mov	eax,[ebx]	; EAX <- data buffer
		mov	eax,[eax+TEXT_Length] ; EAX <- length of data buffer
		mov	ecx,eax		; ECX <- text length
		shl	eax,1		; EAX <- new size of data buffer
		call	TextResize	; resize data buffer
		jc	TextAddText6	; memory error

Funkcí TextResize je změněna velikost textového bufferu a to na dvojnásobnou délku textu (protože víme, že zdrojový a cílový text jsou identické). V případě chyby paměti se funkce ihned ukončí s chybovým příznakem.


; ------------- Copy text (it exits with NC)

		mov	esi,[ebx]	; ESI <- data buffer
		add	esi,TEXT_Text	; ESI <- start of text
		lea	edi,[esi+ecx]	; EDI <- end of old text
		mov	eax,ecx		; EAX <- length of text
		shr	ecx,2		; ECX <- length of text in DWORDs
		rep	movsd		; copy text in DWORDs
		and	eax,byte 3	; EAX <- rest in last DWORD
		xchg	eax,ecx		; ECX <- rest in last DWORD
		rep	movsb		; copy rest of text

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

TextAddText6:	pop	edi		; pop EDI
		pop	esi		; pop ESI
		pop	eax		; pop EAX
		pop	edx		; pop EDX
		pop	ecx		; pop ECX
		ret

Přidávaný text se zkopíruje za starý konec textu - nejdříve po dvojslovech a poté zbytek v posledním dvojslovu. Protože jsou cílový i zdrojový buffer identické, provede se duplikace textu přímo v bufferu.


Obsah / Utility / TEXT / TextAddText