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

Obsah / Utility / TEXT / TextInitBufCP

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


TextInitBufCP - Inicializace textového řetězce bufferem v dané kódové stránce

Funkce TextInitBufCP inicializuje textovou proměnnou textem z bufferu v dané kódové stránce.


; -----------------------------------------------------------------------------
;            Initialize text string with buffer in given code page
; -----------------------------------------------------------------------------
; 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 becomes empty)
; -----------------------------------------------------------------------------

Funkce TextInitBufCP inicializuje novou textovou proměnnou, na niž ukazuje ukazatel v registru EBX, textem z bufferu v dané kódové stránce. Registr ESI obsahuje ukazatel na buffer s textem, registr ECX obsahuje délku textu v bufferu v bajtech, registr AX je číslo kódové stránky a registr EDX je náhradní znak pro neplatný znak. Je-li náhradní znak nulový, použije se implicitní náhradní znak (zpravidla znak podobný vzhledově).

Pokud dojde k chybě paměti, funkce navrátí příznak chyby CY a textová proměnná bude inicializována na prázdný text.


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

TextInitBufCP:	push	edi		; push EDI
		push	ebp		; push EBP

; ------------- Set empty text

		mov	dword [ebx],EmptyTextData ; set pointer to empty text

Po úschově registrů se ukazatel v textové proměnné inicializuje na prázdný text EmptyTextData. Prázdný text se navrátí v případě chyby.


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

		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)
		call	TextNew		; create new text buffer
		xchg	eax,ebp		; EBP <- size of buffer
		pop	eax		; pop EAX (source code page)
		jc	TextInitBufCP4	; memory error

Pomocí funkce CharTrans se zjistí velikost textu v cílovém bufferu po provedení konverze do kódu UTF-8. Pomocí funkce TextNew je alokován nový datový buffer podle zjištěné délky textu. Pokud nastane chyba paměti, funkce se ukončí s chybovým kódem CY a text zůstane prázdný.


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

		push	eax		; push EAX (source code page)
		push	ebx		; push EBX (pointer to TEXT)
		mov	edi,[ebx]	; EDI <- text string data
		add	edi,byte TEXT_Text ; EDI <- start of data buffer
		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
TextInitBufCP4:	pop	ebp		; pop EBP
		pop	edi		; pop EDI
		ret

Funkcí CharTrans se provede konverze textu ze zdrojového bufferu (s danou zdrojovou ködovou stránkou) do cílového bufferu (v kódu UTF-8). 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.


Obsah / Utility / TEXT / TextInitBufCP