X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fmule-charset.c;h=9cb60156c57c993d755844dbe8b7dcdfde47cf7e;hb=9361c26d7f48c5ee778ea522c75dc12a1fbfa7f3;hp=14efd207660fc94ce1d66a254faf69ebc6604756;hpb=44f4095af638e59ec6534d3019fbde320220e210;p=chise%2Fxemacs-chise.git.1 diff --git a/src/mule-charset.c b/src/mule-charset.c index 14efd20..9cb6015 100644 --- a/src/mule-charset.c +++ b/src/mule-charset.c @@ -845,6 +845,74 @@ get_unallocated_leading_byte (int dimension) #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, int without_inheritance) { @@ -873,39 +941,18 @@ decode_defined_char (Lisp_Object ccs, int code_point, int without_inheritance) 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, without_inheritance); + return DECODE_CHAR (mother, code, without_inheritance); else - return decode_defined_char (mother, code_point, + return decode_defined_char (mother, code, without_inheritance); } - 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, - without_inheritance); - } - 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, - without_inheritance); - } } return -1; } @@ -920,69 +967,16 @@ decode_builtin_char (Lisp_Object charset, int code_point) { 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 {