Obsah / Utility / TEXT / TextAddDateTime
Zdrojový kód:
INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM
TextAddDateTime -
Přidání data/času na konec textu
Funkce TextAddDateTime přidá
formátovaný datum/čas na konec textu.
; -----------------------------------------------------------------------------
; Add date/time to end of text
; -----------------------------------------------------------------------------
; INPUT: EAX = pointer to source TEXT variable
; EBX = pointer to destination TEXT variable
; ECX = pointer to nationality descriptor NATIONAL (NULL=default)
; EDX = pointer to date-time structure DATETIME
; OUTPUT: CY = memory error (text not changed)
; -----------------------------------------------------------------------------
; Local variables (ebp+N are read-only variables):
%define TFDTSrc esp+20 ; (4) source TEXT
%define TFDTDst esp+16 ; (4) destination TEXT
%define TFDTNat esp+12 ; (4) pointer to nationality
%define TFDTDat esp+8 ; (4) pointer to DATETIME
|
Na vstupu funkce obsahuje registr EAX
ukazatel na textovou proměnnou obsahující formátovací
řetězec. Registr EBX obsahuje
ukazatel na cílovou proměnnou, do které se zformátovaný text
uloží. Registr ECX obsahuje ukazatel na popisovač
národnostních informací NATIONAL. Je-li
ukazatel nulový (tj. obsahuje NULL), použije se implicitní
popisovač národnostních informací. Registr EDX obsahuje
ukazatel na strukturu data a času DATETIME. V případě chyby paměti je navrácen chybový
příznak CY a obsah cílové textové proměnné se nezmění.
Funkce používá tyto lokální
proměnné: TFDTSrc ukazatel na textovou proměnnou s
formátovacím řetězcem, TFDTDst ukazatel na cílovou textovou
proměnnou, TFDTNat ukazatel na popisovač národnostních
informací a TFDTDat ukazatel na položku data a času DATETIME.
; ------------- Push registers
TextAddDateTime:push eax ; push EAX (source TEXT)
push ebx ; push EBX (destination TEXT)
push ecx ; push ECX (pointer to nationality)
push edx ; push EDX (pointer to DATETIME)
push esi ; push ESI
push edi ; push EDI
; ------------- Get text length (-> ESI)
xchg eax,edx ; EAX <- DATETIME, EDX <- source TEXT
mov edx,[edx] ; EDX <- source text data
mov ebx,[edx+TEXT_Length] ; EBX <- size of source text
add edx,TEXT_Text ; EDX <- start of source text
call FormDateTimeN ; get text length
|
Po úschově registrů je vypočtena délka
výstupního textu voláním funkce FormDateTimeN. Do registru EAX je připraven ukazatel na
strukturu data a času DATETIME, do registru EBX délka
formátovacího řetězce a do registru EDX ukazatel na
formátovací řetězec. Zjištěná délka přidávaného textu
se navrátí v registru ESI.
; ------------- Copy text on write
mov ebx,[TFDTDst] ; EBX <- destination text
call TextCopyWrite ; copy text on write
jc TextAddDateTim9 ; memory error
|
Voláním funkce TextCopyWrite se zajistí přivlastnění cílového bufferu
před zápisem. V případě chyby paměti je funkce ukončena s
návratem chyby CY.
; ------------- Resize buffer
mov eax,[ebx] ; EAX <- destination data buffer
mov eax,[eax+TEXT_Length] ; EAX <- length of data buffer
add eax,esi ; EAX <- new text length
call TextResize ; resize data buffer
jc TextAddDateTim9 ; memory error
|
Funkcí TextResize je
nastavena nová velikost cílového bufferu. Text se k bufferu
přidává, proto se zjistí nová velikost bufferu přičtěním
vypočtené velikosti v registru ESI ke staré velikosti bufferu
textu.
; ------------- Default nationality
mov ecx,[TFDTNat] ; ECX <- pointer to nationality
or ecx,ecx ; default nationality?
jnz TextAddDateTim6 ; nationality is valid
DEFAULT_NAT ecx ; ECX <- get default nationality
|
Do registru ECX se připraví ukazatel na
národnostní informace NATIONAL. Pokud je
ukazatel nulový, jedná se o implicitní národnostní informace
a ukazatel se připraví pomocí makra DEFAULT_NAT.
; ------------- Format text
TextAddDateTim6:sub eax,esi ; EAX <- old length of text
add eax,[ebx] ; EAX <- data buffer
add eax,TEXT_Text ; EAX <- start of new text
xchg eax,edi ; EDI <- start of new text
mov edx,[TFDTSrc] ; EDX <- pointer to source variable
mov edx,[edx] ; EDX <- source text data
mov ebx,[edx+TEXT_Length] ; EBX <- size of source text
add edx,TEXT_Text ; EDX <- start of source text
mov eax,[TFDTDat] ; EAX <- DATETIME structure
call FormDateTime ; format text into buffer
; ------------- Pop registers
clc ; clear error flag
TextAddDateTim9:pop edi ; pop EDI
pop esi ; pop ESI
pop edx ; pop EDX
pop ecx ; pop ECX
pop ebx ; pop EBX
pop eax ; pop EAX
ret
|
Do registru EDI se připraví ukazatel na
začátek cílového bufferu (tedy na místo, odkud má být
nový text ukládán), do registru EDX ukazatel na formátovací
řetězec a do registru EAX ukazatel na strukturu DATETIME. V
registru ECX zůstává ukazatel na národnostní informace.
Datum/čas se zformátuje do cílového bufferu funkcí FormDateTime a funkce se ukončí s vynulovaným příznakem
chyby CF.
Obsah / Utility / TEXT / TextAddDateTime