Mercurial > emacs
annotate src/chartab.c @ 97095:61de98ebc619
** mairix.el is an interface to mairix, a free tool for indexing and
searching locally stored mail. It allows you to query mairix and
display the search results with Rmail, Gnus and VM. Note that there
is an existing Gnus back end, nnmairix.el, which should be used with
Maildir/MH setups.
author | Chong Yidong <cyd@stupidchicken.com> |
---|---|
date | Tue, 29 Jul 2008 17:44:00 +0000 |
parents | 04a952ac356f |
children | a4677d55715f |
rev | line source |
---|---|
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1 /* chartab.c -- char-table support |
91445
3c0b142634da
Update copyright years and FSF address.
Glenn Morris <rgm@gnu.org>
parents:
91046
diff
changeset
|
2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
3 National Institute of Advanced Industrial Science and Technology (AIST) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
4 Registration Number H13PRO009 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
5 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
6 This file is part of GNU Emacs. |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
7 |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94589
diff
changeset
|
8 GNU Emacs is free software: you can redistribute it and/or modify |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
9 it under the terms of the GNU General Public License as published by |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94589
diff
changeset
|
10 the Free Software Foundation, either version 3 of the License, or |
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94589
diff
changeset
|
11 (at your option) any later version. |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
12 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
13 GNU Emacs is distributed in the hope that it will be useful, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
14 but WITHOUT ANY WARRANTY; without even the implied warranty of |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
16 GNU General Public License for more details. |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
17 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
18 You should have received a copy of the GNU General Public License |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94589
diff
changeset
|
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
20 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
21 #include <config.h> |
88858
889b48cce7a1
Include "...h", not <...h> in some cases.
Dave Love <fx@gnu.org>
parents:
88822
diff
changeset
|
22 #include "lisp.h" |
889b48cce7a1
Include "...h", not <...h> in some cases.
Dave Love <fx@gnu.org>
parents:
88822
diff
changeset
|
23 #include "character.h" |
889b48cce7a1
Include "...h", not <...h> in some cases.
Dave Love <fx@gnu.org>
parents:
88822
diff
changeset
|
24 #include "charset.h" |
889b48cce7a1
Include "...h", not <...h> in some cases.
Dave Love <fx@gnu.org>
parents:
88822
diff
changeset
|
25 #include "ccl.h" |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
26 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
27 /* 64/16/32/128 */ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
28 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
29 /* Number of elements in Nth level char-table. */ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
30 const int chartab_size[4] = |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
31 { (1 << CHARTAB_SIZE_BITS_0), |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
32 (1 << CHARTAB_SIZE_BITS_1), |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
33 (1 << CHARTAB_SIZE_BITS_2), |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
34 (1 << CHARTAB_SIZE_BITS_3) }; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
35 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
36 /* Number of characters each element of Nth level char-table |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
37 covers. */ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
38 const int chartab_chars[4] = |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
39 { (1 << (CHARTAB_SIZE_BITS_1 + CHARTAB_SIZE_BITS_2 + CHARTAB_SIZE_BITS_3)), |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
40 (1 << (CHARTAB_SIZE_BITS_2 + CHARTAB_SIZE_BITS_3)), |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
41 (1 << CHARTAB_SIZE_BITS_3), |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
42 1 }; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
43 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
44 /* Number of characters (in bits) each element of Nth level char-table |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
45 covers. */ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
46 const int chartab_bits[4] = |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
47 { (CHARTAB_SIZE_BITS_1 + CHARTAB_SIZE_BITS_2 + CHARTAB_SIZE_BITS_3), |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
48 (CHARTAB_SIZE_BITS_2 + CHARTAB_SIZE_BITS_3), |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
49 CHARTAB_SIZE_BITS_3, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
50 0 }; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
51 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
52 #define CHARTAB_IDX(c, depth, min_char) \ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
53 (((c) - (min_char)) >> chartab_bits[(depth)]) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
54 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
55 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
56 DEFUN ("make-char-table", Fmake_char_table, Smake_char_table, 1, 2, 0, |
88900
d6c50ac00394
(Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents:
88858
diff
changeset
|
57 doc: /* Return a newly created char-table, with purpose PURPOSE. |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
58 Each element is initialized to INIT, which defaults to nil. |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
59 |
88900
d6c50ac00394
(Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents:
88858
diff
changeset
|
60 PURPOSE should be a symbol. If it has a `char-table-extra-slots' |
d6c50ac00394
(Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents:
88858
diff
changeset
|
61 property, the property's value should be an integer between 0 and 10 |
d6c50ac00394
(Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents:
88858
diff
changeset
|
62 that specifies how many extra slots the char-table has. Otherwise, |
d6c50ac00394
(Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents:
88858
diff
changeset
|
63 the char-table has no extra slot. */) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
64 (purpose, init) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
65 register Lisp_Object purpose, init; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
66 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
67 Lisp_Object vector; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
68 Lisp_Object n; |
88900
d6c50ac00394
(Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents:
88858
diff
changeset
|
69 int n_extras; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
70 int size; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
71 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
72 CHECK_SYMBOL (purpose); |
88900
d6c50ac00394
(Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents:
88858
diff
changeset
|
73 n = Fget (purpose, Qchar_table_extra_slots); |
d6c50ac00394
(Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents:
88858
diff
changeset
|
74 if (NILP (n)) |
d6c50ac00394
(Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents:
88858
diff
changeset
|
75 n_extras = 0; |
d6c50ac00394
(Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents:
88858
diff
changeset
|
76 else |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
77 { |
88900
d6c50ac00394
(Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents:
88858
diff
changeset
|
78 CHECK_NATNUM (n); |
d6c50ac00394
(Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents:
88858
diff
changeset
|
79 n_extras = XINT (n); |
d6c50ac00394
(Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents:
88858
diff
changeset
|
80 if (n_extras > 10) |
d6c50ac00394
(Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents:
88858
diff
changeset
|
81 args_out_of_range (n, Qnil); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
82 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
83 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
84 size = VECSIZE (struct Lisp_Char_Table) - 1 + n_extras; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
85 vector = Fmake_vector (make_number (size), init); |
91046 | 86 XSETPVECTYPE (XVECTOR (vector), PVEC_CHAR_TABLE); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
87 XCHAR_TABLE (vector)->parent = Qnil; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
88 XCHAR_TABLE (vector)->purpose = purpose; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
89 XSETCHAR_TABLE (vector, XCHAR_TABLE (vector)); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
90 return vector; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
91 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
92 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
93 static Lisp_Object |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
94 make_sub_char_table (depth, min_char, defalt) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
95 int depth, min_char; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
96 Lisp_Object defalt; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
97 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
98 Lisp_Object table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
99 int size = VECSIZE (struct Lisp_Sub_Char_Table) - 1 + chartab_size[depth]; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
100 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
101 table = Fmake_vector (make_number (size), defalt); |
91046 | 102 XSETPVECTYPE (XVECTOR (table), PVEC_SUB_CHAR_TABLE); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
103 XSUB_CHAR_TABLE (table)->depth = make_number (depth); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
104 XSUB_CHAR_TABLE (table)->min_char = make_number (min_char); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
105 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
106 return table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
107 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
108 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
109 static Lisp_Object |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
110 char_table_ascii (table) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
111 Lisp_Object table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
112 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
113 Lisp_Object sub; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
114 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
115 sub = XCHAR_TABLE (table)->contents[0]; |
89334
0b3ed65e4e97
(char_table_ascii): Check if the char table contents
Kenichi Handa <handa@m17n.org>
parents:
88988
diff
changeset
|
116 if (! SUB_CHAR_TABLE_P (sub)) |
0b3ed65e4e97
(char_table_ascii): Check if the char table contents
Kenichi Handa <handa@m17n.org>
parents:
88988
diff
changeset
|
117 return sub; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
118 sub = XSUB_CHAR_TABLE (sub)->contents[0]; |
89334
0b3ed65e4e97
(char_table_ascii): Check if the char table contents
Kenichi Handa <handa@m17n.org>
parents:
88988
diff
changeset
|
119 if (! SUB_CHAR_TABLE_P (sub)) |
0b3ed65e4e97
(char_table_ascii): Check if the char table contents
Kenichi Handa <handa@m17n.org>
parents:
88988
diff
changeset
|
120 return sub; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
121 return XSUB_CHAR_TABLE (sub)->contents[0]; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
122 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
123 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
124 Lisp_Object |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
125 copy_sub_char_table (table) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
126 Lisp_Object table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
127 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
128 Lisp_Object copy; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
129 int depth = XINT (XSUB_CHAR_TABLE (table)->depth); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
130 int min_char = XINT (XSUB_CHAR_TABLE (table)->min_char); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
131 Lisp_Object val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
132 int i; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
133 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
134 copy = make_sub_char_table (depth, min_char, Qnil); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
135 /* Recursively copy any sub char-tables. */ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
136 for (i = 0; i < chartab_size[depth]; i++) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
137 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
138 val = XSUB_CHAR_TABLE (table)->contents[i]; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
139 if (SUB_CHAR_TABLE_P (val)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
140 XSUB_CHAR_TABLE (copy)->contents[i] = copy_sub_char_table (val); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
141 else |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
142 XSUB_CHAR_TABLE (copy)->contents[i] = val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
143 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
144 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
145 return copy; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
146 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
147 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
148 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
149 Lisp_Object |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
150 copy_char_table (table) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
151 Lisp_Object table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
152 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
153 Lisp_Object copy; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
154 int size = XCHAR_TABLE (table)->size & PSEUDOVECTOR_SIZE_MASK; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
155 int i; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
156 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
157 copy = Fmake_vector (make_number (size), Qnil); |
91046 | 158 XSETPVECTYPE (XVECTOR (copy), PVEC_CHAR_TABLE); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
159 XCHAR_TABLE (copy)->defalt = XCHAR_TABLE (table)->defalt; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
160 XCHAR_TABLE (copy)->parent = XCHAR_TABLE (table)->parent; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
161 XCHAR_TABLE (copy)->purpose = XCHAR_TABLE (table)->purpose; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
162 for (i = 0; i < chartab_size[0]; i++) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
163 XCHAR_TABLE (copy)->contents[i] |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
164 = (SUB_CHAR_TABLE_P (XCHAR_TABLE (table)->contents[i]) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
165 ? copy_sub_char_table (XCHAR_TABLE (table)->contents[i]) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
166 : XCHAR_TABLE (table)->contents[i]); |
95430
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
167 XCHAR_TABLE (copy)->ascii = char_table_ascii (copy); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
168 size -= VECSIZE (struct Lisp_Char_Table) - 1; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
169 for (i = 0; i < size; i++) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
170 XCHAR_TABLE (copy)->extras[i] = XCHAR_TABLE (table)->extras[i]; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
171 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
172 XSETCHAR_TABLE (copy, XCHAR_TABLE (copy)); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
173 return copy; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
174 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
175 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
176 Lisp_Object |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
177 sub_char_table_ref (table, c) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
178 Lisp_Object table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
179 int c; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
180 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
181 struct Lisp_Sub_Char_Table *tbl = XSUB_CHAR_TABLE (table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
182 int depth = XINT (tbl->depth); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
183 int min_char = XINT (tbl->min_char); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
184 Lisp_Object val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
185 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
186 val = tbl->contents[CHARTAB_IDX (c, depth, min_char)]; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
187 if (SUB_CHAR_TABLE_P (val)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
188 val = sub_char_table_ref (val, c); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
189 return val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
190 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
191 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
192 Lisp_Object |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
193 char_table_ref (table, c) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
194 Lisp_Object table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
195 int c; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
196 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
197 struct Lisp_Char_Table *tbl = XCHAR_TABLE (table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
198 Lisp_Object val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
199 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
200 if (ASCII_CHAR_P (c)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
201 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
202 val = tbl->ascii; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
203 if (SUB_CHAR_TABLE_P (val)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
204 val = XSUB_CHAR_TABLE (val)->contents[c]; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
205 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
206 else |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
207 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
208 val = tbl->contents[CHARTAB_IDX (c, 0, 0)]; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
209 if (SUB_CHAR_TABLE_P (val)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
210 val = sub_char_table_ref (val, c); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
211 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
212 if (NILP (val)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
213 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
214 val = tbl->defalt; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
215 if (NILP (val) && CHAR_TABLE_P (tbl->parent)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
216 val = char_table_ref (tbl->parent, c); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
217 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
218 return val; |
89483 | 219 } |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
220 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
221 static Lisp_Object |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
222 sub_char_table_ref_and_range (table, c, from, to, defalt) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
223 Lisp_Object table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
224 int c; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
225 int *from, *to; |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
226 Lisp_Object defalt; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
227 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
228 struct Lisp_Sub_Char_Table *tbl = XSUB_CHAR_TABLE (table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
229 int depth = XINT (tbl->depth); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
230 int min_char = XINT (tbl->min_char); |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
231 int max_char = min_char + chartab_chars[depth - 1] - 1; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
232 int index = CHARTAB_IDX (c, depth, min_char); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
233 Lisp_Object val; |
89483 | 234 |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
235 val = tbl->contents[index]; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
236 *from = min_char + index * chartab_chars[depth]; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
237 *to = *from + chartab_chars[depth] - 1; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
238 if (SUB_CHAR_TABLE_P (val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
239 val = sub_char_table_ref_and_range (val, c, from, to, defalt); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
240 else if (NILP (val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
241 val = defalt; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
242 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
243 while (*from > min_char |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
244 && *from == min_char + index * chartab_chars[depth]) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
245 { |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
246 Lisp_Object this_val; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
247 int this_from = *from - chartab_chars[depth]; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
248 int this_to = *from - 1; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
249 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
250 index--; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
251 this_val = tbl->contents[index]; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
252 if (SUB_CHAR_TABLE_P (this_val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
253 this_val = sub_char_table_ref_and_range (this_val, this_to, |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
254 &this_from, &this_to, |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
255 defalt); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
256 else if (NILP (this_val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
257 this_val = defalt; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
258 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
259 if (! EQ (this_val, val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
260 break; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
261 *from = this_from; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
262 } |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
263 index = CHARTAB_IDX (c, depth, min_char); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
264 while (*to < max_char |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
265 && *to == min_char + (index + 1) * chartab_chars[depth] - 1) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
266 { |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
267 Lisp_Object this_val; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
268 int this_from = *to + 1; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
269 int this_to = this_from + chartab_chars[depth] - 1; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
270 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
271 index++; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
272 this_val = tbl->contents[index]; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
273 if (SUB_CHAR_TABLE_P (this_val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
274 this_val = sub_char_table_ref_and_range (this_val, this_from, |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
275 &this_from, &this_to, |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
276 defalt); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
277 else if (NILP (this_val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
278 this_val = defalt; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
279 if (! EQ (this_val, val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
280 break; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
281 *to = this_to; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
282 } |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
283 |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
284 return val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
285 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
286 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
287 |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
288 /* Return the value for C in char-table TABLE. Set *FROM and *TO to |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
289 the range of characters (containing C) that have the same value as |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
290 C. It is not assured that the value of (*FROM - 1) and (*TO + 1) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
291 is different from that of C. */ |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
292 |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
293 Lisp_Object |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
294 char_table_ref_and_range (table, c, from, to) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
295 Lisp_Object table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
296 int c; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
297 int *from, *to; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
298 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
299 struct Lisp_Char_Table *tbl = XCHAR_TABLE (table); |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
300 int index = CHARTAB_IDX (c, 0, 0); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
301 Lisp_Object val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
302 |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
303 val = tbl->contents[index]; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
304 *from = index * chartab_chars[0]; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
305 *to = *from + chartab_chars[0] - 1; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
306 if (SUB_CHAR_TABLE_P (val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
307 val = sub_char_table_ref_and_range (val, c, from, to, tbl->defalt); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
308 else if (NILP (val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
309 val = tbl->defalt; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
310 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
311 while (*from > 0 && *from == index * chartab_chars[0]) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
312 { |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
313 Lisp_Object this_val; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
314 int this_from = *from - chartab_chars[0]; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
315 int this_to = *from - 1; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
316 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
317 index--; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
318 this_val = tbl->contents[index]; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
319 if (SUB_CHAR_TABLE_P (this_val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
320 this_val = sub_char_table_ref_and_range (this_val, this_to, |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
321 &this_from, &this_to, |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
322 tbl->defalt); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
323 else if (NILP (this_val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
324 this_val = tbl->defalt; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
325 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
326 if (! EQ (this_val, val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
327 break; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
328 *from = this_from; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
329 } |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
330 while (*to < MAX_CHAR && *to == (index + 1) * chartab_chars[0] - 1) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
331 { |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
332 Lisp_Object this_val; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
333 int this_from = *to + 1; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
334 int this_to = this_from + chartab_chars[0] - 1; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
335 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
336 index++; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
337 this_val = tbl->contents[index]; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
338 if (SUB_CHAR_TABLE_P (this_val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
339 this_val = sub_char_table_ref_and_range (this_val, this_from, |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
340 &this_from, &this_to, |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
341 tbl->defalt); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
342 else if (NILP (this_val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
343 this_val = tbl->defalt; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
344 if (! EQ (this_val, val)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
345 break; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
346 *to = this_to; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
347 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
348 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
349 return val; |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
350 } |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
351 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
352 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
353 #define ASET_RANGE(ARRAY, FROM, TO, LIMIT, VAL) \ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
354 do { \ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
355 int limit = (TO) < (LIMIT) ? (TO) : (LIMIT); \ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
356 for (; (FROM) < limit; (FROM)++) (ARRAY)->contents[(FROM)] = (VAL); \ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
357 } while (0) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
358 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
359 #define GET_SUB_CHAR_TABLE(TABLE, SUBTABLE, IDX, DEPTH, MIN_CHAR) \ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
360 do { \ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
361 (SUBTABLE) = (TABLE)->contents[(IDX)]; \ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
362 if (!SUB_CHAR_TABLE_P (SUBTABLE)) \ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
363 (SUBTABLE) = make_sub_char_table ((DEPTH), (MIN_CHAR), (SUBTABLE)); \ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
364 } while (0) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
365 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
366 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
367 static void |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
368 sub_char_table_set (table, c, val) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
369 Lisp_Object table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
370 int c; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
371 Lisp_Object val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
372 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
373 struct Lisp_Sub_Char_Table *tbl = XSUB_CHAR_TABLE (table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
374 int depth = XINT ((tbl)->depth); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
375 int min_char = XINT ((tbl)->min_char); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
376 int i = CHARTAB_IDX (c, depth, min_char); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
377 Lisp_Object sub; |
89483 | 378 |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
379 if (depth == 3) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
380 tbl->contents[i] = val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
381 else |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
382 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
383 sub = tbl->contents[i]; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
384 if (! SUB_CHAR_TABLE_P (sub)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
385 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
386 sub = make_sub_char_table (depth + 1, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
387 min_char + i * chartab_chars[depth], sub); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
388 tbl->contents[i] = sub; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
389 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
390 sub_char_table_set (sub, c, val); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
391 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
392 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
393 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
394 Lisp_Object |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
395 char_table_set (table, c, val) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
396 Lisp_Object table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
397 int c; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
398 Lisp_Object val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
399 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
400 struct Lisp_Char_Table *tbl = XCHAR_TABLE (table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
401 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
402 if (ASCII_CHAR_P (c) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
403 && SUB_CHAR_TABLE_P (tbl->ascii)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
404 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
405 XSUB_CHAR_TABLE (tbl->ascii)->contents[c] = val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
406 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
407 else |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
408 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
409 int i = CHARTAB_IDX (c, 0, 0); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
410 Lisp_Object sub; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
411 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
412 sub = tbl->contents[i]; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
413 if (! SUB_CHAR_TABLE_P (sub)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
414 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
415 sub = make_sub_char_table (1, i * chartab_chars[0], sub); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
416 tbl->contents[i] = sub; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
417 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
418 sub_char_table_set (sub, c, val); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
419 if (ASCII_CHAR_P (c)) |
89334
0b3ed65e4e97
(char_table_ascii): Check if the char table contents
Kenichi Handa <handa@m17n.org>
parents:
88988
diff
changeset
|
420 tbl->ascii = char_table_ascii (table); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
421 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
422 return val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
423 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
424 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
425 static void |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
426 sub_char_table_set_range (table, depth, min_char, from, to, val) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
427 Lisp_Object *table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
428 int depth; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
429 int min_char; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
430 int from, to; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
431 Lisp_Object val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
432 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
433 int max_char = min_char + chartab_chars[depth] - 1; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
434 |
88988 | 435 if (depth == 3 || (from <= min_char && to >= max_char)) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
436 *table = val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
437 else |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
438 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
439 int i, j; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
440 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
441 depth++; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
442 if (! SUB_CHAR_TABLE_P (*table)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
443 *table = make_sub_char_table (depth, min_char, *table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
444 if (from < min_char) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
445 from = min_char; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
446 if (to > max_char) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
447 to = max_char; |
88429
89eaf88b37b4
(sub_char_table_set_range): Optimized for the case
Kenichi Handa <handa@m17n.org>
parents:
88358
diff
changeset
|
448 i = CHARTAB_IDX (from, depth, min_char); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
449 j = CHARTAB_IDX (to, depth, min_char); |
88429
89eaf88b37b4
(sub_char_table_set_range): Optimized for the case
Kenichi Handa <handa@m17n.org>
parents:
88358
diff
changeset
|
450 min_char += chartab_chars[depth] * i; |
89eaf88b37b4
(sub_char_table_set_range): Optimized for the case
Kenichi Handa <handa@m17n.org>
parents:
88358
diff
changeset
|
451 for (; i <= j; i++, min_char += chartab_chars[depth]) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
452 sub_char_table_set_range (XSUB_CHAR_TABLE (*table)->contents + i, |
88429
89eaf88b37b4
(sub_char_table_set_range): Optimized for the case
Kenichi Handa <handa@m17n.org>
parents:
88358
diff
changeset
|
453 depth, min_char, from, to, val); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
454 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
455 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
456 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
457 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
458 Lisp_Object |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
459 char_table_set_range (table, from, to, val) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
460 Lisp_Object table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
461 int from, to; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
462 Lisp_Object val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
463 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
464 struct Lisp_Char_Table *tbl = XCHAR_TABLE (table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
465 Lisp_Object *contents = tbl->contents; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
466 int i, min_char; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
467 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
468 if (from == to) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
469 char_table_set (table, from, val); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
470 else |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
471 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
472 for (i = CHARTAB_IDX (from, 0, 0), min_char = i * chartab_chars[0]; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
473 min_char <= to; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
474 i++, min_char += chartab_chars[0]) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
475 sub_char_table_set_range (contents + i, 0, min_char, from, to, val); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
476 if (ASCII_CHAR_P (from)) |
89334
0b3ed65e4e97
(char_table_ascii): Check if the char table contents
Kenichi Handa <handa@m17n.org>
parents:
88988
diff
changeset
|
477 tbl->ascii = char_table_ascii (table); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
478 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
479 return val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
480 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
481 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
482 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
483 DEFUN ("char-table-subtype", Fchar_table_subtype, Schar_table_subtype, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
484 1, 1, 0, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
485 doc: /* |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
486 Return the subtype of char-table CHAR-TABLE. The value is a symbol. */) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
487 (char_table) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
488 Lisp_Object char_table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
489 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
490 CHECK_CHAR_TABLE (char_table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
491 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
492 return XCHAR_TABLE (char_table)->purpose; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
493 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
494 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
495 DEFUN ("char-table-parent", Fchar_table_parent, Schar_table_parent, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
496 1, 1, 0, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
497 doc: /* Return the parent char-table of CHAR-TABLE. |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
498 The value is either nil or another char-table. |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
499 If CHAR-TABLE holds nil for a given character, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
500 then the actual applicable value is inherited from the parent char-table |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
501 \(or from its parents, if necessary). */) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
502 (char_table) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
503 Lisp_Object char_table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
504 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
505 CHECK_CHAR_TABLE (char_table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
506 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
507 return XCHAR_TABLE (char_table)->parent; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
508 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
509 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
510 DEFUN ("set-char-table-parent", Fset_char_table_parent, Sset_char_table_parent, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
511 2, 2, 0, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
512 doc: /* Set the parent char-table of CHAR-TABLE to PARENT. |
89909 | 513 Return PARENT. PARENT must be either nil or another char-table. */) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
514 (char_table, parent) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
515 Lisp_Object char_table, parent; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
516 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
517 Lisp_Object temp; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
518 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
519 CHECK_CHAR_TABLE (char_table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
520 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
521 if (!NILP (parent)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
522 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
523 CHECK_CHAR_TABLE (parent); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
524 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
525 for (temp = parent; !NILP (temp); temp = XCHAR_TABLE (temp)->parent) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
526 if (EQ (temp, char_table)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
527 error ("Attempt to make a chartable be its own parent"); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
528 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
529 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
530 XCHAR_TABLE (char_table)->parent = parent; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
531 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
532 return parent; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
533 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
534 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
535 DEFUN ("char-table-extra-slot", Fchar_table_extra_slot, Schar_table_extra_slot, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
536 2, 2, 0, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
537 doc: /* Return the value of CHAR-TABLE's extra-slot number N. */) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
538 (char_table, n) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
539 Lisp_Object char_table, n; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
540 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
541 CHECK_CHAR_TABLE (char_table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
542 CHECK_NUMBER (n); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
543 if (XINT (n) < 0 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
544 || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table))) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
545 args_out_of_range (char_table, n); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
546 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
547 return XCHAR_TABLE (char_table)->extras[XINT (n)]; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
548 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
549 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
550 DEFUN ("set-char-table-extra-slot", Fset_char_table_extra_slot, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
551 Sset_char_table_extra_slot, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
552 3, 3, 0, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
553 doc: /* Set CHAR-TABLE's extra-slot number N to VALUE. */) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
554 (char_table, n, value) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
555 Lisp_Object char_table, n, value; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
556 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
557 CHECK_CHAR_TABLE (char_table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
558 CHECK_NUMBER (n); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
559 if (XINT (n) < 0 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
560 || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table))) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
561 args_out_of_range (char_table, n); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
562 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
563 return XCHAR_TABLE (char_table)->extras[XINT (n)] = value; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
564 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
565 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
566 DEFUN ("char-table-range", Fchar_table_range, Schar_table_range, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
567 2, 2, 0, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
568 doc: /* Return the value in CHAR-TABLE for a range of characters RANGE. |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
569 RANGE should be nil (for the default value), |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
570 a cons of character codes (for characters in the range), or a character code. */) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
571 (char_table, range) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
572 Lisp_Object char_table, range; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
573 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
574 Lisp_Object val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
575 CHECK_CHAR_TABLE (char_table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
576 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
577 if (EQ (range, Qnil)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
578 val = XCHAR_TABLE (char_table)->defalt; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
579 else if (INTEGERP (range)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
580 val = CHAR_TABLE_REF (char_table, XINT (range)); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
581 else if (CONSP (range)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
582 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
583 int from, to; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
584 |
89483 | 585 CHECK_CHARACTER_CAR (range); |
586 CHECK_CHARACTER_CDR (range); | |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
587 val = char_table_ref_and_range (char_table, XINT (XCAR (range)), |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
588 &from, &to); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
589 /* Not yet implemented. */ |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
590 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
591 else |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
592 error ("Invalid RANGE argument to `char-table-range'"); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
593 return val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
594 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
595 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
596 DEFUN ("set-char-table-range", Fset_char_table_range, Sset_char_table_range, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
597 3, 3, 0, |
89909 | 598 doc: /* Set the value in CHAR-TABLE for a range of characters RANGE to VALUE. |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
599 RANGE should be t (for all characters), nil (for the default value), |
89909 | 600 a cons of character codes (for characters in the range), |
601 or a character code. Return VALUE. */) | |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
602 (char_table, range, value) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
603 Lisp_Object char_table, range, value; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
604 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
605 CHECK_CHAR_TABLE (char_table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
606 if (EQ (range, Qt)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
607 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
608 int i; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
609 |
94589
d97320b13374
(Fset_char_table_range): If range is t, really set all chars to that value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
91547
diff
changeset
|
610 XCHAR_TABLE (char_table)->ascii = value; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
611 for (i = 0; i < chartab_size[0]; i++) |
94589
d97320b13374
(Fset_char_table_range): If range is t, really set all chars to that value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
91547
diff
changeset
|
612 XCHAR_TABLE (char_table)->contents[i] = value; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
613 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
614 else if (EQ (range, Qnil)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
615 XCHAR_TABLE (char_table)->defalt = value; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
616 else if (INTEGERP (range)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
617 char_table_set (char_table, XINT (range), value); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
618 else if (CONSP (range)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
619 { |
89483 | 620 CHECK_CHARACTER_CAR (range); |
621 CHECK_CHARACTER_CDR (range); | |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
622 char_table_set_range (char_table, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
623 XINT (XCAR (range)), XINT (XCDR (range)), value); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
624 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
625 else |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
626 error ("Invalid RANGE argument to `set-char-table-range'"); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
627 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
628 return value; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
629 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
630 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
631 DEFUN ("set-char-table-default", Fset_char_table_default, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
632 Sset_char_table_default, 3, 3, 0, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
633 doc: /* |
88822
9c92853c0d10
(make_sub_char_table): Remove unused var.
Dave Love <fx@gnu.org>
parents:
88746
diff
changeset
|
634 This function is obsolete and has no effect. */) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
635 (char_table, ch, value) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
636 Lisp_Object char_table, ch, value; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
637 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
638 return Qnil; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
639 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
640 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
641 /* Look up the element in TABLE at index CH, and return it as an |
89570
c92884b9ca4a
(char_table_translate): Use CHARACTERP, not INETEGERP.
Kenichi Handa <handa@m17n.org>
parents:
89484
diff
changeset
|
642 integer. If the element is not a character, return CH itself. */ |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
643 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
644 int |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
645 char_table_translate (table, ch) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
646 Lisp_Object table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
647 int ch; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
648 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
649 Lisp_Object value; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
650 value = Faref (table, make_number (ch)); |
89570
c92884b9ca4a
(char_table_translate): Use CHARACTERP, not INETEGERP.
Kenichi Handa <handa@m17n.org>
parents:
89484
diff
changeset
|
651 if (! CHARACTERP (value)) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
652 return ch; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
653 return XINT (value); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
654 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
655 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
656 static Lisp_Object |
95430
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
657 optimize_sub_char_table (table, test) |
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
658 Lisp_Object table, test; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
659 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
660 struct Lisp_Sub_Char_Table *tbl = XSUB_CHAR_TABLE (table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
661 int depth = XINT (tbl->depth); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
662 Lisp_Object elt, this; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
663 int i; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
664 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
665 elt = XSUB_CHAR_TABLE (table)->contents[0]; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
666 if (SUB_CHAR_TABLE_P (elt)) |
95430
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
667 elt = XSUB_CHAR_TABLE (table)->contents[0] |
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
668 = optimize_sub_char_table (elt, test); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
669 if (SUB_CHAR_TABLE_P (elt)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
670 return table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
671 for (i = 1; i < chartab_size[depth]; i++) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
672 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
673 this = XSUB_CHAR_TABLE (table)->contents[i]; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
674 if (SUB_CHAR_TABLE_P (this)) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
675 this = XSUB_CHAR_TABLE (table)->contents[i] |
95430
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
676 = optimize_sub_char_table (this, test); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
677 if (SUB_CHAR_TABLE_P (this) |
95430
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
678 || (NILP (test) ? NILP (Fequal (this, elt)) /* defaults to `equal'. */ |
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
679 : EQ (test, Qeq) ? !EQ (this, elt) /* Optimize `eq' case. */ |
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
680 : NILP (call2 (test, this, elt)))) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
681 break; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
682 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
683 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
684 return (i < chartab_size[depth] ? table : elt); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
685 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
686 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
687 DEFUN ("optimize-char-table", Foptimize_char_table, Soptimize_char_table, |
95430
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
688 1, 2, 0, |
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
689 doc: /* Optimize CHAR-TABLE. |
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
690 TEST is the comparison function used to decide whether two entries are |
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
691 equivalent and can be merged. It defaults to `equal'. */) |
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
692 (char_table, test) |
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
693 Lisp_Object char_table, test; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
694 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
695 Lisp_Object elt; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
696 int i; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
697 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
698 CHECK_CHAR_TABLE (char_table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
699 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
700 for (i = 0; i < chartab_size[0]; i++) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
701 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
702 elt = XCHAR_TABLE (char_table)->contents[i]; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
703 if (SUB_CHAR_TABLE_P (elt)) |
95430
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
704 XCHAR_TABLE (char_table)->contents[i] |
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
705 = optimize_sub_char_table (elt, test); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
706 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
707 return Qnil; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
708 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
709 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
710 |
90966
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
711 /* Map C_FUNCTION or FUNCTION over TABLE (top or sub char-table), |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
712 calling it for each character or group of characters that share a |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
713 value. RANGE is a cons (FROM . TO) specifying the range of target |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
714 characters, VAL is a value of FROM in TABLE, DEFAULT_VAL is the |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
715 default value of the char-table, PARENT is the parent of the |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
716 char-table. |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
717 |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
718 ARG is passed to C_FUNCTION when that is called. |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
719 |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
720 It returns the value of last character covered by TABLE (not the |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
721 value inheritted from the parent), and by side-effect, the car part |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
722 of RANGE is updated to the minimum character C where C and all the |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
723 following characters in TABLE have the same value. */ |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
724 |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
725 static Lisp_Object |
89483 | 726 map_sub_char_table (c_function, function, table, arg, val, range, |
727 default_val, parent) | |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
728 void (*c_function) P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); |
89483 | 729 Lisp_Object function, table, arg, val, range, default_val, parent; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
730 { |
90966
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
731 /* Pointer to the elements of TABLE. */ |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
732 Lisp_Object *contents; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
733 /* Depth of TABLE. */ |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
734 int depth; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
735 /* Minimum and maxinum characters covered by TABLE. */ |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
736 int min_char, max_char; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
737 /* Number of characters covered by one element of TABLE. */ |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
738 int chars_in_block; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
739 int from = XINT (XCAR (range)), to = XINT (XCDR (range)); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
740 int i, c; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
741 |
90966
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
742 if (SUB_CHAR_TABLE_P (table)) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
743 { |
90966
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
744 struct Lisp_Sub_Char_Table *tbl = XSUB_CHAR_TABLE (table); |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
745 |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
746 depth = XINT (tbl->depth); |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
747 contents = tbl->contents; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
748 min_char = XINT (tbl->min_char); |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
749 max_char = min_char + chartab_chars[depth - 1] - 1; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
750 } |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
751 else |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
752 { |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
753 depth = 0; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
754 contents = XCHAR_TABLE (table)->contents; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
755 min_char = 0; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
756 max_char = MAX_CHAR; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
757 } |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
758 chars_in_block = chartab_chars[depth]; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
759 |
90966
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
760 if (to < max_char) |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
761 max_char = to; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
762 /* Set I to the index of the first element to check. */ |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
763 if (from <= min_char) |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
764 i = 0; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
765 else |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
766 i = (from - min_char) / chars_in_block; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
767 for (c = min_char + chars_in_block * i; c <= max_char; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
768 i++, c += chars_in_block) |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
769 { |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
770 Lisp_Object this = contents[i]; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
771 int nextc = c + chars_in_block; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
772 |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
773 if (SUB_CHAR_TABLE_P (this)) |
90966
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
774 { |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
775 if (to >= nextc) |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
776 XSETCDR (range, make_number (nextc - 1)); |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
777 val = map_sub_char_table (c_function, function, this, arg, |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
778 val, range, default_val, parent); |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
779 } |
89424
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
780 else |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
781 { |
89424
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
782 if (NILP (this)) |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
783 this = default_val; |
95430
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
784 if (!EQ (val, this)) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
785 { |
90966
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
786 int different_value = 1; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
787 |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
788 if (NILP (val)) |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
789 { |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
790 if (! NILP (parent)) |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
791 { |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
792 Lisp_Object temp = XCHAR_TABLE (parent)->parent; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
793 |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
794 /* This is to get a value of FROM in PARENT |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
795 without checking the parent of PARENT. */ |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
796 XCHAR_TABLE (parent)->parent = Qnil; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
797 val = CHAR_TABLE_REF (parent, from); |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
798 XCHAR_TABLE (parent)->parent = temp; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
799 XSETCDR (range, make_number (c - 1)); |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
800 val = map_sub_char_table (c_function, function, |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
801 parent, arg, val, range, |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
802 XCHAR_TABLE (parent)->defalt, |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
803 XCHAR_TABLE (parent)->parent); |
95430
04a952ac356f
* chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94963
diff
changeset
|
804 if (EQ (val, this)) |
90966
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
805 different_value = 0; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
806 } |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
807 } |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
808 if (! NILP (val) && different_value) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
809 { |
89483 | 810 XSETCDR (range, make_number (c - 1)); |
91036
f5e7e4e0fa66
(map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents:
90966
diff
changeset
|
811 if (EQ (XCAR (range), XCDR (range))) |
89424
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
812 { |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
813 if (c_function) |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
814 (*c_function) (arg, XCAR (range), val); |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
815 else |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
816 call2 (function, XCAR (range), val); |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
817 } |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
818 else |
89424
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
819 { |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
820 if (c_function) |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
821 (*c_function) (arg, range, val); |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
822 else |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
823 call2 (function, range, val); |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
824 } |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
825 } |
89424
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
826 val = this; |
90966
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
827 from = c; |
89483 | 828 XSETCAR (range, make_number (c)); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
829 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
830 } |
90966
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
831 XSETCDR (range, make_number (to)); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
832 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
833 return val; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
834 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
835 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
836 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
837 /* Map C_FUNCTION or FUNCTION over TABLE, calling it for each |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
838 character or group of characters that share a value. |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
839 |
89483 | 840 ARG is passed to C_FUNCTION when that is called. */ |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
841 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
842 void |
89483 | 843 map_char_table (c_function, function, table, arg) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
844 void (*c_function) P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); |
89483 | 845 Lisp_Object function, table, arg; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
846 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
847 Lisp_Object range, val; |
90047
20480108ff4e
(map_char_table): GCPRO table and arg.
Andreas Schwab <schwab@suse.de>
parents:
89911
diff
changeset
|
848 struct gcpro gcpro1, gcpro2, gcpro3; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
849 |
90966
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
850 range = Fcons (make_number (0), make_number (MAX_CHAR)); |
90047
20480108ff4e
(map_char_table): GCPRO table and arg.
Andreas Schwab <schwab@suse.de>
parents:
89911
diff
changeset
|
851 GCPRO3 (table, arg, range); |
89424
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
852 val = XCHAR_TABLE (table)->ascii; |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
853 if (SUB_CHAR_TABLE_P (val)) |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
854 val = XSUB_CHAR_TABLE (val)->contents[0]; |
90966
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
855 val = map_sub_char_table (c_function, function, table, arg, val, range, |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
856 XCHAR_TABLE (table)->defalt, |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
857 XCHAR_TABLE (table)->parent); |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
858 /* If VAL is nil and TABLE has a parent, we must consult the parent |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
859 recursively. */ |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
860 while (NILP (val) && ! NILP (XCHAR_TABLE (table)->parent)) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
861 { |
90966
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
862 Lisp_Object parent = XCHAR_TABLE (table)->parent; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
863 Lisp_Object temp = XCHAR_TABLE (parent)->parent; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
864 int from = XINT (XCAR (range)); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
865 |
90966
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
866 /* This is to get a value of FROM in PARENT without checking the |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
867 parent of PARENT. */ |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
868 XCHAR_TABLE (parent)->parent = Qnil; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
869 val = CHAR_TABLE_REF (parent, from); |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
870 XCHAR_TABLE (parent)->parent = temp; |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
871 val = map_sub_char_table (c_function, function, parent, arg, val, range, |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
872 XCHAR_TABLE (parent)->defalt, |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
873 XCHAR_TABLE (parent)->parent); |
d563fa5ce200
(map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents:
90047
diff
changeset
|
874 table = parent; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
875 } |
89424
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
876 |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
877 if (! NILP (val)) |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
878 { |
91036
f5e7e4e0fa66
(map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents:
90966
diff
changeset
|
879 if (EQ (XCAR (range), XCDR (range))) |
f5e7e4e0fa66
(map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents:
90966
diff
changeset
|
880 { |
f5e7e4e0fa66
(map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents:
90966
diff
changeset
|
881 if (c_function) |
f5e7e4e0fa66
(map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents:
90966
diff
changeset
|
882 (*c_function) (arg, XCAR (range), val); |
f5e7e4e0fa66
(map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents:
90966
diff
changeset
|
883 else |
f5e7e4e0fa66
(map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents:
90966
diff
changeset
|
884 call2 (function, XCAR (range), val); |
f5e7e4e0fa66
(map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents:
90966
diff
changeset
|
885 } |
89424
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
886 else |
91036
f5e7e4e0fa66
(map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents:
90966
diff
changeset
|
887 { |
f5e7e4e0fa66
(map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents:
90966
diff
changeset
|
888 if (c_function) |
f5e7e4e0fa66
(map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents:
90966
diff
changeset
|
889 (*c_function) (arg, range, val); |
f5e7e4e0fa66
(map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents:
90966
diff
changeset
|
890 else |
f5e7e4e0fa66
(map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents:
90966
diff
changeset
|
891 call2 (function, range, val); |
f5e7e4e0fa66
(map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents:
90966
diff
changeset
|
892 } |
89424
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
893 } |
89484
5c41371d228b
(map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents:
89483
diff
changeset
|
894 |
5c41371d228b
(map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents:
89483
diff
changeset
|
895 UNGCPRO; |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
896 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
897 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
898 DEFUN ("map-char-table", Fmap_char_table, Smap_char_table, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
899 2, 2, 0, |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
900 doc: /* |
89425 | 901 Call FUNCTION for each character in CHAR-TABLE that has non-nil value. |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
902 FUNCTION is called with two arguments--a key and a value. |
89424
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
903 The key is a character code or a cons of character codes specifying a |
7020f4f73751
(map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents:
89334
diff
changeset
|
904 range of characters that have the same value. */) |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
905 (function, char_table) |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
906 Lisp_Object function, char_table; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
907 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
908 CHECK_CHAR_TABLE (char_table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
909 |
89483 | 910 map_char_table (NULL, function, char_table, char_table); |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
911 return Qnil; |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
912 } |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
913 |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
914 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
915 static void |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
916 map_sub_char_table_for_charset (c_function, function, table, arg, range, |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
917 charset, from, to) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
918 void (*c_function) P_ ((Lisp_Object, Lisp_Object)); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
919 Lisp_Object function, table, arg, range; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
920 struct charset *charset; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
921 unsigned from, to; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
922 { |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
923 struct Lisp_Sub_Char_Table *tbl = XSUB_CHAR_TABLE (table); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
924 int depth = XINT (tbl->depth); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
925 int c, i; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
926 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
927 if (depth < 3) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
928 for (i = 0, c = XINT (tbl->min_char); i < chartab_size[depth]; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
929 i++, c += chartab_chars[depth]) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
930 { |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
931 Lisp_Object this; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
932 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
933 this = tbl->contents[i]; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
934 if (SUB_CHAR_TABLE_P (this)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
935 map_sub_char_table_for_charset (c_function, function, this, arg, |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
936 range, charset, from, to); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
937 else |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
938 { |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
939 if (! NILP (XCAR (range))) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
940 { |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
941 XSETCDR (range, make_number (c - 1)); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
942 if (c_function) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
943 (*c_function) (arg, range); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
944 else |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
945 call2 (function, range, arg); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
946 } |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
947 XSETCAR (range, Qnil); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
948 } |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
949 } |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
950 else |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
951 for (i = 0, c = XINT (tbl->min_char); i < chartab_size[depth]; i++, c ++) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
952 { |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
953 Lisp_Object this; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
954 unsigned code; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
955 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
956 this = tbl->contents[i]; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
957 if (NILP (this) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
958 || (charset |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
959 && (code = ENCODE_CHAR (charset, c), |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
960 (code < from || code > to)))) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
961 { |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
962 if (! NILP (XCAR (range))) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
963 { |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
964 XSETCDR (range, make_number (c - 1)); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
965 if (c_function) |
89684
d81f2ea4fc8d
(map_sub_char_table_for_charset): Fix args to c_function with.
Kenichi Handa <handa@m17n.org>
parents:
89570
diff
changeset
|
966 (*c_function) (arg, range); |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
967 else |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
968 call2 (function, range, arg); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
969 XSETCAR (range, Qnil); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
970 } |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
971 } |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
972 else |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
973 { |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
974 if (NILP (XCAR (range))) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
975 XSETCAR (range, make_number (c)); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
976 } |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
977 } |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
978 } |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
979 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
980 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
981 void |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
982 map_char_table_for_charset (c_function, function, table, arg, |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
983 charset, from, to) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
984 void (*c_function) P_ ((Lisp_Object, Lisp_Object)); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
985 Lisp_Object function, table, arg; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
986 struct charset *charset; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
987 unsigned from, to; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
988 { |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
989 Lisp_Object range; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
990 int c, i; |
89484
5c41371d228b
(map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents:
89483
diff
changeset
|
991 struct gcpro gcpro1; |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
992 |
89483 | 993 range = Fcons (Qnil, Qnil); |
89484
5c41371d228b
(map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents:
89483
diff
changeset
|
994 GCPRO1 (range); |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
995 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
996 for (i = 0, c = 0; i < chartab_size[0]; i++, c += chartab_chars[0]) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
997 { |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
998 Lisp_Object this; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
999 |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1000 this = XCHAR_TABLE (table)->contents[i]; |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1001 if (SUB_CHAR_TABLE_P (this)) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1002 map_sub_char_table_for_charset (c_function, function, this, arg, |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1003 range, charset, from, to); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1004 else |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1005 { |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1006 if (! NILP (XCAR (range))) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1007 { |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1008 XSETCDR (range, make_number (c - 1)); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1009 if (c_function) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1010 (*c_function) (arg, range); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1011 else |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1012 call2 (function, range, arg); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1013 } |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1014 XSETCAR (range, Qnil); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1015 } |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1016 } |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1017 if (! NILP (XCAR (range))) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1018 { |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1019 XSETCDR (range, make_number (c - 1)); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1020 if (c_function) |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1021 (*c_function) (arg, range); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1022 else |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1023 call2 (function, range, arg); |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1024 } |
89484
5c41371d228b
(map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents:
89483
diff
changeset
|
1025 |
5c41371d228b
(map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents:
89483
diff
changeset
|
1026 UNGCPRO; |
88746
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1027 } |
388c82972bb9
(sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents:
88429
diff
changeset
|
1028 |
88358
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1029 |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1030 void |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1031 syms_of_chartab () |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1032 { |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1033 defsubr (&Smake_char_table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1034 defsubr (&Schar_table_parent); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1035 defsubr (&Schar_table_subtype); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1036 defsubr (&Sset_char_table_parent); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1037 defsubr (&Schar_table_extra_slot); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1038 defsubr (&Sset_char_table_extra_slot); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1039 defsubr (&Schar_table_range); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1040 defsubr (&Sset_char_table_range); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1041 defsubr (&Sset_char_table_default); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1042 defsubr (&Soptimize_char_table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1043 defsubr (&Smap_char_table); |
5f98d0806407
New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff
changeset
|
1044 } |
89911 | 1045 |
1046 /* arch-tag: 18b5b560-7ab5-4108-b09e-d5dd65dc6fda | |
1047 (do not change this comment) */ |