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

Obsah / Utility / UNICHAR / Datové struktury a makra

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


Datové struktury a makra


UNINOASC	EQU	"?"		; invalid ASCII alternative

CHTYPEMAX	EQU	2cffh		; maximal Unicode character type
					; ... on change run DebCheckNat!
NAT_MAXAHASH	EQU	(CHTYPEMAX/256+1) ; maximal alphabetic sub-table
NATSUBPAGES	EQU	1128		; size of nationality hash subpages

Konstanta UNINOASC je implicitní znak nahrazující znak, který nemá ve znakové tabulce odpovídající ekvivalent. Konstanta CHTYPEMAX je maximální hodnota Unicode znaku, která je tabulkami systému Litos podporována. Konstanta NAT_MAXAHASH určuje velikost abecední hashovací tabulky (tj. počet převodních 256-znakových stránek). Konstanta NATSUBPAGES je velikost národnostní hashovací tabulky. Hodnoty konstant jsou odvozeny pomocí ladicího překladu s přepínačemi DEBUG_NATION a DEBUG_UNICHECK.


; ------------- Unicode character type

struc		UNITYPE

UNI_Flags:	resb	1		; 0: character flags (see below)
UNI_ASCII:	resb	1		; 1: ASCII alternative (UNINOASC=none)
UNI_Change:	resw	1		; 2: change small/cap. letter (0=none)

endstruc				; size 4 bytes

; ------------- Unicode character flags

CHNONE		EQU	0		; invalid character (hardcoded)

CHCTR		EQU	B0		; control character (flow control)
CHSPC		EQU	B1		; space (printable gap)
CHMRK		EQU	B2		; mark !?,.[]:'()
CHSIG		EQU	B3		; sign @#$%&*= (significant characters)
CHDIG		EQU	B4		; digit 0123456789
CHMOD		EQU	B5		; modifier (combined on same position)
CHCAP		EQU	B6		; capital letter (and other letters)
CHSMA		EQU	B7		; small letter

Struktura UNITYPE je popisovač typu jednoho znaku Unicode. První položka, UNI_Flags, je příznaková maska typu znaku. Maska obsahuje právě jeden z příznaků, jejichž seznam následuje za popisovačem struktury. To umožňuje snadné testování množiny typů znaků pomocí masky.

Položka UNI_ASCII je ASCII alternativa znaku v případě, že pro znak nelze nalézt v dané znakové tabulce odpovídající ekvivalent. U znaků latinky s diakritickým znamémkem je ASCII ekvivalentem odpovídající písmeno bez diakritiky. U ostatních znaků je ekvivalentem znak podobný alespoň vzhledově nebo náhradní implicitní znak UNINOASC.

Položka UNI_Change je Unicode kód párového písmene s opačnou velikostí velké/malé písmeno. Pokud nemá znak odpovídající párový doplněk, je položka nastavena na nulu.


; ------------- Macro - Initialized Unicode character type
; %1 = character flags, %2 = ASCII alternative, %3 = change small/capital

%macro		UNITP	3
		db	%1		; character flags
		db	%2		; ASCII alternative (UNINOASC=none)
		dw	%3		; change small/capital letter (0=none)
%endmacro

Makro UNITP je pomocné makro použité v definičních tabulkách s využitím následujících maker, která slouží k zápisu definičních tabulek typů znaků Unicode.


; ------------- Macro - Area of Unicode character types - invalid characters
; %1 = number of characters

%macro		UNIINV	1
		%rep	%1
		UNITP	CHNONE, UNINOASC, 0
		%endrep
%endmacro

UNIINV je oblast neplatných znaků. Parametrem makra je počet znaků.


; ------------- Macro - Area of Unicode character types - control
; %1 = number of characters

%macro		UNICTR	1
		%rep	%1
		UNITP	CHCTR, UNINOASC, 0
		%endrep
%endmacro

UNICTR je oblast řídicích znaků s neplatným ASCII ekvivalentem. Parametrem makra je počet znaků.


; ------------- Macro - Area of initialized Unicode character types - control
; %1 = starting character, %2 = number of characters

%macro		UNICTRCH 2
		%assign CTRL_CH %1
		%rep	%2
		UNITP	CHCTR, CTRL_CH, 0
		%assign CTRL_CH CTRL_CH + 1
		%endrep
%endmacro

UNICTRCH je oblast inicializovaných řídicích znaků. Prvním parametrem makra je číslo prvního řídicího znaku (ASCII hodnota), druhým parametrem je počet znaků. Makro ukládá znaky s rostoucí ASCII hodnotou.


; ------------- Macro - Area of Unicode character types - space
; %1 = number of characters

%macro		UNISPC	1
		%rep	%1
		UNITP	CHSPC, " ", 0
		%endrep
%endmacro

UNISPC je oblast znaků mezery. Parametrem makra je počet znaků.


; ------------- Macro - Initialized Unicode character type - mark
; %1 = ASCII alternative

%macro		UNIMRK	1
		UNITP	CHMRK, %1, 0
%endmacro

UNIMRK je jeden inicializovaný znak značky. Parametrem makra je ASCII ekvivalent značky.


; ------------- Macro - Area of Unicode character types - mark
; %1 = number of characters

%macro		UNIMRKNUM 1
		%rep	%1
		UNITP	CHMRK, UNINOASC, 0
		%endrep
%endmacro

UNIMRKNUM je oblast znaků značek s neplatným ASCII ekvivalentem. Parametrem makra je počet znaků.


; ------------- Macro - Initialized Unicode character type - sign
; %1 = ASCII alternative

%macro		UNISIG	1
		UNITP	CHSIG, %1, 0
%endmacro

UNISIG je jeden inicializovaný znak symbolu. Parametrem makra je ASCII ekvivalent symbolu.


; ------------- Macro - Area of Unicode character types - sign
; %1 = number of characters

%macro		UNISIGNUM 1
		%rep	%1
		UNITP	CHSIG, UNINOASC, 0
		%endrep
%endmacro

UNISIGNUM je oblast znaků symbolů s neplatným ASCII ekvivalentem. Parametrem makra je počet znaků.


; ------------- Macro - Area of initialized Unicode character types - sign
; %1 = character, %2 = number of characters

%macro		UNISIGCH 2
		%rep	%2
		UNITP	CHSIG, %1, 0
		%endrep
%endmacro

UNISIGCH je oblast inicializovaných znaků symbolů. Prvním parametrem makra je ASCII ekvivalent symbolů, druhým parametrem je počet znaků.


; ------------- Macro - Initialized Unicode character type - digit
; %1 = ASCII alternative

%macro		UNIDIG	1
		UNITP	CHDIG, %1, 0
%endmacro

UNIDIG je jeden inicializovaný znak číslice. Parametrem makra je ASCII ekvivalent číslice.


; ------------- Macro - Area of Unicode character types - digit
; %1 = number of characters

%macro		UNIDIGNUM 1
		%rep	%1
		UNITP	CHDIG, UNINOASC, 0
		%endrep
%endmacro

UNIDIGNUM je oblast znaků číslic s neplatným ASCII ekvivalentem. Parametrem makra je počet znaků.


; ------------- Macro - Area of initialized Unicode character types - digit
; %1 = starting character, %2 = number of characters

%macro		UNIDIGCH 2
		%assign UNIDIG_CH %1
		%rep	%2
		UNITP	CHDIG, UNIDIG_CH, 0
		%assign	UNIDIG_CH UNIDIG_CH + 1
		%endrep
%endmacro

UNIDIGCH je oblast inicializovaných znaků číslic. Prvním parametrem makra je ASCII hodnota první číslice, druhým parametrem je počet znaků. Makro ukládá znaky číslic s rostoucí ASCII hodnotou.


; ------------- Macro - Initialized Unicode character type - modifier
; %1 = ASCII alternative

%macro		UNIMOD	1
		UNITP	CHMOD, %1, 0
%endmacro

UNIMOD je jeden inicializovaný znak modifikátoru. Parametrem makra je ASCII ekvivalent modifikátoru.


; ------------- Macro - Area of Unicode character types - modifier
; %1 = number of characters

%macro		UNIMODNUM 1
		%rep	%1
		UNITP	CHMOD, UNINOASC, 0
		%endrep
%endmacro

UNIMODNUM je oblast znaků modifiátorů s neplatným ASCII ekvivalentem. Parametrem makra je počet znaků.


; ------------- Macro - Initialized Unicode character type - capital
; %1 = ASCII alternative, %2 = small letter

%macro		UNICAP	2
		UNITP	CHCAP,%1,%2
%endmacro

UNICAP je jeden inicializovaný znak velkého písmene. Prvním parametrem makra je ASCII ekvivalent znaku, druhým parametrem je Unicode kód odpovídajícího malého písmene..


; ------------- Macro - Area of Unicode character types - capital
; %1 = number of characters

%macro		UNICAPNUM 1
		%rep	%1
		UNITP	CHCAP, UNINOASC, 0
		%endrep
%endmacro

UNICAPNUM je oblast znaků velkých písmen s neplatným ASCII ekvivalentem. Parametrem makra je počet znaků.


; ------------- Macro - Initialized Unicode character type - small
; %1 = ASCII alternative, %2 = capital letter

%macro		UNISMA	2
		UNITP	CHSMA,%1,%2
%endmacro

UNISMA je jeden inicializovaný znak malého písmene. Prvním parametrem makra je ASCII ekvivalent znaku, druhým parametrem je Unicode kód odpovídajícího velkého písmene..


; ------------- Macro - Area of Unicode character types - small
; %1 = number of characters

%macro		UNISMANUM 1
		%rep	%1
		UNITP	CHSMA, UNINOASC, 0
		%endrep
%endmacro

UNISMANUM je oblast znaků malých písmen s neplatným ASCII ekvivalentem. Parametrem makra je počet znaků.


; ------------- Macro - Area of initialized Unicode character types - small
; %1 = starting character, %2 = number of characters

%macro		UNISMACH 2
		%assign UNISMA_CH %1
		%rep	%2
		UNITP	CHSMA, UNISMA_CH, 0
		%assign UNISMA_CH UNISMA_CH + 1
		%endrep
%endmacro

UNISMACH je oblast inicializovaných znaků malých písmen. Prvním parametrem makra je ASCII hodnota prvního písmene, druhým parametrem je počet znaků. Makro ukládá znaky písmen s rostoucí ASCII hodnotou.


; ------------- Macro - Initialized Unicode capital/small pairs
; %1 = starting index, %2 = number of character pairs

%macro		UNICAPSMA 2
		%assign CAPSMA_INX %1
		%rep	%2
		%assign CAPSMA_INX CAPSMA_INX + 1
		UNICAP	UNINOASC,CAPSMA_INX
		%assign CAPSMA_INX2 CAPSMA_INX - 1
		UNISMA	UNINOASC,CAPSMA_INX2
		%assign CAPSMA_INX CAPSMA_INX + 1
		%endrep
%endmacro

UNICAPSMA je oblast inicializovaných párů velkých a malých písmen. Prvním parametrem makra je Unicode hodnota prvního velkého písmene, druhým parametrem je počet párů znaků. Makro ukládá páry velkých a malých písmen s rostoucí Unicode hodnotou. Nejdříve je uloženo velké písmeno, okazuje na následující malé písmeno. Jako druhé je uloženo malé písmeno odkazující na předešlé velké písmeno.


; ------------- Macro - Initialized Unicode capital with small index
; %1 = starting index of small, %2 = number of characters

%macro		UNICAPINX 2
		%assign CAPSMA_INX %1
		%rep	%2
		UNICAP	UNINOASC,CAPSMA_INX
		%assign CAPSMA_INX CAPSMA_INX + 1
		%endrep
%endmacro

UNICAPINX je oblast inicializovaných velkých písmen odkazujících na oblast malých písmen. Prvním parametrem makra je Unicode hodnota prvního malého písmene (na které se první velké písmeno odkazuje), druhým parametrem je počet znaků. Makro ukládá velká písmena s rostoucím Unicode odkazem do oblasti malých písmen.


; ------------- Macro - Initialized Unicode capital with small index
; %1 = starting character, %2 = starting small, %3 = number of characters

%macro		UNICAPINXCH 3
		%assign UNICAP_CH %1
		%assign CAPSMA_INX %2
		%rep	%3
		UNICAP	UNICAP_CH,CAPSMA_INX
		%assign UNICAP_CH UNICAP_CH + 1
		%assign CAPSMA_INX CAPSMA_INX + 1
		%endrep
%endmacro

UNICAPINXCH je oblast inicializovaných velkých písmen odkazujících na oblast malých písmen a s ASCII ekvivalentem. Prvním parametrem makra je ASCII hodnota prvního písmene, druhým parametrem je Unicode hodnota prvního malého písmene (na které se první velké písmeno odkazuje), třetím parametrem je počet znaků. Makro ukládá velká písmena s rostoucí ASCII hodnotou a rostoucím Unicode odkazem do oblasti malých písmen.


; ------------- Macro - Initialized Unicode small with capital index
; %1 = starting index of capital, %2 = number of characters

%macro		UNISMAINX 2
		%assign CAPSMA_INX %1
		%rep	%2
		UNISMA	UNINOASC,CAPSMA_INX
		%assign CAPSMA_INX CAPSMA_INX + 1
		%endrep
%endmacro

UNISMAINX je oblast inicializovaných malých písmen odkazujících na oblast velkých písmen. Prvním parametrem makra je Unicode hodnota prvního velkého písmene (na které se první malé písmeno odkazuje), druhým parametrem je počet znaků. Makro ukládá malá písmena s rostoucím Unicode odkazem do oblasti velkých písmen.


; ------------- Macro - Initialized Unicode small with capital index
; %1 = starting character, %2 = starting capital, %3 = number of characters

%macro		UNISMAINXCH 3
		%assign UNISMA_CH %1
		%assign CAPSMA_INX %2
		%rep	%3
		UNISMA	UNISMA_CH,CAPSMA_INX
		%assign UNISMA_CH UNISMA_CH + 1
		%assign CAPSMA_INX CAPSMA_INX + 1
		%endrep
%endmacro

UNISMAINXCH je oblast inicializovaných malých písmen odkazujících na oblast velkých písmen a s ASCII ekvivalentem. Prvním parametrem makra je ASCII hodnota prvního písmene, druhým parametrem je Unicode hodnota prvního velkého písmene (na které se první malé písmeno odkazuje), třetím parametrem je počet znaků. Makro ukládá malá písmena s rostoucí ASCII hodnotou a rostoucím Unicode odkazem do oblasti velkých písmen.


; ------------- Macro - Area of invalid Unicode character type tables
; %1 = number of tables

%macro		INVCHTYPE 1
		%rep	%1
		dd	CHTypeInv
		%endrep
%endmacro

INVCHTYPE je oblast neplatných tabulek znaků. Parametrem makra je počet tabulek. Jedna tabulka je pole 256 neplatných znaků (UNIINV 256).


; ------------- Macro - get pointer to descriptor of Unicode character type
; %1 = register with input character, %2 = input character LOW byte register,
; %3 = input character HIGH byte register, %4 = temporary register (can be
; the same with input character), %5 = output register with pointer to UNITYPE
; Input character must be in valid range 0 to CHTYPEMAX.

%macro		GETUNITYPE 5
		movzx	%5,%3		; %5 <- character HIGH
		mov	%5,[CHTypeTab+%5*4] ; %5 <- subtable
		movzx	%4,%2		; %4 <- character LOW
		lea	%5,[%5+%4*UNITYPE_size] ; %5 <- descriptor address
%endmacro

Makro GETUNITYPE slouží k načtení ukazatele na popisovač typu Unicode znaku. Prvním parametrem makra je jméno vstupního registru s Unicode kódem znaku (povolené registry jsou EAX, EBX, ECX, EDX). Vstupní hodnota Unicode znaku musí být v platném rozsahu 0 až CHTYPEMAX. Druhým parametrem je jméno nejnižšího bajtu vstupního registru (tedy AL, BL, CL, DL). Třetím parametrem je jméno vyššího bajtu vstupního registru (tedy AH, BH, CH, DH). Čtvrtým parametrem je jméno pracovního registru, tedy registru, jehož obsah může být zničen. Může se jednat o vstupní registr, pokud jeho obsah již není dále potřeba. Pátým parametrem je jméno výstupního registru, do kterého bude uložen ukazatel na popisovač UNITYPE.

První instrukce makra připraví do výstupního registru vyšší bajt kódu znaku. Ten je následující instrukcí využit k načtení ukazatele na podtabulku 256 znaků, opět do výstupního registru. Třetí instrukce připraví do přechodného registru nižší bajt kódu znaku. Ten je v poslední instrukci sloučen s ukazatelem do podtabulky do výstupního registru tak, aby ukazoval na položku popisovače typu znaku.


Obsah / Utility / UNICHAR / Datové struktury a makra