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

Obsah / Utility / CHARSET / Datové struktury a makra

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


Datové struktury a makra


FONTMAX		EQU	266Bh		; maximal UNICODE character
FONTMAP		EQU	(FONTMAX/256+1)	; number of UNICODE mapping pages (=39)
CHINV		EQU	0		; invalid character (hardcoded)

Konstanta FONTMAX je maximální köd znaku použitý v definicích fontů a znakových sad. FONTMAP je počet mapovacích stránek Unicode (jedna stránka má 256 znaků). CHINV je označení neplatného znaku v Unicode tabulkách.


; ------------- Character set

struc		CHARSET

CHSET_CodePage:	resw	1		; 0: code page (see below)
CHSET_Res:	resb	1		; 2: ...reserved (set to 0)
CHSET_Flags:	resb	1		; 3: flags (see below)
CHSET_ToUni:	resd	1		; 4: table to Unicode
CHSET_FromUni:	resd	1		; 8: table from Unicode
CHSET_ReadChar:	resd	1		; 0Ch: read character from buffer func.
					;	INPUT:	EBX = CHARSET pointer
					;		ECX = remaining bytes
					;		EDX = invalid char.
					;		ESI = source buffer
					;	OUTPUT:	EAX = Unicode char
					;		ECX = next remaining
					;		ESI = next source
CHSET_WriteChar:resd	1		; 10h: write character into buffer fnc.
					;	INPUT:	EAX = Unicode char
					;		EBX = CHARSET pointer
					;		DL = invalid char.
					;		EDI = dest. buffer
					;		EBP = remaining bytes
					;	OUTPUT:	EDI = next destination
					;		EBP = next remaining
					;	DESTROYS: EAX
CHSET_SizeChar:	resd	1		; 14h: get size of character
					;	INPUT:	EAX = Unicode char
					;		EBX = CHARSET pointer
					;		EDI = data counter
					;	OUTPUT:	EDI = next data counter
					;	DESTROYS: EAX

endstruc				; size 18h = 24 bytes

; ------------- Flags

CHSET_MBYTE	EQU	B0		; multibyte character set

Struktura CHARSET slouží k popisu jedné znakové sady.

Položka CHSET_CodePage je číslo kódové stránky (viz následující seznam). CHSET_Flags jsou příznaky, používá se pouze příznak CHSET_MBYTE indikující, že ködová stránka je vícebajtová, tj. jeden znak zabírá více než jeden bajt.

CHSET_ToUni je ukazatel na tabulku pro převod znaku na Unicode. Používá se pouze u jednobajtové kódové stánky. Je to pole 128 slov, kde každé slovo představuje Unicode kód znaku pro bajt 80h až 0FFh. Znaky s kódem 00h až 7Fh se nepřevádějí, u všech znakových sad jsou shodné se znaky Unicode.

CHSET_FromUni je ukazatel na tabulku pro převod znaku z ködu Unicode. Používá se pouze u jednobajtové kódové stánky. Tabulka je pole ukazatelů na 256-bajtové podstránky. Při převodu se pomocí vyššího bajtu znaku vyhledá podstránka a z podstránky se pomocí nižšího bajtu znaku načte köd znaku v příslušné znakové sadě.

CHSET_ReadChar je ukazatel na funkci sloužící k načtení znaku z bufferu. Vstupem funkce je v registru EBX ukazatel na popisovač znakové sady CHARSET, v registru ECX počet zbývajících bajtů ve vstupním bufferu, EDX obsahuje kód neplatného znaku a ESI obsahuje ukazatel na vstupní buffer se čteným textem. Výstupem je v registru EAX Unicode kód načteného znaku, registr ESI ukazuje na novou pozici ve vstupním bufferu a registr ECX obsahuje nový počet zbývajících bajtů.

CHSET_WriteChar je ukazatel na funkci sloužící k uložení znaku do bufferu. Vstupem funkce je v registru EAX Unicode kód ukládaného znaku, v registru EBX ukazatel na popisovač znakové sady CHARSET, v registru DL neplatný znak pro případ převodu znaku z Unicode na 1-bajtový kód, v registru EDI ukazatel do zápisového bufferu a v registru EBP počet zbývajících bajtů v zápisovém bufferu. Výstupem je v registru EDI nový zápisový ukazatel a v registru EBP nový počet zbývajících bajtů v zápisovém bufferu. Obsah registru EAX může být funkcí zničen.

CHSET_SizeChar je ukazatel na funkci sloužící ke zjištění velikosti znaku ve výstupním bufferu. Vstupem funkce je v registru EAX Unicode köd znaku, v registru EBX ukaztatel na popisovač znakové sady CHARSET a v registru EDI čítač dat k zápisu. Funkce navrací čítač dat k zápisu v registru EDI zvýšení o odpovídající počet bajtů. Obsah registru EAX může být funkcí zničen.


; ------------- Supported code pages
; On changes verify tables with DEBUG_CODEPAGE debug flag.

CHARSETNUM	EQU	44		; number of character sets

				; special single byte codes
CP_ASCII	EQU	0		; ASCII
CP_DEC		EQU	1		; DEC VT100 graphics
				; OEM Codepages (DOS)
CP_IBM437	EQU	437		; IBM-437 (United States)
CP_IBM720	EQU	720		; Asmo-720 (Arabic)
CP_IBM737	EQU	737		; IBM-737 (Greek)
CP_IBM775	EQU	775		; IBM-775 (Baltic)
CP_IBM850	EQU	850		; IBM-850 (Latin 1, West Europe)
CP_IBM852	EQU	852		; IBM-852 (Latin 2, Central European)
CP_IBM855	EQU	855		; IBM-855 (Cyrillic, primarily Russian)
CP_IBM857	EQU	857		; IBM-857 (Turkish)
CP_IBM858	EQU	858		; IBM-858 (Latin 1 + Euro)
CP_IBM860	EQU	860		; IBM-860 (Portuguese)
CP_IBM861	EQU	861		; IBM-861 (Icelandic)
CP_IBM862	EQU	862		; IBM-862 (Hebrew)
CP_IBM863	EQU	863		; IBM-863 (French Canadian)
CP_IBM865	EQU	865		; IBM-865 (Nordic)
CP_IBM866	EQU	866		; IBM-866 (Russian)
CP_IBM869	EQU	869		; IBM-869 (Modern Greek)
CP_IBM895	EQU	895		; IBM-895 (Kamenickych, Czech)
				; Windows Single Byte Character Set Codepages
CP_WIN874	EQU	874		; Windows-874 (Thai)
CP_WIN1250	EQU	1250		; Windows-1250 (Central Europe)
CP_WIN1251	EQU	1251		; Windows-1251 (Cyrillic)
CP_WIN1252	EQU	1252		; Windows-1252 (Latin 1 Windows)
CP_WIN1253	EQU	1253		; Windows-1253 (Greek)
CP_WIN1254	EQU	1254		; Windows-1254 (Turkish)
CP_WIN1255	EQU	1255		; Windows-1255 (Hebrew)
CP_WIN1256	EQU	1256		; Windows-1256 (Arabic)
CP_WIN1257	EQU	1257		; Windows-1257 (Baltic)
CP_WIN1258	EQU	1258		; Windows-1258 (Vietnam)
				; ISO Codepages
CP_ISO88591	EQU	28591		; ISO 8859-1 (Latin 1 Western European)
CP_ISO88592	EQU	28592		; ISO 8859-2 (Latin 2 Central European)
CP_ISO88593	EQU	28593		; ISO 8859-3 (Latin 3)
CP_ISO88594	EQU	28594		; ISO 8859-4 (Baltic)
CP_ISO88595	EQU	28595		; ISO 8859-5 (Cyrillic)
CP_ISO88596	EQU	28596		; ISO 8859-6 (Arabic)
CP_ISO88597	EQU	28597		; ISO 8859-7 (Greek)
CP_ISO88598	EQU	28598		; ISO 8859-8 (Hebrew)
CP_ISO88599	EQU	28599		; ISO 8859-9 (Turkish)
CP_ISO885915	EQU	28605		; ISO 8859-15 (Latin 9)
				; multibyte codepages
CP_UTF16LE	EQU	1200		; Unicode UTF-16LE (little endian, PC)
CP_UTF16BE	EQU	1201		; Unicode UTF-16BE (big endian, MAC)
CP_UTF32LE	EQU	12000		; Unicode UTF-32LE (little endian, PC)
CP_UTF32BE	EQU	12001		; Unicode UTF-32BE (big endian, MAC)
CP_UTF8		EQU	65001		; Unicode UTF-8

CP_UNICODE	EQU	CP_UTF32LE	; native Unicode code page

Výše uvedená tabulka obsahuje definice ködů znakových sad.. CHARSETNUM je počet podporovaných znakových sad. Tato konstanta spolu s platností tabulek znakových sad je ověřována v ladicím režimu při vývoji jádra po zapnutí přepínače DEBUG_CODEPAGE.


UNISUBPAGES	EQU	177		; number of conversion subpages

Konstanta UNISUBPAGES definuje počet podstránek sloužících ke konverzi mezi znakovými sadami. Konstanta se určuje empiricky v ladicím režimu při vývoji jádra po zapnutí přepínače DEBUG_CODEPAGE.


; ------------- Macro - Continuous area of WORD incremental values
; %1 = start value, %2 = end value

%macro		INCW	2
		%assign INCW_INX %1
		%rep	(%2-%1+1)
		dw	INCW_INX
		%assign	INCW_INX INCW_INX + 1
		%endrep
%endmacro

Macro INCW je pomocné makro sloužící k vytvoření oblasti inkrementovaných WORD hodnot a používá se v definici tabulek znakových sad. Prvním parametrem makra je počáteční hodnota, druhým parametrem je koncová hodnota.


; ------------- Macro - Area of NULL pointers (%1 = number of pointers)

%macro		REPNULL	1
		%rep	%1
		dd	NULL
		%endrep
%endmacro

Macro REPNULL je pomocné makro sloužící k vytvoření oblasti nulových ukazatelů a používá se v definici tabulek znakových sad. Parametrem makra je počet nulových ukazatelů.


; ------------- Macro - Area of invalid tables (%1 = number of pointers)

%macro		REPINV	1
		%rep	%1
		dd	CharSetNone
		%endrep
%endmacro

Macro REPINV je pomocné makro sloužící k vytvoření oblasti ukazatelů na neplatnou znakovou sadu a používá se v definici tabulek znakových sad. Parametrem makra je počet ukazatelů. Neplatná znaková sada CharSetNone se pro úsporu paměti překrývá s nulovou paměťovou stránkou PageEmpty.


; ------------- Macro - Initialized single byte character set (CHARSET)
; %1 = code page
; CHSINIS - size of table from Unicode

%macro		CHSINI	1

		dw	%1		; code page
		db	0		; ...reserved
		db	0		; flags
		dd	CP %+ %1 %+ ToUniTab ; table to Unicode
		dd	CharSetFromUni+CHSINIS ; table from Unicode
		dd	CharSBRead	; read character from buffer
		dd	CharSBWrite	; write character into buffer
		dd	CharSBSize	; get size of character
%assign	CHSINIS CHSINIS + FONTMAP*4	; (FONTMAP*4 = 152)
%endmacro

Macro CHSINI je pomocné makro sloužící k deklaraci jedné 1-bajtové znakové sady. Parametrem makra je číslo kódové stránky. To je použito k sestavení návěští tabulky pro převod znaku na kód Unicode. Tabulka pro převod z kódu Unicode je generována prgramově, proto je pomocí makra nastaven jen ukazatel na tabulku, který používá inkrementované symbolické jméno CHSINIS. Funkce pro čtení, zápis a velikost znaků se používají pro všechny 1-bajtové znakové sady stejné.


; ------------- Macro - Initialized multibyte character set (CHARSET)
; %1 = code page, %2 = read character, %3 = write character, %4 = size of char

%macro		CHSINI2	4

		dw	%1		; code page
		db	0		; ...reserved
		db	CHSET_MBYTE	; flags
		dd	NULL		; table to Unicode
		dd	NULL		; table from Unicode
		dd	%2		; read character from buffer
		dd	%3		; write character into buffer
		dd	%4		; get size of character
%endmacro

Macro CHSINI2 je pomocné makro sloužící k deklaraci jedné vícebajtové znakové sady. Prvním parametrem makra je kódová stránka. Druhým parametrem je funkce pro čtení znaku, třetím parametrem funkce pro zápis znaku a čtvrtým parametrem funkce pro zjištění velikosti znaku. Protože se jedná o vícebajtovou znakovou sadu, nejsou použity tabulky pro převod znaku na/z Unicode.


Obsah / Utility / CHARSET / Datové struktury a makra