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