X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fmule-charset.c;h=f184a29a505744f2b81f80d5a509d92fe71a3a23;hb=112b4eb6a71cd613a534b4246b4cc024ed9bf22e;hp=4a14a2111a9fbd974025ccea73d9187ff559fc7d;hpb=4990edf6821a5bef7e3d7e9dbd70bff2683f80e1;p=chise%2Fxemacs-chise.git- diff --git a/src/mule-charset.c b/src/mule-charset.c index 4a14a21..f184a29 100644 --- a/src/mule-charset.c +++ b/src/mule-charset.c @@ -308,7 +308,7 @@ Lisp_Object Qleading_byte; Lisp_Object Qshort_name, Qlong_name; #ifdef UTF2000 Lisp_Object Qmin_code, Qmax_code, Qcode_offset; -Lisp_Object Qmother, Qconversion, Q94x60, Q94x94x60; +Lisp_Object Qmother, Qconversion, Q94x60, Q94x94x60, Qbig5_1, Qbig5_2; #endif Lisp_Object Qascii, @@ -941,6 +941,29 @@ decode_defined_char (Lisp_Object ccs, int code_point) 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 -1; } @@ -990,6 +1013,29 @@ decode_builtin_char (Lisp_Object charset, int code_point) + (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); + + 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)); } @@ -1104,7 +1150,13 @@ charset_code_point (Lisp_Object charset, Emchar ch) { int d = code - XCHARSET_CODE_OFFSET (charset); - if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x60 ) + if ( XCHARSET_CONVERSION (charset) == CONVERSION_IDENTICAL ) + return d; + else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94 ) + return d + 33; + else if ( XCHARSET_CONVERSION (charset) == CONVERSION_96 ) + return d + 32; + else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x60 ) { int row = d / 94; int cell = d % 94 + 33; @@ -1115,6 +1167,35 @@ charset_code_point (Lisp_Object charset, Emchar ch) row += 18 + 32; return (row << 8) | cell; } + else if ( XCHARSET_CONVERSION (charset) == CONVERSION_BIG5_1 ) + { + int B1 = d >> 8, B2 = d & 0xFF; + unsigned int I + = (B1 - 0xA1) * BIG5_SAME_ROW + B2 + - (B2 < 0x7F ? 0x40 : 0x62); + + if (B1 < 0xC9) + { + return ((I / 94 + 33) << 8) | (I % 94 + 33); + } + } + else if ( XCHARSET_CONVERSION (charset) == CONVERSION_BIG5_2 ) + { + int B1 = d >> 8, B2 = d & 0xFF; + unsigned int I + = (B1 - 0xA1) * BIG5_SAME_ROW + B2 + - (B2 < 0x7F ? 0x40 : 0x62); + + if (B1 >= 0xC9) + { + I -= (BIG5_SAME_ROW) * (0xC9 - 0xA1); + return ((I / 94 + 33) << 8) | (I % 94 + 33); + } + } + else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x94 ) + return ((d / 94 + 33) << 8) | (d % 94 + 33); + else if ( XCHARSET_CONVERSION (charset) == CONVERSION_96x96 ) + return ((d / 96 + 32) << 8) | (d % 96 + 32); else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x94x60 ) { int plane = d / (94 * 60) + 33; @@ -1127,44 +1208,34 @@ charset_code_point (Lisp_Object charset, Emchar ch) row += 18 + 32; return (plane << 16) | (row << 8) | cell; } - else if (XCHARSET_CHARS (charset) == 94) - { - if (XCHARSET_DIMENSION (charset) == 1) - return d + 33; - else if (XCHARSET_DIMENSION (charset) == 2) - return ((d / 94 + 33) << 8) | (d % 94 + 33); - else if (XCHARSET_DIMENSION (charset) == 3) - return - ( (d / (94 * 94) + 33) << 16) - | ((d / 94 % 94 + 33) << 8) - | (d % 94 + 33); - else /* if (XCHARSET_DIMENSION (charset) == 4) */ - return - ( (d / (94 * 94 * 94) + 33) << 24) - | ((d / (94 * 94) % 94 + 33) << 16) - | ((d / 94 % 94 + 33) << 8) - | (d % 94 + 33); - } - else if (XCHARSET_CHARS (charset) == 96) + else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x94x94 ) + return + ( (d / (94 * 94) + 33) << 16) + | ((d / 94 % 94 + 33) << 8) + | (d % 94 + 33); + else if ( XCHARSET_CONVERSION (charset) == CONVERSION_96x96x96 ) + return + ( (d / (96 * 96) + 32) << 16) + | ((d / 96 % 96 + 32) << 8) + | (d % 96 + 32); + else if ( XCHARSET_CONVERSION (charset) == CONVERSION_94x94x94x94 ) + return + ( (d / (94 * 94 * 94) + 33) << 24) + | ((d / (94 * 94) % 94 + 33) << 16) + | ((d / 94 % 94 + 33) << 8) + | (d % 94 + 33); + else if ( XCHARSET_CONVERSION (charset) == CONVERSION_96x96x96x96 ) + return + ( (d / (96 * 96 * 96) + 32) << 24) + | ((d / (96 * 96) % 96 + 32) << 16) + | ((d / 96 % 96 + 32) << 8) + | (d % 96 + 32); + else { - if (XCHARSET_DIMENSION (charset) == 1) - return d + 32; - else if (XCHARSET_DIMENSION (charset) == 2) - return ((d / 96 + 32) << 8) | (d % 96 + 32); - else if (XCHARSET_DIMENSION (charset) == 3) - return - ( (d / (96 * 96) + 32) << 16) - | ((d / 96 % 96 + 32) << 8) - | (d % 96 + 32); - else /* if (XCHARSET_DIMENSION (charset) == 4) */ - return - ( (d / (96 * 96 * 96) + 32) << 24) - | ((d / (96 * 96) % 96 + 32) << 16) - | ((d / 96 % 96 + 32) << 8) - | (d % 96 + 32); + printf ("Unknown CCS-conversion %d is specified!", + XCHARSET_CONVERSION (charset)); + exit (-1); } - else - return code - XCHARSET_CODE_OFFSET (charset); } else if ( (XCHARSET_CODE_OFFSET (charset) == 0) || (XCHARSET_CODE_OFFSET (charset) @@ -1499,7 +1570,7 @@ character set. Recognized properties are: 'code-offset [UTF-2000 only] Offset for a code-point of a base coded-charset. 'conversion [UTF-2000 only] Conversion for a code-point of a base - coded-charset (94x60 or 94x94x60). + coded-charset (94x60, 94x94x60, big5-1 or big5-2). */ (name, doc_string, props)) { @@ -1639,6 +1710,10 @@ character set. Recognized properties are: conversion = CONVERSION_94x60; else if (EQ (value, Q94x94x60)) conversion = CONVERSION_94x94x60; + else if (EQ (value, Qbig5_1)) + conversion = CONVERSION_BIG5_1; + else if (EQ (value, Qbig5_2)) + conversion = CONVERSION_BIG5_2; else signal_simple_error ("Unrecognized conversion", value); } @@ -2610,6 +2685,8 @@ syms_of_mule_charset (void) defsymbol (&Qconversion, "conversion"); defsymbol (&Q94x60, "94x60"); defsymbol (&Q94x94x60, "94x94x60"); + defsymbol (&Qbig5_1, "big5-1"); + defsymbol (&Qbig5_2, "big5-2"); #endif defsymbol (&Ql2r, "l2r"); @@ -2803,15 +2880,15 @@ complex_vars_of_mule_charset (void) build_string ("UCS for CNS 11643"), build_string ("ISO/IEC 10646 for CNS 11643"), build_string (""), - Qnil, 0, 0, 0, 0, - Qnil, CONVERSION_IDENTICAL); + Qnil, 0, 0, 0, 0, Vcharset_ucs, CONVERSION_IDENTICAL); staticpro (&Vcharset_ucs_jis); Vcharset_ucs_jis = make_charset (LEADING_BYTE_UCS_JIS, Qucs_jis, 256, 3, 2, 2, 0, CHARSET_LEFT_TO_RIGHT, build_string ("UCS for JIS"), build_string ("UCS for JIS X 0208, 0212 and 0213"), - build_string ("ISO/IEC 10646 for JIS X 0208, 0212 and 0213"), + build_string + ("ISO/IEC 10646 for JIS X 0208, 0212 and 0213"), build_string (""), Qnil, 0, 0, 0, 0, Vcharset_ucs, CONVERSION_IDENTICAL); staticpro (&Vcharset_ucs_ks); @@ -2822,7 +2899,7 @@ complex_vars_of_mule_charset (void) build_string ("UCS for CCS defined by KS"), build_string ("ISO/IEC 10646 for Korean Standards"), build_string (""), - Qnil, 0, 0, 0, 0, Qnil, CONVERSION_IDENTICAL); + Qnil, 0, 0, 0, 0, Vcharset_ucs, CONVERSION_IDENTICAL); staticpro (&Vcharset_ucs_big5); Vcharset_ucs_big5 = make_charset (LEADING_BYTE_UCS_BIG5, Qucs_big5, 256, 3, @@ -2831,7 +2908,7 @@ complex_vars_of_mule_charset (void) build_string ("UCS for Big5"), build_string ("ISO/IEC 10646 for Big5"), build_string (""), - Qnil, 0, 0, 0, 0, Qnil, CONVERSION_IDENTICAL); + Qnil, 0, 0, 0, 0, Vcharset_ucs, CONVERSION_IDENTICAL); #else # define MIN_CHAR_THAI 0 # define MAX_CHAR_THAI 0 @@ -2903,7 +2980,7 @@ complex_vars_of_mule_charset (void) build_string ("TIS620.2529 (Thai)"), build_string ("tis620"), Qnil, MIN_CHAR_THAI, MAX_CHAR_THAI, - MIN_CHAR_THAI, 32, Qnil, CONVERSION_IDENTICAL); + MIN_CHAR_THAI, 32, Qnil, CONVERSION_96); staticpro (&Vcharset_greek_iso8859_7); Vcharset_greek_iso8859_7 = make_charset (LEADING_BYTE_GREEK_ISO8859_7, Qgreek_iso8859_7, 96, 1, @@ -3021,7 +3098,7 @@ complex_vars_of_mule_charset (void) Qnil, MIN_CHAR_JIS_X0208_1990, MAX_CHAR_JIS_X0208_1990, MIN_CHAR_JIS_X0208_1990, 33, - Qnil, CONVERSION_IDENTICAL); + Qnil, CONVERSION_94x94); #endif staticpro (&Vcharset_korean_ksc5601); Vcharset_korean_ksc5601 = @@ -3242,7 +3319,8 @@ complex_vars_of_mule_charset (void) build_string ("Big5 Level-1 Chinese traditional"), build_string ("big5"), - Qnil, 0, 0, 0, 33, Qnil, CONVERSION_IDENTICAL); + Qnil, 0, 0, 0, 33, /* Qnil, CONVERSION_IDENTICAL */ + Vcharset_chinese_big5, CONVERSION_BIG5_1); staticpro (&Vcharset_chinese_big5_2); Vcharset_chinese_big5_2 = make_charset (LEADING_BYTE_CHINESE_BIG5_2, Qchinese_big5_2, 94, 2, @@ -3252,7 +3330,8 @@ complex_vars_of_mule_charset (void) build_string ("Big5 Level-2 Chinese traditional"), build_string ("big5"), - Qnil, 0, 0, 0, 33, Qnil, CONVERSION_IDENTICAL); + Qnil, 0, 0, 0, 33, /* Qnil, CONVERSION_IDENTICAL */ + Vcharset_chinese_big5, CONVERSION_BIG5_2); #ifdef ENABLE_COMPOSITE_CHARS /* #### For simplicity, we put composite chars into a 96x96 charset.