Obsah / Utility / TEXT / TextTrimList
Zdrojový kód: INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM
TextTrimList - Ořezání znaků z textu podle seznamu zakázaných znaků
Funkce TextTrimList odstraní z textu znaky ze seznamu 1-bajtových znaků.
|
Na vstupu funkce obsahuje registr EAX ukazatel na textovou proměnnou obsahující seznam zakázaných 1-bajtových znaků. Registr EBX obsahuje ukazatel na textovou proměnnou, ve které mají být znaky zredukovány. V případě chyby paměti funkce navrátí příznak chyby CY.
Text se seznamem zakázaných znaků se neinterpretuje jako text kódovaný v kódu UTF-8, ale jako prostý seznam 1-bajtových kódů znaků, proto lze tímto způsobem redukovat pouze znaky s kódem 0 až 7Fh. Případně je možné doplnit též bajty v rozsahu 80h až 0FFh (např. pokud je třeba redukovat synchronizační bajty 0FEh a 0FFh), ale budou redukovány jako samostatné bajty a ne jako celé znaky v kódu UTF-8.
|
Po úschově registrů je v zásobníku připraven buffer k uchování bitové mapy znaků. Buffer má velikost 256 bitů, nebo-li 8 dvojslov po 32 bitech. Buffer je inicializován naplněním nulou.
|
Seznam znaků k redukci je zmapován a to tak, že text se seznamem znaků je procházen bajt po bajtu a podle hodnoty bajtu je nastaven příslušný bit v bitové mapě znaků. Je-li seznam znaků prázdný, nedochází k žádné redukci textu a funkce je ihned ukončena s vynulovaným příznakem chyby NC. Další část kódu je společná s funkcí TextTrimUnList.
|
Před zahájením redukce je redukovaný text připraven 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 zakázaný bajt. Bajt je zakázaný v případě, že v bitové mapě znaků je nastaven příslušný bit.
|
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. Nakonec je obnoven ukazatel zásobníku a registry ze zásobníku.
Obsah / Utility / TEXT / TextTrimList