summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/uptexdir/kanji.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/uptexdir/kanji.c')
-rw-r--r--Build/source/texk/web2c/uptexdir/kanji.c94
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 {