+ else /* if (dim == 4) */
+ {
+ Lisp_Object table2
+ = get_ccs_octet_table (table1, ccs, (unsigned char)(code_point >> 24));
+ Lisp_Object table3
+ = get_ccs_octet_table (table2, ccs, (unsigned char)(code_point >> 16));
+ Lisp_Object table4
+ = get_ccs_octet_table (table3, ccs, (unsigned char)(code_point >> 8));
+
+ table4 = put_ccs_octet_table (table4, ccs,
+ (unsigned char)code_point, character);
+ table3 = put_ccs_octet_table (table3, ccs,
+ (unsigned char)(code_point >> 8), table4);
+ table2 = put_ccs_octet_table (table2, ccs,
+ (unsigned char)(code_point >> 16), table3);
+ XCHARSET_DECODING_TABLE (ccs)
+ = put_ccs_octet_table (table1, ccs,
+ (unsigned char)(code_point >> 24), table2);
+ }
+}
+
+INLINE_HEADER void
+decoding_table_remove_char (Lisp_Object ccs, int code_point);
+INLINE_HEADER void
+decoding_table_remove_char (Lisp_Object ccs, int code_point)
+{
+ decoding_table_put_char (ccs, code_point, Qunbound);
+}
+
+Emchar decode_defined_char (Lisp_Object charset, int code_point);
+
+INLINE_HEADER Emchar DECODE_CHAR (Lisp_Object charset, int code_point);
+INLINE_HEADER Emchar
+DECODE_CHAR (Lisp_Object charset, int code_point)
+{
+ Emchar char_id = decode_defined_char (charset, code_point);
+
+ if (char_id >= 0)
+ return char_id;
+ else if (XCHARSET_DIMENSION (charset) == 1)
+ return decode_builtin_char (charset, code_point);
+ else if (EQ (charset, Vcharset_chinese_big5_1))
+ {
+ unsigned int I
+ = ((code_point >> 8) - 33) * (0xFF - 0xA1)
+ + ((code_point & 0xFF) - 33);
+ unsigned char b1 = I / (0xFF - 0xA1 + 0x7F - 0x40) + 0xA1;
+ unsigned char b2 = I % (0xFF - 0xA1 + 0x7F - 0x40);
+
+ b2 += b2 < 0x3F ? 0x40 : 0x62;
+ return DECODE_CHAR (Vcharset_chinese_big5, (b1 << 8) | b2);
+ }
+ else if (EQ (charset, Vcharset_chinese_big5_2))
+ {
+ unsigned int I
+ = ((code_point >> 8) - 33) * (0xFF - 0xA1)
+ + ((code_point & 0xFF) - 33);
+ unsigned char b1, b2;
+
+ I += (0xFF - 0xA1 + 0x7F - 0x40) * (0xC9 - 0xA1);
+ b1 = I / (0xFF - 0xA1 + 0x7F - 0x40) + 0xA1;
+ b2 = I % (0xFF - 0xA1 + 0x7F - 0x40);
+ b2 += b2 < 0x3F ? 0x40 : 0x62;
+ return DECODE_CHAR (Vcharset_chinese_big5, (b1 << 8) | b2);
+ }
+ return decode_builtin_char (charset, code_point);