Mercurial > emacs
changeset 61686:527b912957bf
(Faref): Handle special slots used as default values of
ascii, eight-bit-control, eight-bit-control. Don't ignore a
default value set for a group of characters.
(Faset): Signal an error if IDXVAL is not a valid character code.
Make a sub-chartable with correct initial value.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Wed, 20 Apr 2005 07:50:30 +0000 |
parents | 832617c86aa7 |
children | fe8e91f043af |
files | src/data.c |
diffstat | 1 files changed, 32 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/data.c Wed Apr 20 07:50:08 2005 +0000 +++ b/src/data.c Wed Apr 20 07:50:30 2005 +0000 @@ -1979,10 +1979,20 @@ args_out_of_range (array, idx); if (idxval < CHAR_TABLE_ORDINARY_SLOTS) { + if (! SINGLE_BYTE_CHAR_P (idxval)) + args_out_of_range (array, idx); /* For ASCII and 8-bit European characters, the element is stored in the top table. */ val = XCHAR_TABLE (array)->contents[idxval]; if (NILP (val)) + { + int default_slot + = (idxval < 0x80 ? CHAR_TABLE_DEFAULT_SLOT_ASCII + : idxval < 0xA0 ? CHAR_TABLE_DEFAULT_SLOT_8_BIT_CONTROL + : CHAR_TABLE_DEFAULT_SLOT_8_BIT_GRAPHIC); + val = XCHAR_TABLE (array)->contents[default_slot]; + } + if (NILP (val)) val = XCHAR_TABLE (array)->defalt; while (NILP (val)) /* Follow parents until we find some value. */ { @@ -1999,6 +2009,7 @@ { int code[4], i; Lisp_Object sub_table; + Lisp_Object current_default; SPLIT_CHAR (idxval, code[0], code[1], code[2]); if (code[1] < 32) code[1] = -1; @@ -2012,16 +2023,21 @@ code[3] = -1; /* anchor */ try_parent_char_table: + current_default = XCHAR_TABLE (array)->defalt; sub_table = array; for (i = 0; code[i] >= 0; i++) { val = XCHAR_TABLE (sub_table)->contents[code[i]]; if (SUB_CHAR_TABLE_P (val)) - sub_table = val; + { + sub_table = val; + if (! NILP (XCHAR_TABLE (sub_table)->defalt)) + current_default = XCHAR_TABLE (sub_table)->defalt; + } else { if (NILP (val)) - val = XCHAR_TABLE (sub_table)->defalt; + val = current_default; if (NILP (val)) { array = XCHAR_TABLE (array)->parent; @@ -2031,9 +2047,12 @@ return val; } } - /* Here, VAL is a sub char table. We try the default value - and parent. */ - val = XCHAR_TABLE (val)->defalt; + /* Reaching here means IDXVAL is a generic character in + which each character or a group has independent value. + Essentially it's nonsense to get a value for such a + generic character, but for backward compatibility, we try + the default value and parent. */ + val = current_default; if (NILP (val)) { array = XCHAR_TABLE (array)->parent; @@ -2102,7 +2121,11 @@ if (idxval < 0) args_out_of_range (array, idx); if (idxval < CHAR_TABLE_ORDINARY_SLOTS) - XCHAR_TABLE (array)->contents[idxval] = newelt; + { + if (! SINGLE_BYTE_CHAR_P (idxval)) + args_out_of_range (array, idx); + XCHAR_TABLE (array)->contents[idxval] = newelt; + } else { int code[4], i; @@ -2125,12 +2148,9 @@ Lisp_Object temp; /* VAL is a leaf. Create a sub char table with the - default value VAL or XCHAR_TABLE (array)->defalt - and look into it. */ - - temp = make_sub_char_table (NILP (val) - ? XCHAR_TABLE (array)->defalt - : val); + initial value VAL and look into it. */ + + temp = make_sub_char_table (val); XCHAR_TABLE (array)->contents[code[i]] = temp; array = temp; }