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

Obsah / Utility / TEXT / TextTrimLeft

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


TextTrimLeft - Ořezání textu zleva

Funkce TextTrimLeft odstraní nevýznamné mezery a řídicí znaky (tj. znaky s kódem 32 a menším) ze začátku textu.


; -----------------------------------------------------------------------------
;        Trim text from the left (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

TextTrimLeft:	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
		add	esi,TEXT_Text	; ESI <- start of text
		jecxz	TextTrimLeft6	; nothing to delete (here is NC)

Po úschově registrů se připraví do registru ESI ukazatel na začátek textu řetězce 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
TextTrimLeft2:	cmp	byte [esi],32	; check one byte
		ja	TextTrimLeft4	; it is valid character
		inc	esi		; increase text pointer
		loop	TextTrimLeft2	; next byte
TextTrimLeft4:	xchg	ecx,esi		; ESI <- remaining bytes
		pop	ecx		; pop ECX

Textový řetězec se prochází od začátku 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	TextTrimLeft6	; nothing to delete
		call	TextDelStart	; delete start of text

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

TextTrimLeft6:	pop	esi		; pop ESI
		pop	ecx		; pop ECX
TextTrimLeft9:	ret

Po nalezení prvního platného znaku (s kódem vyšším než 32) nebo po dosažení konce ř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í TextDelStart.


Obsah / Utility / TEXT / TextTrimLeft