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

Obsah / Utility / TEXT / TextAddBuf

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


TextAddBuf - Přidání textu z bufferu UTF-8 na konec textového řetězce

Funkce TextAddBuf přidá text z bufferu v kódu UTF-8 na konec textového řetězce.


; -----------------------------------------------------------------------------
;                     Add buffer (in UTF-8) to end of text
; -----------------------------------------------------------------------------
; INPUT:	EBX = pointer to TEXT
;		ECX = length of text in buffer (in bytes)
;		EDX = pointer to buffer with text in UTF-8
; OUTPUT:	CY = memory error (text not changed)
; NOTES:	Be careful to not copy text string to itself, it can be
;		  unsafe in multi-thread (source can be freed prematurely).
; 		Detection bytes 0feh and 0ffh should be eliminated.
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr EBX ukazatel na textovou proměnnou, ke které se má obsah bufferu přidat. Registr ECX obsahuje délku textu v bufferu v bajtech, EDX je ukazatel na buffer s přidávaným textem v kódu UTF-8. V případě chyby paměti je navrácen chybový příznak CY a obsah textové proměnné se nezmění.

Nemělo by dojít ke kopírování textu sám do sebe - ve vícevláknovém prostředí se může zdrojový buffer stát neplatným dříve než se operace dokončí.


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

TextAddBuf:	push	eax		; push EAX
		push	ecx		; push ECX
		push	esi		; push ESI
		push	edi		; push EDI

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

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

Na začátku funkce 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
		lea	edi,[eax+TEXT_Text] ; EDI <- offset of old end of text
		add	eax,ecx		; EAX <- new size of data buffer
		call	TextResize	; resize data buffer
		jc	TextAddBuf4	; memory error

Funkcí TextResize je změněna velikost textového bufferu. Délka textu je stanovena jako původní délka textu zvýšená o délku nového přidávaného textu. V případě chyby paměti se funkce ihned ukončí s chybovým příznakem.


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

		add	edi,[ebx]	; EDI <- old end of text
		mov	esi,edx		; ESI <- source buffer
		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

TextAddBuf4:	pop	edi		; pop EDI
		pop	esi		; pop ESI
		pop	ecx		; pop ECX
		pop	eax		; pop EAX
		ret

Přidávaný text se zkopíruje za starý konec textu - nejdříve po dvojslovech a poté zbytek v posledním dvojslovu.


Obsah / Utility / TEXT / TextAddBuf