-#ifdef UTF2000
-/* Number of Big5 characters which have the same code in 1st byte. */
-
-#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)
-{
- int dim = XCHARSET_DIMENSION (ccs);
- Lisp_Object decoding_table = XCHARSET_DECODING_TABLE (ccs);
- Emchar char_id = -1;
- Lisp_Object mother;
-
- while (dim > 0)
- {
- dim--;
- decoding_table
- = get_ccs_octet_table (decoding_table, ccs,
- (code_point >> (dim * 8)) & 255);
- }
- if (CHARP (decoding_table))
- return XCHAR (decoding_table);
-#ifdef HAVE_CHISE
- if (EQ (decoding_table, Qunloaded))
- {
- char_id = load_char_decoding_entry_maybe (ccs, code_point);
- }
-#endif /* HAVE_CHISE */
- if (char_id >= 0)
- return char_id;
- else if ( !without_inheritance
- && CHARSETP (mother = XCHARSET_MOTHER (ccs)) )
- {
- 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, without_inheritance);
- else
- return decode_defined_char (mother, code,
- without_inheritance);
- }
- }
- return -1;
-}
-
-Emchar
-decode_builtin_char (Lisp_Object charset, int code_point)
-{
- Lisp_Object mother = XCHARSET_MOTHER (charset);
- int final;
-
- if ( XCHARSET_MAX_CODE (charset) > 0 )
- {
- if ( CHARSETP (mother) )
- {
- int code
- = decode_ccs_conversion (XCHARSET_CONVERSION (charset),
- code_point);
-
- if (code >= 0)
- return
- decode_builtin_char (mother,
- code + XCHARSET_CODE_OFFSET(charset));
- else
- return -1;
- }
- else
- {
- Emchar cid
- = (XCHARSET_DIMENSION (charset) == 1
- ?
- code_point - XCHARSET_BYTE_OFFSET (charset)
- :
- ((code_point >> 8) - XCHARSET_BYTE_OFFSET (charset))
- * XCHARSET_CHARS (charset)
- + (code_point & 0xFF) - XCHARSET_BYTE_OFFSET (charset))
- + XCHARSET_CODE_OFFSET (charset);
- if ((cid < XCHARSET_MIN_CODE (charset))
- || (XCHARSET_MAX_CODE (charset) < cid))
- return -1;
- return cid;
- }
- }
- else if ((final = XCHARSET_FINAL (charset)) >= '0')
- {
- if (XCHARSET_DIMENSION (charset) == 1)
- {
- switch (XCHARSET_CHARS (charset))
- {
- case 94:
- return MIN_CHAR_94
- + (final - '0') * 94 + ((code_point & 0x7F) - 33);
- case 96:
- return MIN_CHAR_96
- + (final - '0') * 96 + ((code_point & 0x7F) - 32);
- default:
- abort ();
- return -1;
- }
- }
- else
- {
- switch (XCHARSET_CHARS (charset))
- {
- case 94:
- return MIN_CHAR_94x94
- + (final - '0') * 94 * 94
- + (((code_point >> 8) & 0x7F) - 33) * 94
- + ((code_point & 0x7F) - 33);
- case 96:
- return MIN_CHAR_96x96
- + (final - '0') * 96 * 96
- + (((code_point >> 8) & 0x7F) - 32) * 96
- + ((code_point & 0x7F) - 32);
- default:
- abort ();
- return -1;
- }
- }
- }
- else
- return -1;
-}
-
-int
-charset_code_point (Lisp_Object charset, Emchar ch, int defined_only)
-{
- Lisp_Object encoding_table = XCHARSET_ENCODING_TABLE (charset);
- Lisp_Object ret;
-
- if ( CHAR_TABLEP (encoding_table)
- && INTP (ret = get_char_id_table (XCHAR_TABLE(encoding_table),
- ch)) )
- return XINT (ret);
- else
- {
- Lisp_Object mother = XCHARSET_MOTHER (charset);
- int min = XCHARSET_MIN_CODE (charset);
- int max = XCHARSET_MAX_CODE (charset);
- int code = -1;
-
- if ( CHARSETP (mother) )
- {
- if (XCHARSET_FINAL (charset) >= '0')
- code = charset_code_point (mother, ch, 1);
- else
- code = charset_code_point (mother, ch, defined_only);
- }
- else if (defined_only)
- return -1;
- else if ( ((max == 0) && CHARSETP (mother)
- && (XCHARSET_FINAL (charset) == 0))
- || ((min <= ch) && (ch <= max)) )
- code = ch;
- if ( ((max == 0) && CHARSETP (mother) && (code >= 0))
- || ((min <= code) && (code <= max)) )
- {
- int d = code - XCHARSET_CODE_OFFSET (charset);
-
- 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;
-
- if (row < 30)
- row += 16 + 32;
- else
- 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;
- int row = (d % (94 * 60)) / 94;
- int cell = d % 94 + 33;
-
- if (row < 30)
- row += 16 + 32;
- else
- row += 18 + 32;
- return (plane << 16) | (row << 8) | cell;
- }
- 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
- {
- printf ("Unknown CCS-conversion %d is specified!",
- XCHARSET_CONVERSION (charset));
- exit (-1);
- }
- }
- else if (defined_only)
- return -1;
- else if ( ( XCHARSET_FINAL (charset) >= '0' ) &&
- ( XCHARSET_MIN_CODE (charset) == 0 )
- /*
- (XCHARSET_CODE_OFFSET (charset) == 0) ||
- (XCHARSET_CODE_OFFSET (charset)
- == XCHARSET_MIN_CODE (charset))
- */ )
- {
- int d;
-
- if (XCHARSET_DIMENSION (charset) == 1)
- {
- if (XCHARSET_CHARS (charset) == 94)
- {
- if (((d = ch - (MIN_CHAR_94
- + (XCHARSET_FINAL (charset) - '0') * 94))
- >= 0)
- && (d < 94))
- return d + 33;
- }
- else if (XCHARSET_CHARS (charset) == 96)
- {
- if (((d = ch - (MIN_CHAR_96
- + (XCHARSET_FINAL (charset) - '0') * 96))
- >= 0)
- && (d < 96))
- return d + 32;
- }
- else
- return -1;
- }
- else if (XCHARSET_DIMENSION (charset) == 2)
- {
- if (XCHARSET_CHARS (charset) == 94)
- {
- if (((d = ch - (MIN_CHAR_94x94
- +
- (XCHARSET_FINAL (charset) - '0') * 94 * 94))
- >= 0)
- && (d < 94 * 94))
- return (((d / 94) + 33) << 8) | (d % 94 + 33);
- }
- else if (XCHARSET_CHARS (charset) == 96)
- {
- if (((d = ch - (MIN_CHAR_96x96
- +
- (XCHARSET_FINAL (charset) - '0') * 96 * 96))
- >= 0)
- && (d < 96 * 96))
- return (((d / 96) + 32) << 8) | (d % 96 + 32);
- }
- else
- return -1;
- }
- }
- }
- return -1;
-}
-
-int
-encode_builtin_char_1 (Emchar c, Lisp_Object* charset)
-{
- if (c <= MAX_CHAR_BASIC_LATIN)
- {
- *charset = Vcharset_ascii;
- return c;
- }
- else if (c < 0xA0)
- {
- *charset = Vcharset_control_1;
- return c & 0x7F;
- }
- else if (c <= 0xff)
- {
- *charset = Vcharset_latin_iso8859_1;
- return c & 0x7F;
- }
- /*
- else if ((MIN_CHAR_HEBREW <= c) && (c <= MAX_CHAR_HEBREW))
- {
- *charset = Vcharset_hebrew_iso8859_8;
- return c - MIN_CHAR_HEBREW + 0x20;
- }
- */
- else if ((MIN_CHAR_THAI <= c) && (c <= MAX_CHAR_THAI))
- {
- *charset = Vcharset_thai_tis620;
- return c - MIN_CHAR_THAI + 0x20;
- }
- /*
- else if ((MIN_CHAR_HALFWIDTH_KATAKANA <= c)
- && (c <= MAX_CHAR_HALFWIDTH_KATAKANA))
- {
- return list2 (Vcharset_katakana_jisx0201,
- make_int (c - MIN_CHAR_HALFWIDTH_KATAKANA + 33));
- }
- */
- else if (c <= MAX_CHAR_BMP)
- {
- *charset = Vcharset_ucs_bmp;
- return c;
- }
- else if (c <= MAX_CHAR_SMP)
- {
- *charset = Vcharset_ucs_smp;
- return c - MIN_CHAR_SMP;
- }
- else if (c <= MAX_CHAR_SIP)
- {
- *charset = Vcharset_ucs_sip;
- return c - MIN_CHAR_SIP;
- }
- else if (c < MIN_CHAR_94)
- {
- *charset = Vcharset_ucs;
- return c;
- }
- else if (c <= MAX_CHAR_94)
- {
- *charset = CHARSET_BY_ATTRIBUTES (94, 1,
- ((c - MIN_CHAR_94) / 94) + '0',
- CHARSET_LEFT_TO_RIGHT);
- if (!NILP (*charset))
- return ((c - MIN_CHAR_94) % 94) + 33;
- else
- {
- *charset = Vcharset_ucs;
- return c;
- }
- }
- else if (c <= MAX_CHAR_96)
- {
- *charset = CHARSET_BY_ATTRIBUTES (96, 1,
- ((c - MIN_CHAR_96) / 96) + '0',
- CHARSET_LEFT_TO_RIGHT);
- if (!NILP (*charset))
- return ((c - MIN_CHAR_96) % 96) + 32;
- else
- {
- *charset = Vcharset_ucs;
- return c;
- }
- }
- else if (c <= MAX_CHAR_94x94)
- {
- *charset
- = CHARSET_BY_ATTRIBUTES (94, 2,
- ((c - MIN_CHAR_94x94) / (94 * 94)) + '0',
- CHARSET_LEFT_TO_RIGHT);
- if (!NILP (*charset))
- return (((((c - MIN_CHAR_94x94) / 94) % 94) + 33) << 8)
- | (((c - MIN_CHAR_94x94) % 94) + 33);
- else
- {
- *charset = Vcharset_ucs;
- return c;
- }
- }
- else if (c <= MAX_CHAR_96x96)
- {
- *charset
- = CHARSET_BY_ATTRIBUTES (96, 2,
- ((c - MIN_CHAR_96x96) / (96 * 96)) + '0',
- CHARSET_LEFT_TO_RIGHT);
- if (!NILP (*charset))
- return ((((c - MIN_CHAR_96x96) / 96) % 96) + 32) << 8
- | (((c - MIN_CHAR_96x96) % 96) + 32);
- else
- {
- *charset = Vcharset_ucs;
- return c;
- }
- }
- else
- {
- *charset = Vcharset_ucs;
- return c;
- }
-}
-
-Lisp_Object Vdefault_coded_charset_priority_list;
-#endif
-