Obsah / Utility / TEXTFORM / IntToTextBuf
Zdrojový kód: INCLUDE\UTIL\TEXTFORM.INC, UTIL\TEXTFORM.ASM
Související:
IntToTextBufN | Délka textu formátovaného čísla INT se znaménkem | |
FormToTextBuf | Zformátování textu do bufferu |
IntToTextBuf - Zformátování dekadického čísla se znaménkem do bufferu
Funkce IntToTextBuf zkonvertuje 64-bitové celé číslo se znaménkem na text ve formátovaném dekadickém (desítkovém) tvaru.
|
Na vstupu funkce obsahuje registrový pár EDX:EAX číslo se znaménkem ke konverzi, registr EBX obsahuje formátovací parametry FORMPAR (ne ukazatel), registr ECX ukazatel na popisovač národnostních informací NATIONAL, registr ESI čítač zbylého místa v cílovém bufferu a registr EDI ukazatel do cílového bufferu. Na výstupu z funkce jsou registry ESI a EDI posunuty na novou ukládací pozici.
Funkce používají lokální proměnné s bázovým registrem EBP. Názvy a význam lokálních proměnných jsou stejné jako u funkce UIntToTextBuf.
|
Na začátku funkce IntToTextBuf je nejdříve proveden test volného místa v cílovém bufferu. Není-li v cílovém bufferu volné místo, funkce se ihned ukončí.
Po úschově registrů se vytvoří v zásobníku místo pro lokální proměnné.Do proměnné UINTForm se uschovají formátovací parametry z registru EBX.
|
Ke zformátování čísla v bufferu je potřeba nejdříve znát délku čísla. Délka čísla se zjistí funkcí Int0ToTextBufN, která na rozdíl od funkce IntToTextBufN ignoruje parametr minimální šířky pole s údajem. Délka čísla se uchová do proměnné UINTLen a do registru EDX.
|
Není-li číslo zarovnáno doleva (příznakový bit FORMFLAG_Left_b), je nutno před číslo doplnit úvodní mezery. Do registru ECX se připraví z registru BH (což je parametr FORMPAR_Width z popisovače formátovacích parametrů) požadovaná šířka pole. Odečtením délky textu z registru EDX se obdrží zbývající šířka pro okraje. Je-li to kladné číslo, bude se pokračovat dále. Má-li být text centrován, použije se pouze polovina mezer se zaokrouhlením dolů.
V cyklu se ukládají znaky mezer do cílového bufferu. Počet mezer je v registru ECX. Dekrementací registru ESI se ověřuje, zda bude v bufferu místo pro další znak. Pokud čítač ESI dosáhne nuly, dosáhlo se konce cílového bufferu a funkce se ukončí.
|
Při přípravě registrů ke konverzi se do dvojregistru EAX:EBX načte konvertované číslo a do registru ECX délka textu čísla. Kladná a záporná čísla mají zvláštní obsluhy.
Je-li číslo negativní, převede se na absolutní hodnotu (negace LOW části, přenos do HIGH části a negace HIGH části). Vyšší dvojslovo výsledku se uloží do proměnné UINTNumH, nižší dvojslovo se ponechá v registru EBX.
Do výstupního bufferu se uloží záporné znaménko. Pokud došlo k přetečení bufferu. funkce se ukončí. Jinak se sníží čítač požadovaných číslic o záporné znaménko a dále se pokračuje částí společnou s obsluhou čísel bez znaménka.
Není-li číslo záporné, může se uložit alternativní znak před číslo a to v případě, že je znaménko povinné (je nastaven příznak FORMFLAG1_Sign) nebo je požadována mezera namísto čísla (je nastaven příznak FORMFLAG1_Space). Po uložení znaku nzaménka, ošetření konce bufferu a snížení délky textu se pokračuje částí společnou s obsluhou čísel bez znaménka.
Obsah / Utility / TEXTFORM / IntToTextBuf