Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

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