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

Obsah / Utility / TEXT / TextTrimRight

Zdrojový kód: INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM


TextTrimRight - Ořezání textu zprava

Funkce TextTrimRight odstraní nevýznamné mezery a řídicí znaky (tj. znaky s kódem 32 a menším) z konce textu.


; -----------------------------------------------------------------------------
;        Trim text from the right (delete spaces and control characters)
; -----------------------------------------------------------------------------
; INPUT:	EBX = pointer to TEXT
; OUTPUT:	CY = memory error (text not changed)
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr EBX ukazatel na textovou proměnnou. V případě chyby paměti funkce navrátí příznak chyby CY.


; ------------- Push registers

TextTrimRight:	push	ecx		; push ECX
		push	esi		; push ESI

; ------------- Prepare registers

		mov	esi,[ebx]	; ESI <- pointer to TEXT
		mov	ecx,[esi+TEXT_Length] ; ECX <- text length
		lea	esi,[esi+TEXT_Text+ecx-1] ; ESI <- end of text
		clc			; clear error flag
		jecxz	TextTrimRight6	; nothing to delete (here is NC)

Po úschově registrů se připraví do registru ESI ukazatel na konec textu řetězce (na poslední bajt) a do registru ECX délka textu v bajtech. V případě nulové délky textu se funkce ihned ukončí, příznak chyby je přitom vynulován NC.


; ------------- Find valid character

		push	ecx		; push ECX
TextTrimRight2:	cmp	byte [esi],32	; check one byte
		ja	TextTrimRight4	; it is valid character
		dec	esi		; decrease text pointer
		loop	TextTrimRight2	; next byte
TextTrimRight4:	xchg	ecx,esi		; ESI <- remaining bytes
		pop	ecx		; pop ECX

Textový řetězec se prochází od konce bajt po bajtu a vyhledává se první platný znak textu, tj. bajt s hodnotou vyšší než 32. 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.


; ------------- Delete characters

		sub	ecx,esi		; ECX <- number of bytes
		jecxz	TextTrimRight6	; nothing to delete
		call	TextDelEnd	; delete end of text

; ------------- Pop registers

TextTrimRight6:	pop	esi		; pop ESI
		pop	ecx		; pop ECX
		ret

Po nalezení prvního platného znaku (s kódem vyšším než 32) nebo po dosažení začátku řetězce je do registru ECX připraven počet přeskočených nevýznamných znaků. Je-li tento počet nenulový, jsou nevýznamné znaky zrušeny funkcí TextDelEnd.


Obsah / Utility / TEXT / TextTrimRight