Obsah / Utility / TEXT / TextAddBufCP
Zdrojový kód:
INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM
TextAddBufCP-
Přidání textu v dané kódové stránce na konec textového
řetězce
Funkce TextAddBufCP přidá
text z bufferu v dané kódové stránce na konec textového
řetězce.
; -----------------------------------------------------------------------------
; Add buffer in given code page to end of text
; -----------------------------------------------------------------------------
; INPUT: AX = code page of text in buffer
; EBX = pointer to TEXT
; ECX = length of text in buffer (in bytes)
; EDX = invalid character (0 = use default)
; ESI = pointer to buffer with text
; OUTPUT: CY = memory error (text not changed)
; -----------------------------------------------------------------------------
|
Na vstupu funkce obsahuje registr AX
číslo kódové stránky, registr EBX ukazatel na textovou
proměnnou, ke které se má obsah bufferu přidat, registr ECX
délku textu v bufferu v bajtech, EDX je ukazatel na buffer s
přidávaným textem. V případě chyby paměti je navrácen
chybový příznak CY a obsah textové proměnné se nezmění.
; ------------- Push registers
TextAddBufCP: push edi ; push EDI
push ebp ; push EBP
; ------------- Copy text on write
call TextCopyWrite ; copy text on write
jc TextAddBufCP4 ; 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.
; ------------- Get size of new data (-> EAX)
push eax ; push EAX (source code page)
push ebx ; push EBX (pointer to TEXT)
mov bx,CP_UTF8 ; BX <- destination codepage UTF-8
xor edi,edi ; EDI <- 0, no destination buffer
call CharTrans ; get length of destination buffer
pop ebx ; pop EBX (pointer to TEXT)
|
Pomocí funkce CharTrans s vynulovaným
registrem EDI na vstupu se zjistí délka přidávaného textu po
konverzi na UTF-8 v bajtech.
; ------------- Resize text 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
xchg eax,ebp ; EBP <- new length of text
pop eax ; pop EAX (source code page)
jc TextAddBufCP4 ; memory error
sub ebp,edi ; EBP <- length of added text
|
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.
; ------------- Convert text
push eax ; push EAX (source code page)
push ebx ; push EBX (pointer to TEXT)
add edi,[ebx] ; EDI <- text string data
add edi,byte TEXT_Text ; EDI <- end of old data
mov bx,CP_UTF8 ; BX <- destination codepage UTF-8
call CharTrans ; convert text
pop ebx ; pop EBX (pointer to TEXT)
pop eax ; pop EAX (source code page)
; ------------- Pop registers
clc ; clear error flag
TextAddBufCP4: pop ebp ; pop EBP
pop edi ; pop EDI
ret
|
Přidávaný text se zkonvertuje pomocí
funkce CharTrans ze zdrojového bufferu do kódu UTF-8 za starý
konec textu.
Obsah / Utility / TEXT / TextAddBufCP