- 0x00A0 /* 0xA0 NO-BREAK SPACE */,
- 0x0102 /* 0xA1 LATIN CAPITAL LETTER A WITH BREVE */,
- 0x00C2 /* 0xA2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */,
- 0x00CA /* 0xA3 LATIN CAPITAL LETTER E WITH CIRCUMFLEX */,
- 0x00D4 /* 0xA4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */,
- 0x01A0 /* 0xA5 LATIN CAPITAL LETTER O WITH HORN */,
- 0x01AF /* 0xA6 LATIN CAPITAL LETTER U WITH HORN */,
- 0x0110 /* 0xA7 LATIN CAPITAL LETTER D WITH STROKE */,
- 0x0103 /* 0xA8 LATIN SMALL LETTER A WITH BREVE */,
- 0x00E2 /* 0xA9 LATIN SMALL LETTER A WITH CIRCUMFLEX */,
- 0x00EA /* 0xAA LATIN SMALL LETTER E WITH CIRCUMFLEX */,
- 0x00F4 /* 0xAB LATIN SMALL LETTER O WITH CIRCUMFLEX */,
- 0x01A1 /* 0xAC LATIN SMALL LETTER O WITH HORN */,
- 0x01B0 /* 0xAD LATIN SMALL LETTER U WITH HORN */,
- 0x0111 /* 0xAE LATIN SMALL LETTER D WITH STROKE */,
- 0x1EB0 /* 0xAF LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */,
- 0x0300 /* 0xB0 COMBINING GRAVE ACCENT */,
- 0x0309 /* 0xB1 COMBINING HOOK ABOVE */,
- 0x0303 /* 0xB2 COMBINING TILDE */,
- 0x0301 /* 0xB3 COMBINING ACUTE ACCENT */,
- 0x0323 /* 0xB4 COMBINING DOT BELOW */,
- 0x00E0 /* 0xB5 LATIN SMALL LETTER A WITH GRAVE */,
- 0x1EA3 /* 0xB6 LATIN SMALL LETTER A WITH HOOK ABOVE */,
- 0x00E3 /* 0xB7 LATIN SMALL LETTER A WITH TILDE */,
- 0x00E1 /* 0xB8 LATIN SMALL LETTER A WITH ACUTE */,
- 0x1EA1 /* 0xB9 LATIN SMALL LETTER A WITH DOT BELOW */,
- 0x1EB2 /* 0xBA LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */,
- 0x1EB1 /* 0xBB LATIN SMALL LETTER A WITH BREVE AND GRAVE */,
- 0x1EB3 /* 0xBC LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */,
- 0x1EB5 /* 0xBD LATIN SMALL LETTER A WITH BREVE AND TILDE */,
- 0x1EAF /* 0xBE LATIN SMALL LETTER A WITH BREVE AND ACUTE */,
- 0x1EB4 /* 0xBF LATIN CAPITAL LETTER A WITH BREVE AND TILDE */,
- 0x1EAE /* 0xC0 LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */,
- 0x1EA6 /* 0xC1 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */,
- 0x1EA8 /* 0xC2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */,
- 0x1EAA /* 0xC3 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */,
- 0x1EA4 /* 0xC4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */,
- 0x1EC0 /* 0xC5 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */,
- 0x1EB7 /* 0xC6 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */,
- 0x1EA7 /* 0xC7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */,
- 0x1EA9 /* 0xC8 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */,
- 0x1EAB /* 0xC9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */,
- 0x1EA5 /* 0xCA LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */,
- 0x1EAD /* 0xCB LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */,
- 0x00E8 /* 0xCC LATIN SMALL LETTER E WITH GRAVE */,
- 0x1EC2 /* 0xCD LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */,
- 0x1EBB /* 0xCE LATIN SMALL LETTER E WITH HOOK ABOVE */,
- 0x1EBD /* 0xCF LATIN SMALL LETTER E WITH TILDE */,
- 0x00E9 /* 0xD0 LATIN SMALL LETTER E WITH ACUTE */,
- 0x1EB9 /* 0xD1 LATIN SMALL LETTER E WITH DOT BELOW */,
- 0x1EC1 /* 0xD2 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */,
- 0x1EC3 /* 0xD3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */,
- 0x1EC5 /* 0xD4 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */,
- 0x1EBF /* 0xD5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */,
- 0x1EC7 /* 0xD6 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */,
- 0x00EC /* 0xD7 LATIN SMALL LETTER I WITH GRAVE */,
- 0x1EC9 /* 0xD8 LATIN SMALL LETTER I WITH HOOK ABOVE */,
- 0x1EC4 /* 0xD9 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */,
- 0x1EBE /* 0xDA LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */,
- 0x1ED2 /* 0xDB LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */,
- 0x0129 /* 0xDC LATIN SMALL LETTER I WITH TILDE */,
- 0x00ED /* 0xDD LATIN SMALL LETTER I WITH ACUTE */,
- 0x1ECB /* 0xDE LATIN SMALL LETTER I WITH DOT BELOW */,
- 0x00F2 /* 0xDF LATIN SMALL LETTER O WITH GRAVE */,
- 0x1ED4 /* 0xE0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */,
- 0x1ECF /* 0xE1 LATIN SMALL LETTER O WITH HOOK ABOVE */,
- 0x00F5 /* 0xE2 LATIN SMALL LETTER O WITH TILDE */,
- 0x00F3 /* 0xE3 LATIN SMALL LETTER O WITH ACUTE */,
- 0x1ECD /* 0xE4 LATIN SMALL LETTER O WITH DOT BELOW */,
- 0x1ED3 /* 0xE5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */,
- 0x1ED5 /* 0xE6 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */,
- 0x1ED7 /* 0xE7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */,
- 0x1ED1 /* 0xE8 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */,
- 0x1ED9 /* 0xE9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */,
- 0x1EDD /* 0xEA LATIN SMALL LETTER O WITH HORN AND GRAVE */,
- 0x1EDF /* 0xEB LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */,
- 0x1EE1 /* 0xEC LATIN SMALL LETTER O WITH HORN AND TILDE */,
- 0x1EDB /* 0xED LATIN SMALL LETTER O WITH HORN AND ACUTE */,
- 0x1EE3 /* 0xEE LATIN SMALL LETTER O WITH HORN AND DOT BELOW */,
- 0x00F9 /* 0xEF LATIN SMALL LETTER U WITH GRAVE */,
- 0x1ED6 /* 0xF0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */,
- 0x1EE7 /* 0xF1 LATIN SMALL LETTER U WITH HOOK ABOVE */,
- 0x0169 /* 0xF2 LATIN SMALL LETTER U WITH TILDE */,
- 0x00FA /* 0xF3 LATIN SMALL LETTER U WITH ACUTE */,
- 0x1EE5 /* 0xF4 LATIN SMALL LETTER U WITH DOT BELOW */,
- 0x1EEB /* 0xF5 LATIN SMALL LETTER U WITH HORN AND GRAVE */,
- 0x1EED /* 0xF6 LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */,
- 0x1EEF /* 0xF7 LATIN SMALL LETTER U WITH HORN AND TILDE */,
- 0x1EE9 /* 0xF8 LATIN SMALL LETTER U WITH HORN AND ACUTE */,
- 0x1EF1 /* 0xF9 LATIN SMALL LETTER U WITH HORN AND DOT BELOW */,
- 0x1EF3 /* 0xFA LATIN SMALL LETTER Y WITH GRAVE */,
- 0x1EF7 /* 0xFB LATIN SMALL LETTER Y WITH HOOK ABOVE */,
- 0x1EF9 /* 0xFC LATIN SMALL LETTER Y WITH TILDE */,
- 0x00FD /* 0xFD LATIN SMALL LETTER Y WITH ACUTE */,
- 0x1EF5 /* 0xFE LATIN SMALL LETTER Y WITH DOT BELOW */,
- 0x1ED0 /* 0xFF LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */
-};
+ Lisp_Object ccs;
+
+ ccs = Ffind_charset (attribute);
+ if (!NILP (ccs))
+ {
+ Lisp_Object rest;
+ Lisp_Object v = XCHARSET_DECODING_TABLE (ccs);
+ Lisp_Object nv;
+ int i = -1;
+ int ccs_len;
+
+ /* ad-hoc method for `ascii' */
+ if ((XCHARSET_CHARS (ccs) == 94) &&
+ (XCHARSET_BYTE_OFFSET (ccs) != 33))
+ ccs_len = 128 - XCHARSET_BYTE_OFFSET (ccs);
+ else
+ ccs_len = XCHARSET_CHARS (ccs);
+
+ if (!CONSP (value))
+ signal_simple_error ("Invalid value for coded-charset",
+ value);
+
+ attribute = ccs;
+ rest = Fget_char_attribute (character, attribute);
+ if (VECTORP (v))
+ {
+ if (!NILP (rest))
+ {
+ while (!NILP (rest))
+ {
+ Lisp_Object ei = Fcar (rest);
+
+ i = XINT (ei) - XCHARSET_BYTE_OFFSET (ccs);
+ nv = XVECTOR_DATA(v)[i];
+ if (!VECTORP (nv))
+ break;
+ v = nv;
+ rest = Fcdr (rest);
+ }
+ if (i >= 0)
+ XVECTOR_DATA(v)[i] = Qnil;
+ v = XCHARSET_DECODING_TABLE (ccs);
+ }
+ }
+ else
+ {
+ XCHARSET_DECODING_TABLE (ccs) = v = make_vector (ccs_len, Qnil);
+ }
+
+ rest = value;
+ i = -1;
+ while (CONSP (rest))
+ {
+ Lisp_Object ei = Fcar (rest);
+
+ if (!INTP (ei))
+ signal_simple_error ("Invalid value for coded-charset",
+ value);
+ i = XINT (ei) - XCHARSET_BYTE_OFFSET (ccs);
+ nv = XVECTOR_DATA(v)[i];
+ rest = Fcdr (rest);
+ if (CONSP (rest))
+ {
+ if (!VECTORP (nv))
+ {
+ nv = (XVECTOR_DATA(v)[i] = make_vector (ccs_len, Qnil));
+ }
+ v = nv;
+ }
+ else
+ break;
+ }
+ XVECTOR_DATA(v)[i] = character;
+ }
+ return put_char_attribute (character, attribute, value);
+}
+
+Lisp_Object Qucs;
+
+DEFUN ("define-char", Fdefine_char, 1, 1, 0, /*
+Store character's ATTRIBUTES.
+*/
+ (attributes))
+{
+ Lisp_Object rest = attributes;
+ Lisp_Object code = Fcdr (Fassq (Qucs, attributes));
+ Lisp_Object character;
+
+ if (NILP (code))
+ {
+ while (CONSP (rest))
+ {
+ Lisp_Object cell = Fcar (rest);
+ Lisp_Object ccs;
+
+ if (!LISTP (cell))
+ signal_simple_error ("Invalid argument", attributes);
+ if (!NILP (ccs = Ffind_charset (Fcar (cell)))
+ && XCHARSET_FINAL (ccs))
+ {
+ Emchar code;
+
+ if (XCHARSET_DIMENSION (ccs) == 1)
+ {
+ Lisp_Object eb1 = Fcar (Fcdr (cell));
+ int b1;
+
+ if (!INTP (eb1))
+ signal_simple_error ("Invalid argument", attributes);
+ b1 = XINT (eb1);
+ switch (XCHARSET_CHARS (ccs))
+ {
+ case 94:
+ code = MIN_CHAR_94
+ + (XCHARSET_FINAL (ccs) - '0') * 94 + (b1 - 33);
+ break;
+ case 96:
+ code = MIN_CHAR_96
+ + (XCHARSET_FINAL (ccs) - '0') * 96 + (b1 - 32);
+ break;
+ default:
+ abort ();
+ }
+ }
+ else if (XCHARSET_DIMENSION (ccs) == 2)
+ {
+ Lisp_Object eb1 = Fcar (Fcdr (cell));
+ Lisp_Object eb2 = Fcar (Fcdr (Fcdr (cell)));
+ int b1, b2;
+
+ if (!INTP (eb1))
+ signal_simple_error ("Invalid argument", attributes);
+ b1 = XINT (eb1);
+ if (!INTP (eb2))
+ signal_simple_error ("Invalid argument", attributes);
+ b2 = XINT (eb2);
+ switch (XCHARSET_CHARS (ccs))
+ {
+ case 94:
+ code = MIN_CHAR_94x94
+ + (XCHARSET_FINAL (ccs) - '0') * 94 * 94
+ + (b1 - 33) * 94 + (b2 - 33);
+ break;
+ case 96:
+ code = MIN_CHAR_96x96
+ + (XCHARSET_FINAL (ccs) - '0') * 96 * 96
+ + (b1 - 32) * 96 + (b2 - 32);
+ break;
+ default:
+ abort ();
+ }
+ }
+ else
+ {
+ rest = Fcdr (rest);
+ continue;
+ }
+ character = make_char (code);
+ goto setup_attributes;
+ }
+ rest = Fcdr (rest);
+ }
+ return Qnil;
+ }
+ else if (!INTP (code))
+ signal_simple_error ("Invalid argument", attributes);
+ else
+ character = make_char (XINT (code));
+
+ setup_attributes:
+ rest = attributes;
+ while (CONSP (rest))
+ {
+ Lisp_Object cell = Fcar (rest);
+
+ if (!LISTP (cell))
+ signal_simple_error ("Invalid argument", attributes);
+ Fput_char_attribute (character, Fcar (cell), Fcdr (cell));
+ rest = Fcdr (rest);
+ }
+ return
+ get_char_code_table (XCHAR (character), Vcharacter_attribute_table);
+}