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

Obsah / Utility / TEXT / TextSmall

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


TextSmall - Konverze textu na malá písmena

Funkce TextSmall zkonvertuje text na malá písmena.


; -----------------------------------------------------------------------------
;                        Convert text to small letters
; -----------------------------------------------------------------------------
; INPUT:	EAX = pointer to source TEXT
;		EBX = pointer to destination TEXT
; OUTPUT:	CY = memory error, destination TEXT becomes empty
; NOTES:	Source and destination may be identical.
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr EAX ukazatel na zdrojovou textovou proměnnou a registr EBX ukazatel na cílovou textovou proměnnou, do které bude uložen zkonvertovaný text. Zdrojová a cílová proměnná mohou být identické (tj. operaci lze provést přímo v jedné textové proměnné). V případě chyby navrátí funkce příznak chyby CY a cílová proměnná bude vyprázdněna.


; ------------- Check if source and destination is identical

TextSmall:	cmp	eax,ebx		; is source and destination identical?
		je	short TextSmall8 ; source is identical with destination

...................

; ------------- Identical source and destination variable (here is EAX == EBX)

TextSmall8:	push	eax		; create temporary variable in stack

		mov	ebx,esp		; EBX <- temporary variable
		push	eax		; push EAX (destination variable)
		mov	eax,[eax]	; EAX <- TEXTDATA buffer
		call	TextAttach	; attach text to temporary variable
		xchg	eax,ebx		; EAX <- temporary variable
		pop	ebx		; EBX <- destination variable

		call	TextSmall1	; convert text

		pushf			; push flags
		xchg	eax,ebx		; EBX <- temporary, EAX <- destination
		call	TextDetach	; detach temporary variable
		popf			; pop flags

		pop	ebx		; delete temporary variable
		mov	ebx,eax		; EBX <- destination variable
		ret

Na začátku funkce je porovnáním zdrojové a cílové proměnné ověřeno, zda se nejedná o identickou proměnnou, v tom případě proběhne konverze zvláštní obsluhou. V zásobníku je vytvořena přechodná textová proměnná, k ní je připojen konvertovaný text, z přechodné proměnné je do výstupní proměnné provedena požadovaná konverze a přechodná proměnná se uvolní ze zásobníku.


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

TextSmall1:	push	eax		; push EAX
		push	ecx		; push ECX
		push	edx		; push EDX
		push	esi		; push ESI
		push	edi		; push EDI
		push	ebp		; push EBP

; ------------- Empty destination text variable

		call	TextEmpty	; empty text

V případě rozdílných proměnných se nejdříve cílová proměnná vyprázdní pro případ, že funkce bude předčasně ukončena.


; ------------- Prepare source pointers

		mov	esi,[eax]	; ESI <- source data
		mov	ecx,[esi+TEXT_Length] ; ECX <- size of source text
		add	esi,TEXT_Text	; ESI <- start of source text
		xor	edx,edx		; EDX <- 0, default invalid character

Do registru ESI se připraví ukazatel na data zdrojového textu, do registru EAX délka zdrojového textu, registr ESI se posune na začátek zdrojového textu a do registru EDX se připraví nula jako příznak použití implicitního neplatného znaku.


; ------------- Get required size of buffer

		push	ebx		; push EBX
		mov	ax,CP_UTF8	; AX <- source codepage UTF-8
		mov	ebx,eax		; BX <- destination codepage UTF-8
		xor	edi,edi		; EDI <- 0, no destination buffer
		call	CharTransSmall	; get size of destination buffer
		pop	ebx		; pop EBX

Voláním funkce CharTransSmall s vynulovaným registrem EDI (který má obsahovat adresu cílového bufferu) se zjistí požadovaná velikost cílového bufferu, velikost bude navrácena v registru EAX.


; ------------- Create destination buffer (it need not be detached)

		call	TextNew		; create data buffer
		jc	TextSmall4	; memory error

Pomocí funkce TextNew se vytvoří nový datový buffer pro velikost textu EAX. Adresa bufferu se uloží do cílové proměnné EBX. Původní obsah cílové proměnné není třeba odpojovat, protože se jedná o prázdný konstantní text a jeho referenční počítadlo se nemění.


; ------------- Prepare destination pointers

		mov	edi,[ebx]	; EDI <- destination data
		mov	ebp,[edi+TEXT_Length] ; EBP <- size of destination
		add	edi,TEXT_Text	; EDI <- start of destination buffer

; ------------- Convert text

		push	ebx		; push EBX
		mov	ax,CP_UTF8	; AX <- source codepage UTF-8
		mov	ebx,eax		; BX <- destination codepage UTF-8
		call	CharTransSmall	; convert text
		pop	ebx		; pop EBX

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

		clc			; clear error flag
TextSmall4:	pop	ebp		; pop EBP
		pop	edi		; pop EDI
		pop	esi		; pop ESI
		pop	edx		; pop EDX
		pop	ecx		; pop ECX
		pop	eax		; pop EAX
		ret

Do registru EDI se připraví ukazatel na začátek cílového bufferu a pomocí funkce CharTransSmall se text zkonvertuje na malá písmena (s kódováním znaků UTF-8).


Obsah / Utility / TEXT / TextSmall