Obsah / Utility / TEXTFORM / FloatInfNan
Zdrojový kód: INCLUDE\UTIL\TEXTFORM.INC, UTIL\TEXTFORM.ASM
Související:
FltToTextBuf | Zformátování desetinného čísla do bufferu | |
ExpSToTextBuf | Zformátování čísla s exponentem do bufferu, malé "e" | |
ExpCToTextBuf | Zformátování čísla s exponentem do bufferu, velké "E" |
FloatInfNan - Dekódování nekonečna a nečíselných konstant (interní funkce)
Funkce FloatInfNan je interní funkce používaná funkcemi dekódujícími desetinné číslo na text a konvertuje na text speciální konstanty koprocesoru jako je např. nekonečno.
|
Na vstupu funkce obsahuje registr AH příznak záporného čísla (bit 7), registr EBX formátovací parametry FORMPAR, registr ECX ukazatel na popisovač národnostních informací NATIONAL, registr EDX ukazatel na desetinné číslo v rozšířeném formátu (velikost 10 bajtů). Registr ESI je čítač zbývajícího volného místa v cílovém bufferu a registr EDI je ukazatel do cílového bufferu. Na výstupu funkce indikuje příznak ZY, že výstupní buffer je plný, registr EAX je nastaven na délku uloženého textu (obsah platný jen není-li výstupní buffer plný, tj. je příznak NZ), registry ESI a EDI jsou posunuty na novou ukládací pozici.
|
Funkce pro výpis speciálních konstant si sama zajišťuje dekódování úvodních mezer v případě, že text je zarovnaný doprava nebo na střed. Je-li text zarovnán doleva (je nastaven příznak FORMFLAG_Left_b), obsluha úvodních mezer se přeskočí, stejně jako je-li požadována šířka pole menší než 7 znaků (což je délka ukládaného textu).
Do registru ECX se připraví požadovaná šířka pole s číslem načtením z registru EBH, což je položka FORMPAR_Width formátovacích parametrů, a odečte se šířka ukládaného textu, tedy 7 znaků. Má-li být text centrován, je použit poloviční počet mezer. Kontrola minimálního počtu mezer je proveden tak, aby v případě malého počtu mezer byl navrácen příznak NZ.
Při ukládání úvodních mezer jsou znaky mezer ukládány do bufferu EDI, čítač znaků je ECX a dekrementací registru ESI se testuje zbývající volné místo v cílovém bufferu. Při překročení konce bufferu je funkce ukončena s příznakem ZY.
|
Před vlastním textem konstanty bude uloženo znaménko. Podle obsahu registru AH se uloží buď znaménko "+" nebo "-" a dekrementací registru ESI je proveden test konce bufferu. Při překročení konce bufferu je funkce ukončena s příznakem ZY.
|
Dále se uloží znaky, které jsou společné pro všechny konstanty. Nejdříve znak "1", poté oddělovač desetinných míst, který je načten z popisovače národnostních informací v registru ECX, a nakonec snak "#". U všech funkcí se současně dekrementací registru ESI ověřuje test konce bufferu. Při překročení konce bufferu je funkce ukončena s příznakem ZY.
|
Nyní budou uloženy 3 znaky specifikující konstantu. Není-li mantisa desetinného čísla nula (tj. první a druhé dvojslovo čísla v rozšířeném formátu není nula), jedná se o nedefinované číslo, použije se text "NAN". Je-li mantisa nula, jedná se o nekonečno a použije se text "INF".
Znaky textu jsou v registru EAX. Nejdříve se uloží první znak z registru AL, poté se registr EAX posune o 8 bitlů a uloží se druhý znak a nakonec podobně třetí znak. Při ukládání každého znaku se současně dekrementací registru ESI testuje konec bufferu. Při překročení konce bufferu je funkce ukončena s příznakem ZY.
Funkce je ukončena nastavením registru AL na 7. Je-li funkce ukončena s nastaveným příznakem ZY, došlo k přetečení bufferu a volající funkce by měla být ukončena. Není-li přetečení bufferu, jsou vyšší bajty registru EAX nulové (tj. registr EAX obsahuje délku textu) a volající funkce by měla pokračovat uložením koncových mezer za číslem.
Obsah / Utility / TEXTFORM / FloatInfNan