- if (EQ (charset, Vcharset_ascii))
- return c1;
- else if (EQ (charset, Vcharset_control_1))
- return c1 | 0x80;
- else if (EQ (charset, Vcharset_ucs_bmp))
- return (c1 << 8) | c2;
- else if (EQ (charset, Vcharset_latin_iso8859_1))
- return c1 | 0x80;
- else if (EQ (charset, Vcharset_latin_iso8859_2))
- return latin_iso8859_2_to_ucs[c1 - 32];
- else if (EQ (charset, Vcharset_latin_iso8859_3))
- return latin_iso8859_3_to_ucs[c1 - 32];
- else if (EQ (charset, Vcharset_latin_iso8859_4))
- return latin_iso8859_4_to_ucs[c1 - 32];
- else if (EQ (charset, Vcharset_cyrillic_iso8859_5))
- return c1 + MIN_CHAR_CYRILLIC - 0x20;
- else if (EQ (charset, Vcharset_greek_iso8859_7))
- return c1 + MIN_CHAR_GREEK - 0x20;
- else if (EQ (charset, Vcharset_hebrew_iso8859_8))
- return c1 + MIN_CHAR_HEBREW - 0x20;
- else if (EQ (charset, Vcharset_latin_iso8859_9))
- return latin_iso8859_9_to_ucs[c1 - 32];
- else if (EQ (charset, Vcharset_thai_tis620))
- return c1 + MIN_CHAR_THAI - 0x20;
+ Lisp_Object decoding_table = XCHARSET_DECODING_TABLE (charset);
+ int idx;
+ Lisp_Object ch;
+
+ if (!EQ (decoding_table, Qnil)
+ && (0 <= (idx = c1 - (XCHARSET_CHARS (charset) == 94 ? 33 : 32)))
+ && (idx < XVECTOR_LENGTH (decoding_table))
+ && !EQ (ch = XVECTOR_DATA(decoding_table)[idx], Qnil))
+ return XCHAR (ch);