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