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

Obsah / Utility / TEXT / TextWrite

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


TextWrite - Zápis textu v kódu UTF-8 do bufferu

Funkce TextWrite zapíše do bufferu text v kódu UTF-8.


; -----------------------------------------------------------------------------
;                       Write text UTF-8 into buffer
; -----------------------------------------------------------------------------
; INPUT:	EBX = pointer to TEXT
;		ECX = size of destination buffer (it is ignored if EDX = NULL)
;		EDX = pointer to destination buffer (NULL = get size of data)
; OUTPUT:	EAX = size of data in destination buffer
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr EBX ukazatel na textovou proměnnou, ECX velikost cílového bufferu (údaj se ignoruje, pokud je EDX = NULL) a EDX obsahuje ukazatel na cílový buffer. Pokud je ukazatel na cílový buffer nulový, funkce pouze navrátí požadovanou velikost cílového bufferu. Na výstupu funkce navrátí v registru EAX velikost dat uložených do cílového bufferu nebo požadovanou velikost bufferu (je-li adresa bufferu nulová).


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

TextWrite:	push	ecx		; push ECX
		push	esi		; push ESI
		push	edi		; push EDI

; ------------- Prepare size of data (-> EAX)

		mov	esi,[ebx]	; ESI <- data buffer
		mov	eax,[esi+TEXT_Length] ; EAX <- text length
		or	edx,edx		; is destination buffer valid?
		jz	TextWrite4	; destination buffer is not valid
		cmp	eax,ecx		; check length of text
		ja	TextWrite8	; limit length of text

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

; ------------- Limit length of text

TextWrite8:	xchg	eax,ecx		; EAX <- limit length of text
		jmp	short TextWrite2

Do registru ESI je připravena adresa datového bufferu textu a do registru EAX délka textu. Je-li adresa cílového bufferu nulová, je funkce ihned ukončena s navrácením požadovné velikosti bufferu v registru EAX. Jinak je délka textu omezena velikostí volného místa v cílovém bufferu.


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

TextWrite2:	add	esi,byte TEXT_Text ; ESI <- start of text
		mov	edi,edx		; EDI <- destination buffer

; ------------- Copy text

		mov	ecx,eax		; ECX <- length of text
		shr	ecx,2		; ECX <- length of text in DWORDs
		rep	movsd		; shift text in DWORDs
		mov	ecx,eax		; ECX <- length of text
		and	ecx,byte 3	; ECX <- rest in last DWORD
		rep	movsb		; copy rest of text

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

TextWrite4:	pop	edi		; pop EDI
		pop	esi		; pop ESI
		pop	ecx		; pop ECX
		ret

Registr ESI se posune na začátek zdrojového textu. Do registru EDI se připraví začátek cílového bufferu. Text se zkopíruje ze zdrojového do cílového bufferu - nejdříve po celých dvojslovech a pak zbylá data v posledním dvojslovu.


Obsah / Utility / TEXT / TextWrite