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

Obsah / Utility / TEXT / TextAddBufCP

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


TextAddBufCP- Přidání textu v dané kódové stránce na konec textového řetězce

Funkce TextAddBufCP přidá text z bufferu v dané kódové stránce na konec textového řetězce.


; -----------------------------------------------------------------------------
;                  Add buffer in given code page to end of text
; -----------------------------------------------------------------------------
; INPUT:	AX = code page of text in buffer
;		EBX = pointer to TEXT
;		ECX = length of text in buffer (in bytes)
;		EDX = invalid character (0 = use default)
;		ESI = pointer to buffer with text
; OUTPUT:	CY = memory error (text not changed)
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr AX číslo kódové stránky, registr EBX ukazatel na textovou proměnnou, ke které se má obsah bufferu přidat, registr ECX délku textu v bufferu v bajtech, EDX je ukazatel na buffer s přidávaným textem. V případě chyby paměti je navrácen chybový příznak CY a obsah textové proměnné se nezmění.


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

TextAddBufCP:	push	edi		; push EDI
		push	ebp		; push EBP

; ------------- Copy text on write

		call	TextCopyWrite	; copy text on write
		jc	TextAddBufCP4	; memory error

Na začátku funkce se obsah textové proměnné zkopíruje pro zápis, pokud jsou data textové proměnné vlastněna více proměnnými. V případě chyby paměti se funkce ihned ukončí s chybovým příznakem.


; ------------- Get size of new data (-> EAX)

		push	eax		; push EAX (source code page)
		push	ebx		; push EBX (pointer to TEXT)
		mov	bx,CP_UTF8	; BX <- destination codepage UTF-8
		xor	edi,edi		; EDI <- 0, no destination buffer
		call	CharTrans	; get length of destination buffer
		pop	ebx		; pop EBX (pointer to TEXT)

Pomocí funkce CharTrans s vynulovaným registrem EDI na vstupu se zjistí délka přidávaného textu po konverzi na UTF-8 v bajtech.


; ------------- Resize text buffer

		mov	edi,[ebx]	; EDI <- data buffer
		mov	edi,[edi+TEXT_Length] ; EDI <- old length of text
		add	eax,edi		; EAX <- new length of text
		call	TextResize	; resize data buffer
		xchg	eax,ebp		; EBP <- new length of text
		pop	eax		; pop EAX (source code page)
		jc	TextAddBufCP4	; memory error
		sub	ebp,edi		; EBP <- length of added text

Funkcí TextResize je změněna velikost textového bufferu. Délka textu je stanovena jako původní délka textu zvýšená o délku nového přidávaného textu. V případě chyby paměti se funkce ihned ukončí s chybovým příznakem.


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

		push	eax		; push EAX (source code page)
		push	ebx		; push EBX (pointer to TEXT)
		add	edi,[ebx]	; EDI <- text string data
		add	edi,byte TEXT_Text ; EDI <- end of old data
		mov	bx,CP_UTF8	; BX <- destination codepage UTF-8
		call	CharTrans	; convert text
		pop	ebx		; pop EBX (pointer to TEXT)
		pop	eax		; pop EAX (source code page)

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

		clc			; clear error flag
TextAddBufCP4:	pop	ebp		; pop EBP
		pop	edi		; pop EDI
		ret

Přidávaný text se zkonvertuje pomocí funkce CharTrans ze zdrojového bufferu do kódu UTF-8 za starý konec textu.


Obsah / Utility / TEXT / TextAddBufCP