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

Obsah / Utility / CHARSET / GetCharSet

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


GetCharSet - Vyhledání popisovače znakové sady

Funkce GetCharSet vyhledá ke kódové stránce odpovídající popisovač znakové sady.


; -----------------------------------------------------------------------------
;                       Get character set structure
; -----------------------------------------------------------------------------
; INPUT:	AX = codepage
; OUTPUT:	EBX = character set structure CHARSET (or NULL on error)
;		CY = codepage not found (EBX = NULL)
; -----------------------------------------------------------------------------

GetCharSet:	movzx	ebx,ah		; EBX <- high byte of codepage
		mov	ebx,[CharSetPages+ebx*4] ; EBX <- page of tables
		push	eax		; push EAX
		movzx	eax,al		; EAX <- low byte of codepage
		mov	ebx,[ebx+eax*4]	; EBX <- address of CHARSET
		pop	eax		; pop EAX
		cmp	ebx,1		; check if CHARSET is valid
		ret
; ------------- Hash table to quick search character set table (9 KB)

CharSetPages:	dd	CHSPage00	; 0000..00FF (0..255)
		dd	CHSPage01	; 0100..01FF (256..511)
		dd	CHSPage02	; 0200..02FF (512..767)
		dd	CHSPage03	; 0300..03FF (768..1023)
		dd	CHSPage04	; 0400..04FF (1024..1279)
		REPINV	41		; (0500..05FF) .. (2D00..2DFF)
		dd	CHSPage2E	; 2E00..2EFF (11776..12031)
		REPINV	64		; (2F00..2FFF) .. (6E00..6EFF)
		dd	CHSPage6F	; 6F00..6FFF (28416..28671)
		REPINV	141		; (7000..70FF) .. (FC00..FCFF)
		dd	CHSPageFD	; FD00..FDFF (64768..65023)
		REPINV	2		; (FE00..FEFF) .. (FF00..FFFF)

CHSPage00:	dd	CharSetASCII	; 0
		dd	CharSetDEC	; 1
		REPNULL	254		; (2..255)

CHSPage01:	REPNULL	181		; (256..436)
		dd	CharSet437	; 437
		REPNULL	74		; (438..511)

CHSPage02:	REPNULL	208		; (512..719)
		dd	CharSet720	; 720
		REPNULL	16		; (721..736)
		dd	CharSet737	; 737
		REPNULL	30		; (738..767)

CHSPage03:	REPNULL	7		; (768..774)
		dd	CharSet775	; 775
		REPNULL	74		; (776..849)
		dd	CharSet850	; 850
		REPNULL	1		; (851)
		dd	CharSet852	; 852
		REPNULL	2		; (853..854)
		dd	CharSet855	; 855
		REPNULL	1		; (856)
		dd	CharSet857	; 857
		dd	CharSet858	; 858
		REPNULL	1		; (859)
		dd	CharSet860	; 860
		dd	CharSet861	; 861
		dd	CharSet862	; 862
		dd	CharSet863	; 863
		REPNULL	1		; (864)
		dd	CharSet865	; 865
		dd	CharSet866	; 866
		REPNULL	2		; (867..868)
		dd	CharSet869	; 869
		REPNULL	4		; (870..873)
		dd	CharSet874	; 874
		REPNULL	20		; (875..894)
		dd	CharSet895	; 895
		REPNULL	128		; (896..1023)
		
CHSPage04:	REPNULL	176		; (1024..1199)
		dd	CharSet1200	; 1200
		dd	CharSet1201	; 1201
		REPNULL	48		; (1202..1249)
		dd	CharSet1250	; 1250
		dd	CharSet1251	; 1251
		dd	CharSet1252	; 1252
		dd	CharSet1253	; 1253
		dd	CharSet1254	; 1254
		dd	CharSet1255	; 1255
		dd	CharSet1256	; 1256
		dd	CharSet1257	; 1257
		dd	CharSet1258	; 1258
		REPNULL	21		; (1259..1279)

CHSPage2E:	REPNULL	224		; (11776..11999)
		dd	CharSet12000	; 12000
		dd	CharSet12001	; 12001
		REPNULL	30		; (12002..12031)

CHSPage6F:	REPNULL	175		; (28416..28590)
		dd	CharSet28591	; 28591
		dd	CharSet28592	; 28592
		dd	CharSet28593	; 28593
		dd	CharSet28594	; 28594
		dd	CharSet28595	; 28595
		dd	CharSet28596	; 28596
		dd	CharSet28597	; 28597
		dd	CharSet28598	; 28598
		dd	CharSet28599	; 28599
		REPNULL	5		; (28600..28604)
		dd	CharSet28605	; 28605
		REPNULL	66		; (28606..28671)

CHSPageFD:	REPNULL	233		; (64768..65000)
		dd	CharSet65001	; 65001
		REPNULL	22		; (65002..65023)

Vstupem funkce GetCharSet je v registru AX číslo kódové stránky, výstupem je v registru EBX ukazatel na popisovač znakové sady. Je-li zadána nepodporovaná kódová stránka, je navrácen příznak CY a obsah registru EBX je nulový.

K rychlému vyhledání popisovače znakové sady se používá hashovací tabulka CharSetPages. Vyšší bajt čísla kódové stránky je použit jako index a s jeho pomocí je z tabulky CharSetPages načten ukazatel na podstránku ukazatelů. Pomocí nižšího bajtu čísla kódové stránky je z podstránky načten ukazatel na popisovač znakové sady a kontrolou ukazatele je ověřeno, zda je ukazatel platný - neplatný ukazatel bude nulový.


Obsah / Utility / CHARSET / GetCharSet