Obsah / Utility / TEXT / TextTrimUnList
Zdrojový kód:
INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM
TextTrimUnList -
Ořezání znaků z textu podle seznamu povolených znaků
Funkce TextTrimUnList
odstraní z textu znaky, které se nevyskytují v seznamu
1-bajtových znaků.
; -----------------------------------------------------------------------------
; Trim text using list of allowed characters
; -----------------------------------------------------------------------------
; INPUT: EAX = pointer to TEXT with list of allowed 1-byte characters
; EBX = pointer to TEXT
; OUTPUT: CY = memory error (text not changed)
; NOTES: One-byte characters from the list will be left.
; -----------------------------------------------------------------------------
|
Na vstupu funkce obsahuje registr EAX
ukazatel na textovou proměnnou obsahující seznam povolený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 povolený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 obsluhovat pouze znaky s kódem 0 až 7Fh. Je-li
potřeba ponechat znaky s vyšším kódem než 7Fh, měl by se
uvést seznam všech bajtů v rozsahu 80h až 0FDh. Nelze
vybírat jednotlivé znaky v kódu 80h a výše.
; ------------- Push registers
TextTrimUnList: push eax ; push EAX
push ecx ; push ECX
push esi ; push ESI
push edi ; push EDI
push ebp ; push EBP
sub esp,8*4 ; ESP <- create local buffer
mov ebp,esp ; EBP <- local variables
; ------------- Clear local buffer (size: 8*4*8 = 256 bits)
xor ecx,ecx ; ECX <- 0
dec ecx ; ECX <- -1
mov [ebp+0*4],ecx ; clear local buffer, DWORD 1
mov [ebp+1*4],ecx ; clear local buffer, DWORD 2
mov [ebp+2*4],ecx ; clear local buffer, DWORD 3
mov [ebp+3*4],ecx ; clear local buffer, DWORD 4
mov [ebp+4*4],ecx ; clear local buffer, DWORD 5
mov [ebp+5*4],ecx ; clear local buffer, DWORD 6
mov [ebp+6*4],ecx ; clear local buffer, DWORD 7
mov [ebp+7*4],ecx ; clear local buffer, DWORD 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 samými jedničkami (tedy hodnotou
0FFFFFFFFh).
; ------------- Map list of characters
mov esi,[eax] ; ESI <- source TEXTDATA
mov ecx,[esi+TEXT_Length] ; ECX <- source text length
xor eax,eax ; EAX <- 0
jecxz TextTrimList8 ; no data (here is NC)
add esi,TEXT_Text ; ESI <- start of text
TextTrimUnList2:lodsb ; load 1 character
btr dword [ebp],eax ; reset bit of character
loop TextTrimUnList2 ; next character
jmp short TextTrimList4
|
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 vynulován příslušný bit v bitové
mapě znaků. Je-li seznam znaků prázdný, budou vypuštěny
všechny znaky. Funkce dále pokračuje společnou částí s
funkcí TextTrimList.
Obsah / Utility / TEXT / TextTrimUnList