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