Mercurial > emacs
diff src/fns.c @ 17182:47bfc66eb7f1
(map_char_table): Handle multibyte characters.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Tue, 18 Mar 1997 23:31:34 +0000 |
parents | 647b28ba4d1b |
children | b66473f0d0fe |
line wrap: on
line diff
--- a/src/fns.c Tue Mar 18 23:31:34 1997 +0000 +++ b/src/fns.c Tue Mar 18 23:31:34 1997 +0000 @@ -28,6 +28,7 @@ #include "lisp.h" #include "commands.h" +#include "charset.h" #include "buffer.h" #include "keyboard.h" @@ -1367,8 +1368,12 @@ int depth; { int i; - int size = CHAR_TABLE_ORDINARY_SLOTS; + int from, to; + if (depth == 0) + from = 0, to = CHAR_TABLE_ORDINARY_SLOTS; + else + from = 32, to = 128; /* Make INDICES longer if we are about to fill it up. */ if ((depth % 10) == 9) { @@ -1378,22 +1383,30 @@ indices = new_indices; } - for (i = 0; i < size; i++) + for (i = from; i < to; i++) { Lisp_Object elt; indices[depth] = i; elt = XCHAR_TABLE (chartable)->contents[i]; if (CHAR_TABLE_P (elt)) - map_char_table (c_function, function, chartable, depth + 1, indices); + map_char_table (c_function, function, elt, depth + 1, indices); else if (c_function) (*c_function) (depth + 1, indices, elt); - /* Here we should handle all cases where the range is a single character - by passing that character as a number. Currently, that is - all the time, but with the MULE code this will have to be changed. */ - else if (depth == 0) + else if (depth == 0 && i < 256) + /* This is an ASCII or 8-bit European character. */ call2 (function, make_number (i), elt); else - call2 (function, Fvector (depth + 1, indices), elt); + { + /* This is an entry for multibyte characters. */ + unsigned int charset = XFASTINT (indices[0]) - 128, c1, c2, c; + if (CHARSET_DEFINED_P (charset)) + { + c1 = depth < 1 ? 0 : XFASTINT (indices[1]); + c2 = depth < 2 ? 0 : XFASTINT (indices[2]); + c = MAKE_NON_ASCII_CHAR (charset, c1, c2); + call2 (function, make_number (c), elt); + } + } } }