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

Obsah / Utility / TEXT / TextInitBuf

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


TextInitBuf - Inicializace textového řetězce bufferem v kódu UTF-8

Funkce TextInitBuf inicializuje textovou proměnnou textem v bufferu s kódem UTF-8.


; -----------------------------------------------------------------------------
;                 Initialize text string with UTF-8 buffer
; -----------------------------------------------------------------------------
; INPUT:	EBX = pointer to TEXT
;		ECX = length of text in buffer (in bytes)
;		EDX = pointer to buffer with text in UTF-8
; OUTPUT:	CY = memory error (text becomes empty)
; NOTES:	Detection bytes 0feh and 0ffh should be eliminated.
; -----------------------------------------------------------------------------

Funkce TextInitBuf inicializuje novou textovou proměnnou, na niž ukazuje ukazatel v registru EBX, textem z bufferu v kódu UTF-8. Registr EDX obsahuje ukazatel na buffer s textem, registr ECX obsahuje délku textu v bufferu v bajtech. Pokud dojde k chybě paměti, funkce navrátí příznak chyby CY a textová proměnná bude inicializována na prázdný text. Inicializační text v bufferu by neměl obsahovat bajty 0FEh a 0FFh, které jsou používány na detekci little-endian a big-endian a v kódu UTF-8 se nepoužívají.


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

TextInitBuf:	push	eax		; push EAX
		push	ecx		; push ECX
		push	esi		; push ESI
		push	edi		; push EDI

; ------------- Create new text buffer

		mov	eax,ecx		; EAX <- size of text data
		mov	dword [ebx],EmptyTextData ; set pointer to empty text
		call	TextNew		; create new text buffer
		jc	TextInitBuf4	; memory error

Pomocí funkce TextNew je alokován nový datový buffer o délce textu podle původního obsahu registru ECX. Pokud nastane chyba paměti, funkce se ukončí s chybovým kódem CY. Pro tento případ je proměnná nejdříve inicializována na prázdný text EmptyTextData.


; ------------- Copy text data (it exits with NC)

		mov	esi,edx		; ESI <- buffer with text data
		mov	edi,[ebx]	; EDI <- new text data buffer
		add	edi,byte TEXT_Text ; EDI <- start of text
		shr	ecx,2		; ECX <- size of data in DWORDs
		rep	movsd		; copy text in DWORDs
		and	eax,byte 3	; EAX <- size in last DWORD
		xchg	eax,ecx		; ECX <- size in last DWORD
		rep	movsb		; copy rest of text

; ------------- Pop registers (here is NC)

TextInitBuf4:	pop	edi		; pop EDI
		pop	esi		; pop ESI
		pop	ecx		; pop ECX
		pop	eax		; pop EAX
		ret

Po úspěšné alokaci bufferu se inicializační text zkopíruje do datového bufferu. Ukládací adresa je zjištěna z ukazatele na data textové proměnné (načteného z textové proměnné [EBX]) posunutého na začátek textu v datech textového řetězce. Přesun se provede nejdříve po dvojslovech a poté se přesune zbylá část v posledním dvojslovu po bajtech.


Obsah / Utility / TEXT / TextInitBuf