Obsah / Utility / TEXT / TextWords
Zdrojový kód:
INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM
TextWords - Konverze
textu na slova (první písmeno velké)
Funkce TextWords zkonvertuje
text na slova - tj. první písmeno každého slova je velké
písmeno, ostatní jsou malá.
; -----------------------------------------------------------------------------
; Convert text to words (first letter of word is capital)
; -----------------------------------------------------------------------------
; INPUT: EAX = pointer to source TEXT
; EBX = pointer to destination TEXT
; OUTPUT: CY = memory error, destination TEXT becomes empty
; NOTES: Source and destination may be identical.
; -----------------------------------------------------------------------------
|
Na vstupu funkce obsahuje registr EAX
ukazatel na zdrojovou textovou proměnnou a registr EBX ukazatel
na cílovou textovou proměnnou, do které bude uložen
zkonvertovaný text. Zdrojová a cílová proměnná mohou být
identické (tj. operaci lze provést přímo v jedné textové
proměnné). V případě chyby navrátí funkce příznak chyby
CY a cílová proměnná bude vyprázdněna.
; ------------- Check if source and destination is identical
TextWords: cmp eax,ebx ; is source and destination identical?
je short TextWords8 ; source is identical with destination
...................
; ------------- Identical source and destination variable (here is EAX == EBX)
TextWords8: push eax ; create temporary variable in stack
mov ebx,esp ; EBX <- temporary variable
push eax ; push EAX (destination variable)
mov eax,[eax] ; EAX <- TEXTDATA buffer
call TextAttach ; attach text to temporary variable
xchg eax,ebx ; EAX <- temporary variable
pop ebx ; EBX <- destination variable
call TextWords1 ; convert text
pushf ; push flags
xchg eax,ebx ; EBX <- temporary, EAX <- destination
call TextDetach ; detach temporary variable
popf ; pop flags
pop ebx ; delete temporary variable
mov ebx,eax ; EBX <- destination variable
ret
|
Na začátku funkce je porovnáním
zdrojové a cílové proměnné ověřeno, zda se nejedná o
identickou proměnnou, v tom případě proběhne konverze
zvláštní obsluhou. V zásobníku je vytvořena přechodná
textová proměnná, k ní je připojen konvertovaný text, z
přechodné proměnné je do výstupní proměnné provedena
požadovaná konverze a přechodná proměnná se uvolní ze
zásobníku.
; ------------- Push registers
TextWords1: push eax ; push EAX
push ecx ; push ECX
push edx ; push EDX
push esi ; push ESI
push edi ; push EDI
push ebp ; push EBP
; ------------- Empty destination text variable
call TextEmpty ; empty text
|
V případě rozdílných proměnných se
nejdříve cílová proměnná vyprázdní pro případ, že
funkce bude předčasně ukončena.
; ------------- Prepare source pointers
mov esi,[eax] ; ESI <- source data
mov ecx,[esi+TEXT_Length] ; ECX <- size of source text
add esi,TEXT_Text ; ESI <- start of source text
xor edx,edx ; EDX <- 0, default invalid character
|
Do registru ESI se připraví ukazatel na
data zdrojového textu, do registru EAX délka zdrojového textu,
registr ESI se posune na začátek zdrojového textu a do
registru EDX se připraví nula jako příznak použití
implicitního neplatného znaku.
; ------------- Get required size of buffer
push ebx ; push EBX
mov ax,CP_UTF8 ; AX <- source codepage UTF-8
mov ebx,eax ; BX <- destination codepage UTF-8
xor edi,edi ; EDI <- 0, no destination buffer
call CharTransWords ; get size of destination buffer
pop ebx ; pop EBX
|
Voláním funkce CharTransWords s
vynulovaným registrem EDI (který má obsahovat adresu
cílového bufferu) se zjistí požadovaná velikost cílového
bufferu, velikost bude navrácena v registru EAX.
; ------------- Create destination buffer (it need not be detached)
call TextNew ; create data buffer
jc TextWords4 ; memory error
|
Pomocí funkce TextNew se vytvoří nový
datový buffer pro velikost textu EAX. Adresa bufferu se uloží
do cílové proměnné EBX. Původní obsah cílové proměnné
není třeba odpojovat, protože se jedná o prázdný
konstantní text a jeho referenční počítadlo se nemění.
; ------------- Prepare destination pointers
mov edi,[ebx] ; EDI <- destination data
mov ebp,[edi+TEXT_Length] ; EBP <- size of destination
add edi,TEXT_Text ; EDI <- start of destination buffer
; ------------- Convert text
push ebx ; push EBX
mov ax,CP_UTF8 ; AX <- source codepage UTF-8
mov ebx,eax ; BX <- destination codepage UTF-8
call CharTransWords ; convert text
pop ebx ; pop EBX
; ------------- Pop registers
clc ; clear error flag
TextWords4: pop ebp ; pop EBP
pop edi ; pop EDI
pop esi ; pop ESI
pop edx ; pop EDX
pop ecx ; pop ECX
pop eax ; pop EAX
ret
|
Do registru EDI se připraví ukazatel na
začátek cílového bufferu a pomocí funkce CharTransWords se
text zkonvertuje na malá/velká písmena (s kódováním znaků
UTF-8).
Obsah / Utility / TEXT / TextWords