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

Obsah / Utility / TEXT / TextAddForm*

Zdrojový kód: INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM


TextAddFormHex - Přidání formátovaného hexadecimálního čísla na konec textového řetězce

Funkce TextAddFormHex přidá číslo ve formátovaném hexadecimálním tvaru na konec textového řetězce.


; -----------------------------------------------------------------------------
;                    Add formated HEX number to end of text
; -----------------------------------------------------------------------------
; INPUT:	EDX:EAX = unsigned number
;		EBX = pointer to TEXT variable
;		ECX = formatting parameters FORMPAR
;			CL = minimal number of digits
;			CH = minimal width of field
;			bits:	FORMFLAG_Left_b = left-justify
;				FORMFLAG_Zero_b	= add zeroes instead of spaces
;				FORMFLAG_Alt_b  = prefix 0x
;				FORMFLAG_Alt2_b = suffix h
;				FORMFLAG_Thsn_b = use thousand separator
;				FORMFLAG_Cent_b = center
;		ESI = pointer to nationality descriptor NATIONAL (NULL=default)
; OUTPUT:	CY = memory error or invalid number (text not changed)
; -----------------------------------------------------------------------------

TextAddFormHex:	TEXTADDFORMNUM HexToTextBufN, HexCToTextBuf

Na vstupu funkce obsahuje registrový pár EDX:EAX 64-bitové celé číslo bez znaménka ke zformátování. Registr EBX obsahuje ukazatel na cílovou textovou proměnnou, ke které se má číslo přidat. Registr ECX obsahuje formátovací parametry FORMPAR (ne ukazatel). Registr ESI obsahuje ukazatel na národnostní informace NATIONAL. Je-li ukazatel nulový (tj. obsahuje NULL), použije se implicitní popisovač národnostních informací. V případě chyby paměti je navrácen chybový příznak CY a obsah textové proměnné se nezmění.

Funkce používá makro TEXTADDFORMNUM (uvedené dále).

TextAddFormBin - Přidání formátovaného binárního čísla na konec textového řetězce

Funkce TextAddFormBin přidá číslo ve formátovaném binárním tvaru na konec textového řetězce.


; -----------------------------------------------------------------------------
;                    Add formated BIN number to end of text
; -----------------------------------------------------------------------------
; INPUT:	EDX:EAX = unsigned number
;		EBX = pointer to TEXT variable
;		ECX = formatting parameters FORMPAR
;			CL = minimal number of digits
;			CH = minimal width of field
;			bits:	FORMFLAG_Left_b = left-justify
;				FORMFLAG_Zero_b	= add zeroes instead of spaces
;				FORMFLAG_Alt_b  = prefix 0b
;				FORMFLAG_Alt2_b = suffix b
;				FORMFLAG_Thsn_b = use thousand separator
;				FORMFLAG_Cent_b = center
;		ESI = pointer to nationality descriptor NATIONAL (NULL=default)
; OUTPUT:	CY = memory error or invalid number (text not changed)
; -----------------------------------------------------------------------------

TextAddFormBin:	TEXTADDFORMNUM BinToTextBufN, BinToTextBuf

Na vstupu funkce obsahuje registrový pár EDX:EAX 64-bitové celé číslo bez znaménka ke zformátování. Registr EBX obsahuje ukazatel na cílovou textovou proměnnou, ke které se má číslo přidat. Registr ECX obsahuje formátovací parametry FORMPAR (ne ukazatel). Registr ESI obsahuje ukazatel na národnostní informace NATIONAL. Je-li ukazatel nulový (tj. obsahuje NULL), použije se implicitní popisovač národnostních informací. V případě chyby paměti je navrácen chybový příznak CY a obsah textové proměnné se nezmění.

Funkce používá makro TEXTADDFORMNUM (uvedené dále).

TextAddFormOct - Přidání formátovaného oktalového čísla na konec textového řetězce

Funkce TextAddFormOct přidá číslo ve formátovaném oktalovém tvaru na konec textového řetězce.


; -----------------------------------------------------------------------------
;                    Add formated OCT number to end of text
; -----------------------------------------------------------------------------
; INPUT:	EDX:EAX = unsigned number
;		EBX = pointer to TEXT variable
;		ECX = formatting parameters FORMPAR
;			CL = minimal number of digits
;			CH = minimal width of field
;			bits:	FORMFLAG_Left_b = left-justify
;				FORMFLAG_Zero_b	= add zeroes instead of spaces
;				FORMFLAG_Alt_b  = prefix 0
;				FORMFLAG_Alt2_b = suffix o
;				FORMFLAG_Cent_b = center
;		ESI = pointer to nationality descriptor NATIONAL (NULL=default)
; OUTPUT:	CY = memory error or invalid number (text not changed)
; -----------------------------------------------------------------------------

TextAddFormOct:	TEXTADDFORMNUM OctToTextBufN, OctToTextBuf

Na vstupu funkce obsahuje registrový pár EDX:EAX 64-bitové celé číslo bez znaménka ke zformátování. Registr EBX obsahuje ukazatel na cílovou textovou proměnnou, ke které se má číslo přidat. Registr ECX obsahuje formátovací parametry FORMPAR (ne ukazatel). Registr ESI obsahuje ukazatel na národnostní informace NATIONAL. Je-li ukazatel nulový (tj. obsahuje NULL), použije se implicitní popisovač národnostních informací. V případě chyby paměti je navrácen chybový příznak CY a obsah textové proměnné se nezmění.

Funkce používá makro TEXTADDFORMNUM (uvedené dále).

TextAddFormUInt - Přidání formátovaného dekadického čísla bez znaménka na konec textového řetězce

Funkce TextAddFormUInt přidá číslo ve formátovaném dekadickém tvaru bez znaménka na konec textového řetězce.


; -----------------------------------------------------------------------------
;               Add formated unsigned INT number to end of text
; -----------------------------------------------------------------------------
; INPUT:	EDX:EAX = unsigned number
;		EBX = pointer to TEXT variable
;		ECX = formatting parameters FORMPAR
;			CL = minimal number of digits
;			CH = minimal width of field
;			bits:	FORMFLAG_Left_b = left-justify
;				FORMFLAG_Zero_b	= add zeroes instead of spaces
;				FORMFLAG_Thsn_b = use thousand separator
;				FORMFLAG_Cent_b = center
;		ESI = pointer to nationality descriptor NATIONAL (NULL=default)
; OUTPUT:	CY = memory error or invalid number (text not changed)
; -----------------------------------------------------------------------------

TextAddFormUInt:TEXTADDFORMNUM UIntToTextBufN, UIntToTextBuf

Na vstupu funkce obsahuje registrový pár EDX:EAX 64-bitové celé číslo bez znaménka ke zformátování. Registr EBX obsahuje ukazatel na cílovou textovou proměnnou, ke které se má číslo přidat. Registr ECX obsahuje formátovací parametry FORMPAR (ne ukazatel). Registr ESI obsahuje ukazatel na národnostní informace NATIONAL. Je-li ukazatel nulový (tj. obsahuje NULL), použije se implicitní popisovač národnostních informací. V případě chyby paměti je navrácen chybový příznak CY a obsah textové proměnné se nezmění.

Funkce používá makro TEXTADDFORMNUM (uvedené dále).

TextAddFormInt - Přidání formátovaného dekadického čísla se znaménkem na konec textového řetězce

Funkce TextAddFormInt přidá číslo ve formátovaném dekadickém tvaru se znaménkem na konec textového řetězce.


; -----------------------------------------------------------------------------
;                Add formated signed INT number to end of text
; -----------------------------------------------------------------------------
; INPUT:	EDX:EAX = signed number
;		EBX = pointer to TEXT variable
;		ECX = formatting parameters FORMPAR
;			CL = minimal number of digits
;			CH = minimal width of field
;			bits:	FORMFLAG_Left_b = left-justify
;				FORMFLAG_Sign_b	= always use sign "+"
;				FORMFLAG_Spc_b  = prefix space if positive
;				FORMFLAG_Zero_b	= add zeroes instead of spaces
;				FORMFLAG_Thsn_b = use thousand separator
;				FORMFLAG_Cent_b = center
;		ESI = pointer to nationality descriptor NATIONAL (NULL=default)
; OUTPUT:	CY = memory error or invalid number (text not changed)
; -----------------------------------------------------------------------------

TextAddFormInt:	TEXTADDFORMNUM IntToTextBufN, IntToTextBuf

Na vstupu funkce obsahuje registrový pár EDX:EAX 64-bitové celé číslo se znaménkem ke zformátování. Registr EBX obsahuje ukazatel na cílovou textovou proměnnou, ke které se má číslo přidat. Registr ECX obsahuje formátovací parametry FORMPAR (ne ukazatel). Registr ESI obsahuje ukazatel na národnostní informace NATIONAL. Je-li ukazatel nulový (tj. obsahuje NULL), použije se implicitní popisovač národnostních informací. V případě chyby paměti je navrácen chybový příznak CY a obsah textové proměnné se nezmění.

Funkce používá makro TEXTADDFORMNUM (uvedené dále).

TextAddFormExp - Přidání formátovaného desetinného čísla s exponentem na konec textového řetězce

Funkce TextAddFormExp přidá desetinné číslo ve formátovaném tvaru s exponentem na konec textového řetězce.


; -----------------------------------------------------------------------------
;                 Add formated exponencial number to end of text
; -----------------------------------------------------------------------------
; INPUT:	ST0 = float number (it does not pop it from the FPU stack)
;		EBX = pointer to TEXT variable
;		ECX = formatting parameters FORMPAR
;			CL = minimal number of digits after decimal point
;				or number of signific.digits if FORMFLAG_Prec_b
;			CH = minimal width of field
;			bits:	FORMFLAG_Left_b = left-justify
;				FORMFLAG_Sign_b	= always use sign "+"
;				FORMFLAG_Spc_b  = prefix space if positive
;				FORMFLAG_Zero_b	= add zeroes instead of spaces
;				FORMFLAG_Alt_b  = always decimal point
;				FORMFLAG_Alt2_b = truncate trailing zeroes
;				FORMFLAG_Thsn_b = use thousand separator
;				FORMFLAG_Cent_b = center
;				FORMFLAG_Prec_b = precision=significant digits
;							instead of fractional
;				FORMTYPE_Cap_b	= does not round
;		ESI = pointer to nationality descriptor NATIONAL (NULL=default)
; OUTPUT:	CY = memory error or invalid number (text not changed)
; NOTES:	It uses 2 more registers from FPU stack.
;		Exponent is 3 or 4 digits and uses small "e".
;		To destroy FPU register you can use "ffreep st0" instruction.
; -----------------------------------------------------------------------------

TextAddFormExp:	TEXTADDFORMNUM ExpToTextBufN, ExpSToTextBuf

Na vstupu funkce obsahuje registr ST0 desetinné číslo ke zformátování. Registr EBX obsahuje ukazatel na cílovou textovou proměnnou, ke které se má číslo přidat. Registr ECX obsahuje formátovací parametry FORMPAR (ne ukazatel). Registr ESI obsahuje ukazatel na národnostní informace NATIONAL. Je-li ukazatel nulový (tj. obsahuje NULL), použije se implicitní popisovač národnostních informací. V případě chyby paměti je navrácen chybový příznak CY a obsah textové proměnné se nezmění.

Funkce používá další 2 registry koprocesoru. Vstupní číslo v registru ST0 zůstává zachováno, neuvolňuje se ze zásobníku koprocesoru. K uvolnění čísla z registru ST0 lze použít instrukci "ffreep st0" volanou po ukončení funkce. Funkce předpokládá, že koprocesor je v implicitním nastavení - přesnost 64 bitů, zaokrouhlení k nejbližšímu. Exponent je ve tvaru 3 nebo 4 číslice se znaménkem a používá malé písmeno "e".

Funkce používá makro TEXTADDFORMNUM (uvedené dále).

TextAddFormFlt - Přidání formátovaného desetinného čísla bez exponentu na konec textového řetězce

Funkce TextAddFormFlt přidá desetinné číslo ve formátovaném tvaru bez exponentu na konec textového řetězce.


; -----------------------------------------------------------------------------
;                Add formated floating point number to end of text
; -----------------------------------------------------------------------------
; INPUT:	ST0 = float number (it does not pop it from the FPU stack)
;		EBX = pointer to TEXT variable
;		ECX = formatting parameters FORMPAR
;			CL = minimal number of digits after decimal point
;				or number of signific.digits if FORMFLAG_Prec_b
;			CH = minimal width of field
;			bits:	FORMFLAG_Left_b = left-justify
;				FORMFLAG_Sign_b	= always use sign "+"
;				FORMFLAG_Spc_b  = prefix space if positive
;				FORMFLAG_Zero_b	= add zeroes instead of spaces
;				FORMFLAG_Alt_b  = always decimal point
;				FORMFLAG_Alt2_b = truncate trailing zeroes
;				FORMFLAG_Thsn_b = use thousand separator
;				FORMFLAG_Cent_b = center
;				FORMFLAG_Prec_b = precision=significant digits
;							instead of fractional
;				FORMTYPE_Cap_b	= does not round
;		ESI = pointer to nationality descriptor NATIONAL (NULL=default)
; OUTPUT:	CY = memory error or invalid number (text not changed)
; NOTES:	It uses 2 more registers from FPU stack.
;		To destroy FPU register you can use "ffreep st0" instruction.
; -----------------------------------------------------------------------------

TextAddFormFlt:	TEXTADDFORMNUM FltToTextBufN, FltToTextBuf

Na vstupu funkce obsahuje registr ST0 desetinné číslo ke zformátování. Registr EBX obsahuje ukazatel na cílovou textovou proměnnou, ke které se má číslo přidat. Registr ECX obsahuje formátovací parametry FORMPAR (ne ukazatel). Registr ESI obsahuje ukazatel na národnostní informace NATIONAL. Je-li ukazatel nulový (tj. obsahuje NULL), použije se implicitní popisovač národnostních informací. V případě chyby paměti je navrácen chybový příznak CY a obsah textové proměnné se nezmění.

Funkce používá další 2 registry koprocesoru. Vstupní číslo v registru ST0 zůstává zachováno, neuvolňuje se ze zásobníku koprocesoru. K uvolnění čísla z registru ST0 lze použít instrukci "ffreep st0" volanou po ukončení funkce.

Funkce používá makro TEXTADDFORMNUM (uvedené dále).

TextAddFormMix - Přidání formátovaného desetinného čísla ve smíšeném tvaru na konec textového řetězce

Funkce TextAddFormMix přidá desetinné číslo ve formátovaném smíšeném tvaru (tj. s exponentem nebo bez exponentu) na konec textového řetězce. Formát s exponentem se zvolí v případě, že exponent je menší než -4 nebo větší nebo roven zadané přesnosti.


; -----------------------------------------------------------------------------
;           Add formated mixed floating point number to end of text
; -----------------------------------------------------------------------------
; INPUT:	ST0 = float number (it does not pop it from the FPU stack)
;		EBX = pointer to TEXT variable
;		ECX = formatting parameters FORMPAR
;			CL = number of significant digits or minimal number
;			       of digits after decimal point if FORMFLAG_Prec_b
;			CH = minimal width of field
;			bits:	FORMFLAG_Left_b = left-justify
;				FORMFLAG_Sign_b	= always use sign "+"
;				FORMFLAG_Spc_b  = prefix space if positive
;				FORMFLAG_Zero_b	= add zeroes instead of spaces
;				FORMFLAG_Alt_b  = always point, don't truncate
;				FORMFLAG_Alt2_b = always point, truncate
;					neither Alt now Alt2 = no point, trunc.
;					Alt and Alt2 = no point, don't truncate
;				FORMFLAG_Thsn_b = use thousand separator
;				FORMFLAG_Cent_b = center
;				FORMFLAG_Prec_b = precision=fractional instead
;							of significant digits
;				FORMTYPE_Cap_b	= does not round
;		ESI = pointer to nationality descriptor NATIONAL (NULL=default)
; OUTPUT:	CY = memory error or invalid number (text not changed)
; NOTES:	It uses float point form in range 1e-4 to 1e+precision,
;			else uses exponential form.
;		It uses 2 more registers from FPU stack.
;		To destroy FPU register you can use "ffreep st0" instruction.
; -----------------------------------------------------------------------------

TextAddFormMix:	TEXTADDFORMNUM MixToTextBufN, MixSToTextBuf

Na vstupu funkce obsahuje registr ST0 desetinné číslo ke zformátování. Registr EBX obsahuje ukazatel na cílovou textovou proměnnou, ke které se má číslo přidat. Registr ECX obsahuje formátovací parametry FORMPAR (ne ukazatel). Registr ESI obsahuje ukazatel na národnostní informace NATIONAL. Je-li ukazatel nulový (tj. obsahuje NULL), použije se implicitní popisovač národnostních informací. V případě chyby paměti je navrácen chybový příznak CY a obsah textové proměnné se nezmění.

Funkce používá další 2 registry koprocesoru. Vstupní číslo v registru ST0 zůstává zachováno, neuvolňuje se ze zásobníku koprocesoru. K uvolnění čísla z registru ST0 lze použít instrukci "ffreep st0" volanou po ukončení funkce. Funkce předpokládá, že koprocesor je v implicitním nastavení - přesnost 64 bitů, zaokrouhlení k nejbližšímu. Případný exponent je ve tvaru 3 nebo 4 číslice se znaménkem a používá malé písmeno "e".

Funkce používá makro TEXTADDFORMNUM (uvedené dále).

TEXTADDFORMNUM - Přidání formátovaného čísla na konec textového řetězce

Makro TEXTADDFORMNUM je používáno předešlými funkcemi pro formátování čísla.


; -----------------------------------------------------------------------------
;                 Macro - add formated number to end of text
; -----------------------------------------------------------------------------
; %1 = function get text length, %2 = function convert to text

%macro		TEXTADDFORMNUM 2

Makro používá dva parametry. Prvním parametrem je název funkce použité ke zjištění délky textu. Druhým parametrem je název funkce použité ke zformátování textu do bufferu.


; ------------- Push registers

		push	ebx		; push EBX
		push	esi		; push ESI
		push	edi		; push EDI
		push	ebp		; push EBP

; ------------- Copy text on write

		call	TextCopyWrite	; copy text on write
		jc	%%L2		; memory error

Na začátku makra 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 text length (-> ESI)

		mov	ebp,esi		; EBP <- pointer to nationality
		mov	esi,eax		; ESI <- push number LOW
		xchg	ebx,ecx		; EBX <- parameters, ECX <- TEXT
		call	%1		; get text length (-> EAX)
		xchg	ebx,ecx		; EBX <- TEXT, ECX <- parameters
		xchg	eax,esi		; EAX <- number LOW, ESI <- length

Voláním funkce %1 se zjistí délka textu ke zformátování. Délka textu bude uložena do registru ESI.


; ------------- Resize buffer

		xchg	eax,edi		; EDI <- push EAX
		mov	eax,[ebx]	; EAX <- data buffer
		mov	eax,[eax+TEXT_Length] ; EAX <- length of data buffer
		add	eax,esi		; EAX <- new text length
		call	TextResize	; resize data buffer
		xchg	eax,edi		; EAX <- pop EAX,EDI <- new text length
		jc	%%L2		; memory error

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.


; ------------- Prepare registers

		sub	edi,esi		; EDI <- old text length
		add	edi,[ebx]	; EDI <- start of buffer
		add	edi,byte TEXT_Text ; EDI <- start of text

Do registru EDI se připraví ukazatel na konec starého textu v bufferu, tedy na místo, do kterého má být textový řetězec zformátován.


; ------------- Convert number to text

		mov	ebx,ecx		; EBX <- formatting parameters
		mov	ecx,ebp		; ECX <- pointer to nationality
		or	ecx,ecx		; use default nationality?
		jnz	%%L1		; no default nationality
		DEFAULT_NAT ecx		; ECX <- get default nationality
%%L1:		call	%2		; convert number to text
		mov	ecx,ebx		; ECX <- formatting parameters

; ------------- Pop registers

		clc			; clear error flag
%%L2:		pop	ebp		; pop EBP
		pop	edi		; pop EDI
		pop	esi		; pop ESI
		pop	ebx		; pop EBX
		ret
%endmacro

Pokud je obsah registru ECX nulový, připraví se do registru ECX pomocí makra DEFAULT_NAT implicitní popisovač národnostních informací. Voláním funkce %2 se číslo zformátuje do bufferu a funkce se ukončí s vynulovaným příznakem chyby.


Obsah / Utility / TEXT / TextAddForm*