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*