+ if (NILP (encoding_table = XCHARSET_ENCODING_TABLE (ccs)))
+ {
+ XCHARSET_ENCODING_TABLE (ccs)
+ = encoding_table = make_char_id_table (Qnil, -1);
+ }
+ put_char_id_table (XCHAR (character), value, encoding_table);
+ return Qt;
+}
+
+Lisp_Object
+remove_char_ccs (Lisp_Object character, Lisp_Object ccs)
+{
+ Lisp_Object decoding_table = XCHARSET_DECODING_TABLE (ccs);
+ Lisp_Object encoding_table = XCHARSET_ENCODING_TABLE (ccs);
+
+ if (VECTORP (decoding_table))
+ {
+ Lisp_Object cpos = Fget_char_attribute (character, ccs);
+
+ if (!NILP (cpos))
+ {
+ decoding_table_remove_char (decoding_table,
+ XCHARSET_DIMENSION (ccs),
+ XCHARSET_BYTE_OFFSET (ccs),
+ XINT (cpos));
+ }
+ }
+ if (CHAR_ID_TABLE_P (encoding_table))
+ {
+ put_char_id_table (XCHAR (character), Qnil, encoding_table);
+ }
+ return Qt;
+}
+
+Lisp_Object
+put_char_attribute (Lisp_Object character, Lisp_Object attribute,
+ Lisp_Object value)
+{
+ Emchar char_id = XCHAR (character);
+ Lisp_Object ret = get_char_id_table (char_id, Vcharacter_attribute_table);
+ Lisp_Object cell;
+
+ cell = Fassq (attribute, ret);
+
+ if (NILP (cell))
+ {
+ ret = Fcons (Fcons (attribute, value), ret);
+ }
+ else if (!EQ (Fcdr (cell), value))
+ {
+ Fsetcdr (cell, value);
+ }
+ put_char_id_table (char_id, ret, Vcharacter_attribute_table);
+ return ret;
+}
+
+Lisp_Object
+remove_char_attribute (Lisp_Object character, Lisp_Object attribute)
+{
+ Emchar char_id = XCHAR (character);
+ Lisp_Object alist = get_char_id_table (char_id, Vcharacter_attribute_table);
+
+ if (EQ (attribute, Fcar (Fcar (alist))))
+ {
+ alist = Fcdr (alist);
+ }
+ else
+ {
+ Lisp_Object pr = alist;
+ Lisp_Object r = Fcdr (alist);
+
+ while (!NILP (r))
+ {
+ if (EQ (attribute, Fcar (Fcar (r))))
+ {
+ XCDR (pr) = Fcdr (r);
+ break;
+ }
+ pr = r;
+ r = Fcdr (r);
+ }
+ }
+ put_char_id_table (char_id, alist, Vcharacter_attribute_table);
+ return alist;