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