Obsah / Utility / TEXT / TextTrimMid
Zdrojový kód: INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM
TextTrimMid - Ořezání mezer a řídicích znaků z textu
Funkce TextTrimMid odstraní nevýznamné mezery a řídicí znaky (tj. znaky s kódem 32 a menším) z textu.
|
Na vstupu funkce obsahuje registr EBX ukazatel na textovou proměnnou. V případě chyby paměti funkce navrátí příznak chyby CY.
|
Po úschově registrů je nejdříve připraven text k zápisu, tj. je provedena jeho kopie pomocí funkce TextCopyWrite, aby data nebyla sdílena s více proměnnými. V případě chyby paměti je funkce ihned ukončena.
|
Do registrů ESI a EDI jsou připraveny ukazatele na začátek textu, do registru ECX je připravena délka textu. V případě nulové délky textu je funkce ihned ukončena s navrácením vynulovaného příznaku chyby NC.
|
Text je procházen bajt po bajtu a každý načtený znak je opět uložen zpět do bufferu textu. Ukládací ukazatel v registru EDI je navrácen zpět o 1 v případě, že byl přenesen nevýznamný znak mezery, tj. bajt s kódem 0 až 32. Tímto způsobem dojde k vypuštění nevýznamných mezer z textu. Využívá se přitom skutečnosti, že při kódování textu UTF-8 jsou znaky s hodnotou 0 až 7Fh uloženy přímo jako jednobajtové kódy. Všechny ostatní bajty kódu UTF-8 jsou vždy 80h a více, proto postačí vyhledávat přímo bajty s hodnotou 0 až 32 bez dalšího rozlišování kódu UTF-8.
|
Po provedení redukce se porovná zdrojový a cílový ukazatel. Pokud nejsou shodné, došlo k redukci alespoň jednoho bajtu a je potřeba zmenšit velikost bufferu textu. Nová délka textu je zjištěna rozdílem ukládací adresy v registru EDI a adresy začátku textu v registru EAX. Velikost bufferu je opravena funkcí TextResize.
Obsah / Utility / TEXT / TextTrimMid