Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

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