annotate src/chartab.c @ 99492:ee792794d888

(isearch-search-fun): Compare the length of the current search string with the length of the string from the previous search state to detect the situation when the user adds or removes characters in the search string. Use word-search-forward-lax and word-search-backward-lax in this case, and otherwise word-search-forward and word-search-backward.
author Juri Linkov <juri@jurta.org>
date Tue, 11 Nov 2008 19:43:09 +0000
parents 0fda80cdeb4b
children a33d93f0c185
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
35069180a991 Fix up multi-tty merge
Miles Bader <miles@gnu.org>
parents: 91036
diff changeset
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
35069180a991 Fix up multi-tty merge
Miles Bader <miles@gnu.org>
parents: 91036
diff changeset
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
35069180a991 Fix up multi-tty merge
Miles Bader <miles@gnu.org>
parents: 91036
diff changeset
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
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
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
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
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
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
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
cd3317b3e1a9 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 88900
diff changeset
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
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents: 89684
diff changeset
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
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
585 CHECK_CHARACTER_CAR (range);
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
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
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents: 89684
diff changeset
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
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents: 89684
diff changeset
600 a cons of character codes (for characters in the range),
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents: 89684
diff changeset
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
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
620 CHECK_CHARACTER_CAR (range);
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
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;
97818
a4677d55715f (optimize_sub_char_table): Perform more greedy optimization.
Kenichi Handa <handa@m17n.org>
parents: 95430
diff changeset
663 int i, optimizable;
88358
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);
97818
a4677d55715f (optimize_sub_char_table): Perform more greedy optimization.
Kenichi Handa <handa@m17n.org>
parents: 95430
diff changeset
669 optimizable = SUB_CHAR_TABLE_P (elt) ? 0 : 1;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
670 for (i = 1; i < chartab_size[depth]; i++)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
671 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
672 this = XSUB_CHAR_TABLE (table)->contents[i];
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
673 if (SUB_CHAR_TABLE_P (this))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
674 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
675 = optimize_sub_char_table (this, test);
97818
a4677d55715f (optimize_sub_char_table): Perform more greedy optimization.
Kenichi Handa <handa@m17n.org>
parents: 95430
diff changeset
676 if (optimizable
a4677d55715f (optimize_sub_char_table): Perform more greedy optimization.
Kenichi Handa <handa@m17n.org>
parents: 95430
diff changeset
677 && (NILP (test) ? NILP (Fequal (this, elt)) /* defaults to `equal'. */
95430
04a952ac356f * chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94963
diff changeset
678 : 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
679 : NILP (call2 (test, this, elt))))
97818
a4677d55715f (optimize_sub_char_table): Perform more greedy optimization.
Kenichi Handa <handa@m17n.org>
parents: 95430
diff changeset
680 optimizable = 0;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
681 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
682
97818
a4677d55715f (optimize_sub_char_table): Perform more greedy optimization.
Kenichi Handa <handa@m17n.org>
parents: 95430
diff changeset
683 return (optimizable ? elt : table);
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
684 }
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 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
687 1, 2, 0,
04a952ac356f * chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94963
diff changeset
688 doc: /* Optimize CHAR-TABLE.
04a952ac356f * chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94963
diff changeset
689 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
690 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
691 (char_table, test)
04a952ac356f * chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94963
diff changeset
692 Lisp_Object char_table, test;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
693 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
694 Lisp_Object elt;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
695 int i;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
696
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
697 CHECK_CHAR_TABLE (char_table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
698
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
699 for (i = 0; i < chartab_size[0]; i++)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
700 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
701 elt = XCHAR_TABLE (char_table)->contents[i];
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
702 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
703 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
704 = optimize_sub_char_table (elt, test);
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
705 }
99143
f0ad9e3cb1a4 (Foptimize_char_table): Make sure `ascii' doesn't point to
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 97818
diff changeset
706 /* Reset the `ascii' cache, in case it got optimized away. */
f0ad9e3cb1a4 (Foptimize_char_table): Make sure `ascii' doesn't point to
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 97818
diff changeset
707 XCHAR_TABLE (char_table)->ascii = char_table_ascii (char_table);
f0ad9e3cb1a4 (Foptimize_char_table): Make sure `ascii' doesn't point to
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 97818
diff changeset
708
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
709 return Qnil;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
710 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
711
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
712
90966
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
713 /* 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
714 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
715 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
716 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
717 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
718 char-table.
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 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
721
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
722 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
723 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
724 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
725 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
726
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
727 static Lisp_Object
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
728 map_sub_char_table (c_function, function, table, arg, val, range,
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
729 default_val, parent)
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
730 void (*c_function) P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
731 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
732 {
90966
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
733 /* 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
734 Lisp_Object *contents;
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
735 /* Depth of TABLE. */
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
736 int depth;
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
737 /* 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
738 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
739 /* 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
740 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
741 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
742 int i, c;
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 if (SUB_CHAR_TABLE_P (table))
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
745 {
90966
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
746 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
747
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
748 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
749 contents = tbl->contents;
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
750 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
751 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
752 }
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
753 else
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
754 {
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
755 depth = 0;
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
756 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
757 min_char = 0;
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
758 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
759 }
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
760 chars_in_block = chartab_chars[depth];
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
761
90966
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
762 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
763 max_char = to;
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
764 /* 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
765 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
766 i = 0;
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
767 else
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
768 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
769 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
770 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
771 {
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
772 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
773 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
774
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
775 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
776 {
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
777 if (to >= nextc)
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
778 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
779 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
780 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
781 }
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
782 else
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
783 {
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
784 if (NILP (this))
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
785 this = default_val;
95430
04a952ac356f * chartab.c (Foptimize_char_table, optimize_sub_char_table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94963
diff changeset
786 if (!EQ (val, this))
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
787 {
90966
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
788 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
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 (val))
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 if (! NILP (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 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
795
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
796 /* 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
797 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
798 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
799 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
800 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
801 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
802 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
803 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
804 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
805 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
806 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
807 different_value = 0;
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
808 }
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
809 }
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
810 if (! NILP (val) && different_value)
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
811 {
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
812 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
813 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
814 {
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
815 if (c_function)
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
816 (*c_function) (arg, XCAR (range), val);
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
817 else
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
818 call2 (function, XCAR (range), val);
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
819 }
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
820 else
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
821 {
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
822 if (c_function)
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
823 (*c_function) (arg, range, val);
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
824 else
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
825 call2 (function, range, val);
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
826 }
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
827 }
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
828 val = this;
90966
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
829 from = c;
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
830 XSETCAR (range, make_number (c));
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
831 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
832 }
90966
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
833 XSETCDR (range, make_number (to));
88358
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 return val;
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
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
838
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
839 /* 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
840 character or group of characters that share a value.
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
841
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
842 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
843
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
844 void
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
845 map_char_table (c_function, function, table, arg)
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
846 void (*c_function) P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
847 Lisp_Object function, table, arg;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
848 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
849 Lisp_Object range, val;
90047
20480108ff4e (map_char_table): GCPRO table and arg.
Andreas Schwab <schwab@suse.de>
parents: 89911
diff changeset
850 struct gcpro gcpro1, gcpro2, gcpro3;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
851
90966
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
852 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
853 GCPRO3 (table, arg, range);
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
854 val = XCHAR_TABLE (table)->ascii;
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
855 if (SUB_CHAR_TABLE_P (val))
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
856 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
857 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
858 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
859 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
860 /* 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
861 recursively. */
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
862 while (NILP (val) && ! NILP (XCHAR_TABLE (table)->parent))
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
863 {
90966
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
864 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
865 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
866 int from = XINT (XCAR (range));
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
867
90966
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
868 /* 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
869 parent of PARENT. */
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 = Qnil;
d563fa5ce200 (map_sub_char_table): Make it work for the top-level
Kenichi Handa <handa@m17n.org>
parents: 90047
diff changeset
871 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
872 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
873 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
874 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
875 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
876 table = parent;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
877 }
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
878
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
879 if (! NILP (val))
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
880 {
91036
f5e7e4e0fa66 (map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents: 90966
diff changeset
881 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
882 {
f5e7e4e0fa66 (map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents: 90966
diff changeset
883 if (c_function)
f5e7e4e0fa66 (map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents: 90966
diff changeset
884 (*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
885 else
f5e7e4e0fa66 (map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents: 90966
diff changeset
886 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
887 }
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
888 else
91036
f5e7e4e0fa66 (map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents: 90966
diff changeset
889 {
f5e7e4e0fa66 (map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents: 90966
diff changeset
890 if (c_function)
f5e7e4e0fa66 (map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents: 90966
diff changeset
891 (*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
892 else
f5e7e4e0fa66 (map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents: 90966
diff changeset
893 call2 (function, range, val);
f5e7e4e0fa66 (map_sub_char_table): If the range contains just one
Kenichi Handa <handa@m17n.org>
parents: 90966
diff changeset
894 }
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
895 }
89484
5c41371d228b (map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents: 89483
diff changeset
896
5c41371d228b (map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents: 89483
diff changeset
897 UNGCPRO;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
898 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
899
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
900 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
901 2, 2, 0,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
902 doc: /*
89425
32e34aaffbe3 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89424
diff changeset
903 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
904 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
905 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
906 range of characters that have the same value. */)
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
907 (function, char_table)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
908 Lisp_Object function, char_table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
909 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
910 CHECK_CHAR_TABLE (char_table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
911
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
912 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
913 return Qnil;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
914 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
915
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
916
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
917 static void
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
918 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
919 charset, from, to)
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
920 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
921 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
922 struct charset *charset;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
923 unsigned from, to;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
924 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
925 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
926 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
927 int c, i;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
928
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
929 if (depth < 3)
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
930 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
931 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
932 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
933 Lisp_Object this;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
934
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
935 this = tbl->contents[i];
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
936 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
937 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
938 range, charset, from, to);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
939 else
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 if (! NILP (XCAR (range)))
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
942 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
943 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
944 if (c_function)
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
945 (*c_function) (arg, range);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
946 else
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
947 call2 (function, range, arg);
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 XSETCAR (range, Qnil);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
950 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
951 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
952 else
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
953 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
954 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
955 Lisp_Object this;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
956 unsigned code;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
957
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
958 this = tbl->contents[i];
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
959 if (NILP (this)
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
960 || (charset
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
961 && (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
962 (code < from || code > to))))
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 if (! NILP (XCAR (range)))
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
965 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
966 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
967 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
968 (*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
969 else
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
970 call2 (function, range, arg);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
971 XSETCAR (range, Qnil);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
972 }
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 else
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
975 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
976 if (NILP (XCAR (range)))
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
977 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
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
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
982
99483
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
983 /* Support function for `map-charset-chars'. Map C_FUNCTION or
99485
0fda80cdeb4b Fix typos.
Juanma Barranquero <lekktu@gmail.com>
parents: 99483
diff changeset
984 FUNCTION over TABLE, calling it for each character or a group of
99483
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
985 succeeding characters that have non-nil value in TABLE. TABLE is a
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
986 "mapping table" or a "deunifier table" of a certain charset.
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
987
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
988 If CHARSET is not NULL (this is the case that `map-charset-chars'
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
989 is called with non-nil FROM-CODE and TO-CODE), it is a charset who
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
990 owns TABLE, and the function is called only on a character in the
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
991 range FROM and TO. FROM and TO are not character codes, but code
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
992 points of a character in CHARSET.
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
993
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
994 This function is called in these two cases:
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
995
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
996 (1) A charset has a mapping file name in :map property.
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
997
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
998 (2) A charset has an upper code space in :offset property and a
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
999 mapping file name in :unify-map property. In this case, this
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
1000 function is called only for characters in the Unicode code space.
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
1001 Characters in upper code space are handled directly in
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
1002 map_charset_chars. */
203b7f0b2698 (map_char_table_for_charset): Add comment.
Kenichi Handa <handa@m17n.org>
parents: 99143
diff changeset
1003
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1004 void
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1005 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
1006 charset, from, to)
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1007 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
1008 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
1009 struct charset *charset;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1010 unsigned from, to;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1011 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1012 Lisp_Object range;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1013 int c, i;
89484
5c41371d228b (map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents: 89483
diff changeset
1014 struct gcpro gcpro1;
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1015
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
1016 range = Fcons (Qnil, Qnil);
89484
5c41371d228b (map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents: 89483
diff changeset
1017 GCPRO1 (range);
88746
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 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
1020 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1021 Lisp_Object this;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1022
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1023 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
1024 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
1025 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
1026 range, charset, from, to);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1027 else
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1028 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1029 if (! NILP (XCAR (range)))
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1030 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1031 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
1032 if (c_function)
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1033 (*c_function) (arg, range);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1034 else
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1035 call2 (function, range, arg);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1036 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1037 XSETCAR (range, Qnil);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1038 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1039 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1040 if (! NILP (XCAR (range)))
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1041 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1042 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
1043 if (c_function)
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1044 (*c_function) (arg, range);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1045 else
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1046 call2 (function, range, arg);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1047 }
89484
5c41371d228b (map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents: 89483
diff changeset
1048
5c41371d228b (map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents: 89483
diff changeset
1049 UNGCPRO;
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1050 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
1051
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1052
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1053 void
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1054 syms_of_chartab ()
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1055 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1056 defsubr (&Smake_char_table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1057 defsubr (&Schar_table_parent);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1058 defsubr (&Schar_table_subtype);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1059 defsubr (&Sset_char_table_parent);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1060 defsubr (&Schar_table_extra_slot);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1061 defsubr (&Sset_char_table_extra_slot);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1062 defsubr (&Schar_table_range);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1063 defsubr (&Sset_char_table_range);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1064 defsubr (&Sset_char_table_default);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1065 defsubr (&Soptimize_char_table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1066 defsubr (&Smap_char_table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
1067 }
89911
cce857c68ba2 Add arch taglines
Miles Bader <miles@gnu.org>
parents: 89909
diff changeset
1068
cce857c68ba2 Add arch taglines
Miles Bader <miles@gnu.org>
parents: 89909
diff changeset
1069 /* arch-tag: 18b5b560-7ab5-4108-b09e-d5dd65dc6fda
cce857c68ba2 Add arch taglines
Miles Bader <miles@gnu.org>
parents: 89909
diff changeset
1070 (do not change this comment) */