#define BIG5_SAME_ROW (0xFF - 0xA1 + 0x7F - 0x40)
+static int
+decode_ccs_conversion (int conv_type, int code_point)
+{
+ if ( conv_type == CONVERSION_IDENTICAL )
+ {
+ return code_point;
+ }
+ if ( conv_type == CONVERSION_94x60 )
+ {
+ int row = code_point >> 8;
+ int cell = code_point & 255;
+
+ if (row < 16 + 32)
+ return -1;
+ else if (row < 16 + 32 + 30)
+ return (row - (16 + 32)) * 94 + cell - 33;
+ else if (row < 18 + 32 + 30)
+ return -1;
+ else if (row < 18 + 32 + 60)
+ return (row - (18 + 32)) * 94 + cell - 33;
+ }
+ else if ( conv_type == CONVERSION_94x94x60 )
+ {
+ int plane = code_point >> 16;
+ int row = (code_point >> 8) & 255;
+ int cell = code_point & 255;
+
+ if (row < 16 + 32)
+ return -1;
+ else if (row < 16 + 32 + 30)
+ return
+ (plane - 33) * 94 * 60
+ + (row - (16 + 32)) * 94
+ + cell - 33;
+ else if (row < 18 + 32 + 30)
+ return -1;
+ else if (row < 18 + 32 + 60)
+ return
+ (plane - 33) * 94 * 60
+ + (row - (18 + 32)) * 94
+ + cell - 33;
+ }
+ else if ( conv_type == CONVERSION_BIG5_1 )
+ {
+ unsigned int I
+ = (((code_point >> 8) & 0x7F) - 33) * 94
+ + (( code_point & 0x7F) - 33);
+ unsigned char b1 = I / (0xFF - 0xA1 + 0x7F - 0x40) + 0xA1;
+ unsigned char b2 = I % (0xFF - 0xA1 + 0x7F - 0x40);
+
+ b2 += b2 < 0x3F ? 0x40 : 0x62;
+ return (b1 << 8) | b2;
+ }
+ else if ( conv_type == CONVERSION_BIG5_2 )
+ {
+ unsigned int I
+ = (((code_point >> 8) & 0x7F) - 33) * 94
+ + (( code_point & 0x7F) - 33)
+ + BIG5_SAME_ROW * (0xC9 - 0xA1);
+ unsigned char b1 = I / (0xFF - 0xA1 + 0x7F - 0x40) + 0xA1;
+ unsigned char b2 = I % (0xFF - 0xA1 + 0x7F - 0x40);
+
+ b2 += b2 < 0x3F ? 0x40 : 0x62;
+ return (b1 << 8) | b2;
+ }
+ return -1;
+}
+
Emchar
-decode_defined_char (Lisp_Object ccs, int code_point)
+decode_defined_char (Lisp_Object ccs, int code_point, int without_inheritance)
{
int dim = XCHARSET_DIMENSION (ccs);
Lisp_Object decoding_table = XCHARSET_DECODING_TABLE (ccs);
#endif /* HAVE_CHISE */
if (char_id >= 0)
return char_id;
- else if ( CHARSETP (mother = XCHARSET_MOTHER (ccs)) )
+ else if ( !without_inheritance
+ && CHARSETP (mother = XCHARSET_MOTHER (ccs)) )
{
- if ( XCHARSET_CONVERSION (ccs) == CONVERSION_IDENTICAL )
+ int code
+ = decode_ccs_conversion (XCHARSET_CONVERSION (ccs), code_point);
+
+ if (code >= 0)
{
+ code += XCHARSET_CODE_OFFSET(ccs);
if ( EQ (mother, Vcharset_ucs) )
- return DECODE_CHAR (mother, code_point);
+ return DECODE_CHAR (mother, code, without_inheritance);
else
- return decode_defined_char (mother, code_point);
- }
- else if ( XCHARSET_CONVERSION (ccs) == CONVERSION_BIG5_1 )
- {
- unsigned int I
- = (((code_point >> 8) & 0x7F) - 33) * 94
- + (( code_point & 0x7F) - 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_defined_char (mother, (b1 << 8) | b2);
- }
- else if ( XCHARSET_CONVERSION (ccs) == CONVERSION_BIG5_2 )
- {
- unsigned int I
- = (((code_point >> 8) & 0x7F) - 33) * 94
- + (( code_point & 0x7F) - 33)
- + BIG5_SAME_ROW * (0xC9 - 0xA1);
- unsigned char b1 = I / (0xFF - 0xA1 + 0x7F - 0x40) + 0xA1;
- unsigned char b2 = I % (0xFF - 0xA1 + 0x7F - 0x40);
-
- b2 += b2 < 0x3F ? 0x40 : 0x62;
- return decode_defined_char (mother, (b1 << 8) | b2);
+ return decode_defined_char (mother, code,
+ without_inheritance);
}
}
return -1;
{
if ( CHARSETP (mother) )
{
- int code = code_point;
-
- if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x60 )
- {
- int row = code_point >> 8;
- int cell = code_point & 255;
-
- if (row < 16 + 32)
- return -1;
- else if (row < 16 + 32 + 30)
- code = (row - (16 + 32)) * 94 + cell - 33;
- else if (row < 18 + 32 + 30)
- return -1;
- else if (row < 18 + 32 + 60)
- code = (row - (18 + 32)) * 94 + cell - 33;
- }
- else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x94x60 )
- {
- int plane = code_point >> 16;
- int row = (code_point >> 8) & 255;
- int cell = code_point & 255;
-
- if (row < 16 + 32)
- return -1;
- else if (row < 16 + 32 + 30)
- code
- = (plane - 33) * 94 * 60
- + (row - (16 + 32)) * 94
- + cell - 33;
- else if (row < 18 + 32 + 30)
- return -1;
- else if (row < 18 + 32 + 60)
- code
- = (plane - 33) * 94 * 60
- + (row - (18 + 32)) * 94
- + cell - 33;
- }
- else if ( XCHARSET_CONVERSION (charset) == CONVERSION_BIG5_1 )
- {
- unsigned int I
- = (((code_point >> 8) & 0x7F) - 33) * 94
- + (( code_point & 0x7F) - 33);
- unsigned char b1 = I / (0xFF - 0xA1 + 0x7F - 0x40) + 0xA1;
- unsigned char b2 = I % (0xFF - 0xA1 + 0x7F - 0x40);
+ int code
+ = decode_ccs_conversion (XCHARSET_CONVERSION (charset),
+ code_point);
- b2 += b2 < 0x3F ? 0x40 : 0x62;
- code = (b1 << 8) | b2;
- }
- else if ( XCHARSET_CONVERSION (charset) == CONVERSION_BIG5_2 )
- {
- unsigned int I
- = (((code_point >> 8) & 0x7F) - 33) * 94
- + (( code_point & 0x7F) - 33)
- + BIG5_SAME_ROW * (0xC9 - 0xA1);
- unsigned char b1 = I / (0xFF - 0xA1 + 0x7F - 0x40) + 0xA1;
- unsigned char b2 = I % (0xFF - 0xA1 + 0x7F - 0x40);
-
- b2 += b2 < 0x3F ? 0x40 : 0x62;
- code = (b1 << 8) | b2;
- }
- return
- decode_builtin_char (mother, code + XCHARSET_CODE_OFFSET(charset));
+ if (code >= 0)
+ return
+ decode_builtin_char (mother,
+ code + XCHARSET_CODE_OFFSET(charset));
+ else
+ return -1;
}
else
{
/************************************************************************/
#ifdef UTF2000
-DEFUN ("decode-char", Fdecode_char, 2, 3, 0, /*
+DEFUN ("decode-char", Fdecode_char, 2, 4, 0, /*
Make a character from CHARSET and code-point CODE.
If DEFINED_ONLY is non-nil, builtin character is not returned.
+If WITHOUT_INHERITANCE is non-nil, inherited character is not returned.
If corresponding character is not found, nil is returned.
*/
- (charset, code, defined_only))
+ (charset, code, defined_only, without_inheritance))
{
int c;
if (XCHARSET_GRAPHIC (charset) == 1)
c &= 0x7F7F7F7F;
if (NILP (defined_only))
- c = DECODE_CHAR (charset, c);
+ c = DECODE_CHAR (charset, c, !NILP (without_inheritance));
else
- c = decode_defined_char (charset, c);
+ c = decode_defined_char (charset, c, !NILP (without_inheritance));
return c >= 0 ? make_char (c) : Qnil;
}
CHECK_INT (code);
if (EQ (charset, Vcharset_latin_viscii))
{
- Lisp_Object chr = Fdecode_char (charset, code, Qnil);
+ Lisp_Object chr = Fdecode_char (charset, code, Qnil, Qnil);
Lisp_Object ret;
if (!NILP (chr))
c &= 0x7F7F7F7F;
#endif
c = decode_builtin_char (charset, c);
- return c >= 0 ? make_char (c) : Fdecode_char (charset, code, Qnil);
+ return
+ c >= 0 ? make_char (c) : Fdecode_char (charset, code, Qnil, Qnil);
}
#endif