+#ifdef UTF2000
+DEFUN ("charset-mapping-table", Fcharset_mapping_table, 1, 1, 0, /*
+Return mapping-table of CHARSET.
+*/
+ (charset))
+{
+ return XCHARSET_DECODING_TABLE (Fget_charset (charset));
+}
+
+DEFUN ("set-charset-mapping-table", Fset_charset_mapping_table, 2, 2, 0, /*
+Set mapping-table of CHARSET to TABLE.
+*/
+ (charset, table))
+{
+ struct Lisp_Charset *cs;
+ Emchar_to_byte_table* old_byte1_table;
+ Emchar_to_byte_table* old_byte2_table;
+
+ charset = Fget_charset (charset);
+ CHECK_VECTOR (table);
+
+ cs = XCHARSET (charset);
+ CHARSET_DECODING_TABLE(cs) = table;
+ old_byte1_table = CHARSET_TO_BYTE1_TABLE(cs);
+ old_byte2_table = CHARSET_TO_BYTE2_TABLE(cs);
+ switch (CHARSET_TYPE (cs))
+ {
+ case CHARSET_TYPE_94:
+ if (!EQ (table, Qnil))
+ {
+ size_t i;
+ CHARSET_TO_BYTE1_TABLE(cs) = make_byte_from_character_table();
+ for (i = 0; i < 94; i++)
+ {
+ Lisp_Object c = XVECTOR_DATA(table)[i];
+
+ if (!EQ (c, Qnil))
+ put_byte_from_character_table (XCHAR (c), i + 33,
+ CHARSET_TO_BYTE1_TABLE(cs));
+ }
+ }
+ else
+ CHARSET_TO_BYTE1_TABLE(cs) = NULL;
+ CHARSET_TO_BYTE2_TABLE(cs) = NULL;
+ break;
+ case CHARSET_TYPE_96:
+ if (!EQ (table, Qnil))
+ {
+ size_t i;
+ CHARSET_TO_BYTE1_TABLE(cs) = make_byte_from_character_table();
+ for (i = 0; i < 96; i++)
+ {
+ Lisp_Object c = XVECTOR_DATA(table)[i];
+
+ if (!EQ (c, Qnil))
+ put_byte_from_character_table (XCHAR (c), i + 32,
+ CHARSET_TO_BYTE1_TABLE(cs));
+ }
+ }
+ else
+ CHARSET_TO_BYTE1_TABLE(cs) = NULL;
+ CHARSET_TO_BYTE2_TABLE(cs) = NULL;
+ break;
+ case CHARSET_TYPE_94X94:
+ if (!EQ (table, Qnil))
+ {
+ size_t i;
+
+ CHARSET_TO_BYTE1_TABLE(cs) = make_byte_from_character_table();
+ CHARSET_TO_BYTE2_TABLE(cs) = make_byte_from_character_table();
+ for (i = 0; i < XVECTOR_LENGTH (table); i++)
+ {
+ Lisp_Object v = XVECTOR_DATA(table)[i];
+
+ if (VECTORP (v))
+ {
+ size_t j;
+
+ for (j = 0; j < XVECTOR_LENGTH (v); j++)
+ {
+ Lisp_Object c = XVECTOR_DATA(v)[j];
+
+ if (!EQ (c, Qnil))
+ {
+ put_byte_from_character_table
+ (XCHAR (c), i + 33, CHARSET_TO_BYTE1_TABLE(cs));
+ put_byte_from_character_table
+ (XCHAR (c), j + 33, CHARSET_TO_BYTE2_TABLE(cs));
+ }
+ }
+ }
+ else if (CHARP (v))
+ put_byte_from_character_table
+ (XCHAR (v), i + 33, CHARSET_TO_BYTE1_TABLE(cs));
+ }
+ }
+ else
+ {
+ CHARSET_TO_BYTE1_TABLE(cs) = NULL;
+ CHARSET_TO_BYTE2_TABLE(cs) = NULL;
+ }
+ break;
+ case CHARSET_TYPE_96X96:
+ CHARSET_TO_BYTE1_TABLE(cs) = NULL;
+ CHARSET_TO_BYTE2_TABLE(cs) = NULL;
+ break;
+ case CHARSET_TYPE_128X128:
+ CHARSET_DIMENSION (cs) = 2;
+ CHARSET_CHARS (cs) = 128;
+ CHARSET_TO_BYTE1_TABLE(cs) = NULL;
+ CHARSET_TO_BYTE2_TABLE(cs) = NULL;
+ break;
+ case CHARSET_TYPE_256X256:
+ CHARSET_DIMENSION (cs) = 2;
+ CHARSET_CHARS (cs) = 256;
+ CHARSET_TO_BYTE1_TABLE(cs) = NULL;
+ CHARSET_TO_BYTE2_TABLE(cs) = NULL;
+ break;
+ }
+ if (old_byte1_table != NULL)
+ destroy_byte_from_character_table (old_byte1_table);
+ if (old_byte2_table != NULL)
+ destroy_byte_from_character_table (old_byte2_table);
+ return table;
+}
+#endif
+