Mercurial > emacs
changeset 89655:c7f2621e0e2d
(store_in_keymap): Pay attention to the case that idx is a cons
specifying a character range.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Mon, 24 Nov 2003 02:46:11 +0000 |
parents | ff924f846acc |
children | 4e8e27a50801 |
files | src/keymap.c |
diffstat | 1 files changed, 41 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/keymap.c Mon Nov 24 02:22:09 2003 +0000 +++ b/src/keymap.c Mon Nov 24 02:46:11 2003 +0000 @@ -870,6 +870,19 @@ ASET (elt, XFASTINT (idx), def); return def; } + else if (CONSP (idx) && CHARACTERP (XCAR (idx))) + { + int from = XFASTINT (XCAR (idx)); + int to = XFASTINT (XCDR (idx)); + + if (to >= ASIZE (elt)) + to = ASIZE (elt) - 1; + for (; from <= to; from++) + ASET (elt, from, def); + if (to == XFASTINT (XCDR (idx))) + /* We have defined all keys in IDX. */ + return def; + } insertion_point = tail; } else if (CHAR_TABLE_P (elt)) @@ -900,6 +913,19 @@ XSETCDR (elt, def); return def; } + else if (CONSP (idx) && CHARACTERP (XCAR (idx))) + { + int from = XFASTINT (XCAR (idx)); + int to = XFASTINT (XCDR (idx)); + + if (from <= XFASTINT (XCAR (elt)) + && to >= XFASTINT (XCAR (elt))) + { + XSETCDR (elt, def); + if (from == to) + return def; + } + } } else if (EQ (elt, Qkeymap)) /* If we find a 'keymap' symbol in the spine of KEYMAP, @@ -914,8 +940,21 @@ keymap_end: /* We have scanned the entire keymap, and not found a binding for IDX. Let's add one. */ - XSETCDR (insertion_point, - Fcons (Fcons (idx, def), XCDR (insertion_point))); + { + Lisp_Object elt; + + if (CONSP (idx) && CHARACTERP (XCAR (idx))) + { + /* IDX specifies a range of characters, and not all of them + were handled yet, which means this keymap doesn't have a + char-table. So, we insert a char-table now. */ + elt = Fmake_char_table (Qkeymap, Qnil); + Fset_char_table_range (elt, idx, NILP (def) ? Qt : def); + } + else + elt = Fcons (idx, def); + XSETCDR (insertion_point, Fcons (elt, XCDR (insertion_point))); + } } return def;