# HG changeset patch # User Kenichi Handa # Date 858727894 0 # Node ID 47bfc66eb7f16e638bb3cc8be3c84368ab72bc3e # Parent 156896ccc86e3de1c2f9dcd53bd7256aad6c90ad (map_char_table): Handle multibyte characters. diff -r 156896ccc86e -r 47bfc66eb7f1 src/fns.c --- 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); + } + } } }