Obsah / Utility / TEXT / TextFindLast, TextFindRev
Zdrojový kód: INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM
TextFindLast, TextFindRev - Vyhledání posledního/předešlého řetězce v textu
Funkce TextFindLast vyhledá v textu poslední výskyt daného textového řetězce. Funkce TextFindRev vyhledá předešlý výskyt textového řetězce od dané pozice v textu (včetně).
|
Na vstupu funkce obsahuje registr EAX ukazatel na textovou proměnnou s hledaným textovým řetězcem. Registr EBX obsahuje ukazatel na textovou proměnnou s textem k prohledání. Registr EDX obsahuje počáteční offset v textu, od kterého bude textový řetězec vyhledáván. V případě funkce TextFindLast je obsah registru EDX nejdříve nastaven na dostatečně vysoké číslo TEXTBIGPOS (hodnota 80000000h) představující ukazatel nastavený za konec textu.
Je-li textový řetězec v textu nalezen, je navrácena v registru EDX pozice (offset) řetězce v textu a příznak CF je vynulován. Není-li textový řetězec nalezen, je v registru EDX navrácena hodnota -1 a je navrácen příznak chyby CY.
|
Po úschově první části registrů se funkce pokusí provést hledání zrychleně. Do registru EBP si připraví délku hledaného textu. Pokud má hledaný řetězec nulovou délku, funkce se ihned ukončí s vynulovaným příznakem chyby NC znamenajícím, že nulový řetězec je nalezen vždy. Pro délku řetězce 1 se do registru AL připraví první bajt řetězce a hledání se provede funkcí TextFindByteRev. Pro délku řetězce 2 se do registru AH navíc připraví druhý bajt řetězce a hledání se provede funkcí TextFindWordRev. Jinak se použije pomalé hledání.
|
Po úschově druhé části registrů bude omezen maximální počáteční offset v textu (aby neukazoval za konec textu). Do registru ECX se připraví délka textu (v bajtech) snížená o délku hledaného textu a snížená o 1 (což je rezerva pro hledaný text bez prvního znaku). Přesahuje-li pozice v textu konec textu, omezí se pozice na poslední pozici v textu.
Je-li pozice v textu záporná, nebyl řetězec v textu nalezen (nebo text je kratší než řetězec) a funkce se ukončí s navrácením příznaku chyby CY a s hodnotou -1 v registru EDX. Při platném offsetu se do registru EDI připraví ukazatel na první prohledávaný bajt textu a ukazatel ESI se posune na 3. bajt hledaného řetězce.
|
Do registru ECX se připraví počet pozic k prohledání - hledá se směrem zpět, proto počet bajtů odpovídá offsetu bajtu zvýšenému o 1. První bajt se vyhledá instrukcí scasb s nastaveným směrem hledání dolů. Pokud nebyl bajt nalezen, funkce se opět ukončí s navrácením příznaku chyby CY a s hodnotou -1 v registru EDX (a současně se nastaví implicitní směr nahoru). Pokud byl první bajt nalezen, otestuje se druhý bajt. Jestliže druhý bajt nesouhlasí, pokračuje se vyhledáváním prvního bajtu od další pozice v textu.
|
V případě nalezení prvních 2 bajtů hledaného řetězce se provede porovnání zbytku řetězce (směr je nyní už nastaven nahoru). Uchovají se ukazatele pozice v textu a porovná se zbytek řezězce - pro zrychlení se porovnání provádí nejdříve po dvojslovech (instrukce cmpsd) a nakonec se porovnají zbylé bajty v posledním dvojslově řetězce. Navrátí se registry a pokud řetězec nesouhlasí, pokračuje se v hledání další pozicí v textu.
|
Je-li řetězec úspěšně nalezen, získá se z čítače ECX pozice nalezeného textu a funkce se ukončí s vynulovaným příznakem chyby NC.
Obsah / Utility / TEXT / TextFindLast, TextFindRev