diff options
Diffstat (limited to 'Build/source/texk/web2c/uptexdir/kanji.c')
-rw-r--r-- | Build/source/texk/web2c/uptexdir/kanji.c | 94 |
1 files changed, 82 insertions, 12 deletions
diff --git a/Build/source/texk/web2c/uptexdir/kanji.c b/Build/source/texk/web2c/uptexdir/kanji.c index 66bd8704479..ddeca5a535c 100644 --- a/Build/source/texk/web2c/uptexdir/kanji.c +++ b/Build/source/texk/web2c/uptexdir/kanji.c @@ -6,17 +6,36 @@ #include "kanji.h" #define CS_TOKEN_FLAG 0x1FFFFFFF +#define IVS_CHAR_LIMIT 0x4400000 #define CJK_CHAR_LIMIT 0x1000000 +#define UCS_CHAR_LIMIT 0x120000 #define CJK_TOKEN_FLAG 0xFFFFFF +#define CAT_LEFT_BRACE 1 +#define CAT_DELIM_NUM 15 #define KCAT_KANJI 16 -#define KCAT_HANGUL 19 +#define KCAT_MODIFIER 20 +#define KCAT_KANJI_IVS 23 /* TOKEN */ boolean check_kanji (integer c) { + integer c0, c1; + if (c >= CS_TOKEN_FLAG) return false; - else if (!(XXHi(c)>=KCAT_KANJI && XXHi(c)<=KCAT_HANGUL)) return false; - else return is_char_kanji(c & CJK_TOKEN_FLAG); + + c0 = c & CJK_TOKEN_FLAG; + c1 = XXHi(c); + if (c1>=CAT_LEFT_BRACE && c1<=CAT_DELIM_NUM && + c0 < UCS_CHAR_LIMIT) { + return is_char_kanji(c0); + } + else if (c1>=KCAT_KANJI && c1<=KCAT_MODIFIER) { + return is_char_kanji(c0); + } + else if (c1>=KCAT_KANJI_IVS+1 && c1<=KCAT_KANJI_IVS+4) { + return is_char_kanji(c - KCAT_KANJI_IVS * CJK_CHAR_LIMIT); + } + return false; } boolean is_char_ascii(integer c) @@ -27,7 +46,7 @@ boolean is_char_ascii(integer c) boolean is_char_kanji(integer c) { if (is_internalUPTEX()) - return ((c >= 0)&&(c<CJK_CHAR_LIMIT)); + return ((c >= 0)&&(c<IVS_CHAR_LIMIT)); else return iskanji1(Hi(c)) && iskanji2(Lo(c)); } @@ -55,6 +74,22 @@ integer calc_pos(integer c) return(c1 + c2); /* ret = 0..255 */ } +integer ktoken_to_cmd(integer c) +{ + if (c > KCAT_KANJI_IVS * CJK_CHAR_LIMIT) + return KCAT_KANJI; + else + return (c / CJK_CHAR_LIMIT); +} + +integer ktoken_to_chr(integer c) +{ + if (c > KCAT_KANJI_IVS * CJK_CHAR_LIMIT) + return (c - KCAT_KANJI_IVS * CJK_CHAR_LIMIT); + else + return (c % CJK_CHAR_LIMIT); +} + /* Ref. http://www.unicode.org/Public/UNIDATA/Blocks.txt */ /* # Blocks-15.1.0.txt */ /* # Date: 2023-07-28, 15:47:20 GMT */ @@ -396,6 +431,7 @@ static long ucs_range[]={ 0xD0000, /* reserved */ 0xE0000, /* Tags */ 0xE0100, /* Variation Selectors Supplement */ /* 0x150 */ + 0xE01F0, /* reserved */ 0xF0000, /* Supplementary Private Use Area-A */ 0x100000, /* Supplementary Private Use Area-B */ /* Value over 0x10FFFF is illegal under Unicode, @@ -412,13 +448,21 @@ static long ucs_range[]={ 0x1A0000, /* Reserved */ 0x1B0000, /* Reserved */ 0x1C0000, /* Reserved */ - 0x1D0000, /* Reserved */ - 0x1E0000, /* Reserved */ /* 0x160 */ + 0x1D0000, /* Reserved */ /* 0x160 */ + 0x1E0000, /* Reserved */ 0x1F0000, /* Reserved */ 0x200000, /* Reserved */ 0x210000, /* Reserved */ - 0x220000, /* Reserved */ /* 0x164 */ - CJK_CHAR_LIMIT + 0x220000, /* Kana with Voiced Sound Mark */ + 0x240000, /* Kana with Semi-Voiced Sound Mark */ + 0x25E6E6, /* Emoji Flag Sequence */ + 0x260000, /* Emoji with Modifier Fitzpatrick */ + 0x300000, /* Reserved */ + 0x400000, /* Standardized Variation Sequence */ + 0x800000, /* Emoji Keycap Sequence */ + 0x800080, /* Ideographic Variation Sequence */ /* 0x16C */ + CJK_CHAR_LIMIT, /* Ideographic Variation Sequence, VS49..VS256 */ + IVS_CHAR_LIMIT }; #define NUCS_RANGE (sizeof(ucs_range)/sizeof(ucs_range[0])) @@ -447,6 +491,9 @@ binary_search (long x, long *a, int left, int right) #define LATIN_SMALL_LETTER_O_WITH_DIAERESIS 0x00F6 #define LATIN_SMALL_LETTER_O_WITH_STROKE 0x00F8 #define LATIN_SMALL_LETTER_Y_WITH_DIAERESIS 0x00FF +#define COMBINING_ENCLOSING_KEYCAP 0x20E3 +#define COMBINING_KANA_VOICED_SOUND_MARK 0x3099 +#define COMBINING_KANA_SEMI_VOICED_SOUND_MARK 0x309A #define FULLWIDTH_DIGIT_0 0xFF10 #define FULLWIDTH_DIGIT_9 0xFF19 #define FULLWIDTH_CAPITAL_A 0xFF21 @@ -457,13 +504,18 @@ binary_search (long x, long *a, int left, int right) #define HALFWIDTH_KATAKANA_SMALL_TSU 0xFF6F #define HALFWIDTH_KATAKANA_A 0xFF71 #define HALFWIDTH_KATAKANA_N 0xFF9D +#define REGIONAL_INDICATOR_SYMBOL_LETTER_A 0x1F1E6 +#define REGIONAL_INDICATOR_SYMBOL_LETTER_Z 0x1F1FF +#define EMOJI_MODIFIER_FITZPATRIC_TYPE1_2 0x1F3FB +#define EMOJI_MODIFIER_FITZPATRIC_TYPE6 0x1F3FF integer kcatcodekey(integer c) { integer block; if (is_internalUPTEX()) { block = binary_search((long)c, ucs_range, 0, NUCS_RANGE-1); - if (block==0x01) { /* Block : Latin-1 Supplement */ + switch (block) { + case 0x01: /* Block : Latin-1 Supplement */ /* Latin-1 Letters */ if ( FEMININE_ORDINAL_INDICATOR ==c || MASCULINE_ORDINAL_INDICATOR==c @@ -471,17 +523,35 @@ integer kcatcodekey(integer c) || (LATIN_CAPITAL_LETTER_O_WITH_STROKE<=c && c<=LATIN_SMALL_LETTER_O_WITH_DIAERESIS ) || (LATIN_SMALL_LETTER_O_WITH_STROKE <=c && c<=LATIN_SMALL_LETTER_Y_WITH_DIAERESIS ) ) return 0x1FD; - } - if (block==0xa2) { /* Block : Halfwidth and Fullwidth Forms */ + break; + case 0xa2: /* Block : Halfwidth and Fullwidth Forms */ /* Fullwidth ASCII variants except for U+FF01..FF0F, U+FF1A..FF20, U+FF3B..FF40, U+FF5B..FF5E */ if ( (FULLWIDTH_DIGIT_0 <=c && c<=FULLWIDTH_DIGIT_9 ) || (FULLWIDTH_CAPITAL_A<=c && c<=FULLWIDTH_CAPITAL_Z) || (FULLWIDTH_SMALL_A <=c && c<=FULLWIDTH_SMALL_Z ) ) return 0x1FE; - /* Halfwidth Katakana variants except for U+FF65, U+FF70, U+FF9E..FF9F */ + /* Halfwidth Katakana variants except for U+FF65, U+FF70, U+FF9E..FF9F */ if ( (HALFWIDTH_KATAKANA_WO <=c && c<=HALFWIDTH_KATAKANA_SMALL_TSU ) || (HALFWIDTH_KATAKANA_A <=c && c<=HALFWIDTH_KATAKANA_N ) ) return 0x1FF; + break; + case 0x6c: /* Block : Hiragana */ + if ( COMBINING_KANA_VOICED_SOUND_MARK==c + || COMBINING_KANA_SEMI_VOICED_SOUND_MARK==c ) + return 0x1F9; + break; + case 0x4b: /* Block : Combining Diacritical Marks for Symbols */ + if ( COMBINING_ENCLOSING_KEYCAP==c ) + return 0x1FA; + break; + case 0x12e: /* Block : Enclosed Alphanumeric Supplement */ + if ( REGIONAL_INDICATOR_SYMBOL_LETTER_A <=c && c<= REGIONAL_INDICATOR_SYMBOL_LETTER_Z ) + return 0x1FB; + break; + case 0x130: /* Block : Miscellaneous Symbols and Pictographs */ + if ( EMOJI_MODIFIER_FITZPATRIC_TYPE1_2 <=c && c<= EMOJI_MODIFIER_FITZPATRIC_TYPE6 ) + return 0x1FC; + break; } return block; } else { |