annotate src/chartab.c @ 90906:f8694254fa1d

(w32font_info): Remove subranges. (QCsubranges, Qmodern, Qswiss, Qroman): Remove. (QCfamily, Qmonospace, Qsans_serif, Qmono, Qsans, Qsans__serif) (Qraster, Qoutline, Qlatin, Qgreek, Qcoptic, Qcyrillic, Qarmenian) (Qhebrew, Qarabic, Qsyriac, Qnko, Qthaana, Qdevanagari, Qbengali) (Qgurmukhi, Qgujarati, Qoriya, Qtamil, Qtelugu, Qkannada) (Qmalayalam, Qsinhala, Qthai, Qlao, Qtibetan, Qmyanmar, Qgeorgian) (Qhangul, Qethiopic, Qcherokee, Qcanadian_aboriginal, Qogham) (Qrunic, Qkhmer, Qmongolian, Qsymbol, Qbraille, Qhan) (Qideographic_description, Qcjk_misc, Qkana, Qbopomofo, Qkanbun) (Qyi, Qbyzantine_musical_symbol, Qmusical_symbol, Qmathematical): New symbols. (font_callback_data): New struct. (w32font_list, w32font_match): Use it. (w32font_open): Don't populate subranges. (w32font_has_char): Use script Lisp symbols, not subrange bitmask. (w32font_encode_char): Always return unicode code-point as-is. (w32font_text_extents): Supply a tranformation matrix to GetGlyphOutline. Never look up by glyph index. Avoid looping twice. Use unicode version of GetTexExtentPoint32 instead of glyph index version. (set_fonts_frame): Remove (w32_enumfont_pattern_entity): Add frame parameter, use it to set frame parameter. Use backward compatible fake foundries. Save generic family in extra slot under QCfamily. Make width slot constant. Save QCspacing value. Save list of scripts instead of binary subranges. (w32_generic_family, logfonts_match, font_matches_spec): New functions. (add_font_entity_to_list): Use font_callback_data struct. Filter unwanted fonts. (add_one_font_entity_to_list): Use font_callback_data struct. (w32_registry): Default to iso10646_1; (fill_in_logfont): Use dpi from extra slot. Don't bother with string font registries. Don't fill in font name if it is a generic family name, fill family instead. Use spacing, family and script extra info to fill pitch, family and charset fields. (list_all_matching_fonts): Use font_callback_data struct. (unicode_range_for_char): Remove. (font_supported_scripts): New function. (w32font_initialize): Remove. (syms_of_w32font): Update which symbols are defined.
author Jason Rumney <jasonr@gnu.org>
date Sat, 02 Jun 2007 23:42:23 +0000
parents 20480108ff4e
children d563fa5ce200
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
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
2 Copyright (C) 2003
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
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
8 GNU Emacs is free software; you can redistribute it and/or modify
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
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
10 the Free Software Foundation; either version 2, or (at your option)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
11 any later version.
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
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
19 along with GNU Emacs; see the file COPYING. If not, write to
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
21 Boston, MA 02111-1307, USA. */
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
22
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
23 #include <config.h>
88858
889b48cce7a1 Include "...h", not <...h> in some cases.
Dave Love <fx@gnu.org>
parents: 88822
diff changeset
24 #include "lisp.h"
889b48cce7a1 Include "...h", not <...h> in some cases.
Dave Love <fx@gnu.org>
parents: 88822
diff changeset
25 #include "character.h"
889b48cce7a1 Include "...h", not <...h> in some cases.
Dave Love <fx@gnu.org>
parents: 88822
diff changeset
26 #include "charset.h"
889b48cce7a1 Include "...h", not <...h> in some cases.
Dave Love <fx@gnu.org>
parents: 88822
diff changeset
27 #include "ccl.h"
88358
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 /* 64/16/32/128 */
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
30
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
31 /* Number of elements in Nth level char-table. */
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
32 const int chartab_size[4] =
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
33 { (1 << CHARTAB_SIZE_BITS_0),
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
34 (1 << CHARTAB_SIZE_BITS_1),
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
35 (1 << CHARTAB_SIZE_BITS_2),
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
36 (1 << CHARTAB_SIZE_BITS_3) };
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
37
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
38 /* 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
39 covers. */
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
40 const int chartab_chars[4] =
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
41 { (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
42 (1 << (CHARTAB_SIZE_BITS_2 + CHARTAB_SIZE_BITS_3)),
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
43 (1 << CHARTAB_SIZE_BITS_3),
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
44 1 };
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
45
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
46 /* 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
47 covers. */
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
48 const int chartab_bits[4] =
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
49 { (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
50 (CHARTAB_SIZE_BITS_2 + CHARTAB_SIZE_BITS_3),
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
51 CHARTAB_SIZE_BITS_3,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
52 0 };
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
53
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
54 #define CHARTAB_IDX(c, depth, min_char) \
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
55 (((c) - (min_char)) >> chartab_bits[(depth)])
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
56
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
57
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
58 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
59 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
60 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
61
88900
d6c50ac00394 (Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents: 88858
diff changeset
62 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
63 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
64 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
65 the char-table has no extra slot. */)
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
66 (purpose, init)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
67 register Lisp_Object purpose, init;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
68 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
69 Lisp_Object vector;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
70 Lisp_Object n;
88900
d6c50ac00394 (Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents: 88858
diff changeset
71 int n_extras;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
72 int size;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
73
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
74 CHECK_SYMBOL (purpose);
88900
d6c50ac00394 (Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents: 88858
diff changeset
75 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
76 if (NILP (n))
d6c50ac00394 (Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents: 88858
diff changeset
77 n_extras = 0;
d6c50ac00394 (Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents: 88858
diff changeset
78 else
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
79 {
88900
d6c50ac00394 (Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents: 88858
diff changeset
80 CHECK_NATNUM (n);
d6c50ac00394 (Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents: 88858
diff changeset
81 n_extras = XINT (n);
d6c50ac00394 (Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents: 88858
diff changeset
82 if (n_extras > 10)
d6c50ac00394 (Fmake_char_table): Doc fixed. If PURPOSE doesn't
Kenichi Handa <handa@m17n.org>
parents: 88858
diff changeset
83 args_out_of_range (n, Qnil);
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
84 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
85
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
86 size = VECSIZE (struct Lisp_Char_Table) - 1 + n_extras;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
87 vector = Fmake_vector (make_number (size), init);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
88 XCHAR_TABLE (vector)->parent = Qnil;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
89 XCHAR_TABLE (vector)->purpose = purpose;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
90 XSETCHAR_TABLE (vector, XCHAR_TABLE (vector));
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
91 return vector;
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
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
94 static Lisp_Object
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
95 make_sub_char_table (depth, min_char, defalt)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
96 int depth, min_char;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
97 Lisp_Object defalt;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
98 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
99 Lisp_Object table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
100 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
101
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
102 table = Fmake_vector (make_number (size), defalt);
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 XSETSUB_CHAR_TABLE (table, XSUB_CHAR_TABLE (table));
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
106
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
107 return table;
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
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
110 static Lisp_Object
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
111 char_table_ascii (table)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
112 Lisp_Object table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
113 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
114 Lisp_Object sub;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
115
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
116 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
117 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
118 return sub;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
119 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
120 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
121 return sub;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
122 return XSUB_CHAR_TABLE (sub)->contents[0];
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
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
125 Lisp_Object
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
126 copy_sub_char_table (table)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
127 Lisp_Object table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
128 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
129 Lisp_Object copy;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
130 int depth = XINT (XSUB_CHAR_TABLE (table)->depth);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
131 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
132 Lisp_Object val;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
133 int i;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
134
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
135 copy = make_sub_char_table (depth, min_char, Qnil);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
136 /* Recursively copy any sub char-tables. */
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
137 for (i = 0; i < chartab_size[depth]; i++)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
138 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
139 val = XSUB_CHAR_TABLE (table)->contents[i];
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
140 if (SUB_CHAR_TABLE_P (val))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
141 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
142 else
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
143 XSUB_CHAR_TABLE (copy)->contents[i] = val;
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
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
146 return copy;
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
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
150 Lisp_Object
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
151 copy_char_table (table)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
152 Lisp_Object table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
153 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
154 Lisp_Object copy;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
155 int size = XCHAR_TABLE (table)->size & PSEUDOVECTOR_SIZE_MASK;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
156 int i;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
157
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
158 copy = Fmake_vector (make_number (size), Qnil);
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 XCHAR_TABLE (copy)->ascii = XCHAR_TABLE (table)->ascii;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
163 for (i = 0; i < chartab_size[0]; i++)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
164 XCHAR_TABLE (copy)->contents[i]
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
165 = (SUB_CHAR_TABLE_P (XCHAR_TABLE (table)->contents[i])
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
166 ? copy_sub_char_table (XCHAR_TABLE (table)->contents[i])
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
167 : XCHAR_TABLE (table)->contents[i]);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
168 if (SUB_CHAR_TABLE_P (XCHAR_TABLE (copy)->ascii))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
169 XCHAR_TABLE (copy)->ascii = char_table_ascii (copy);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
170 size -= VECSIZE (struct Lisp_Char_Table) - 1;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
171 for (i = 0; i < size; i++)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
172 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
173
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
174 XSETCHAR_TABLE (copy, XCHAR_TABLE (copy));
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
175 return copy;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
176 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
177
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
178 Lisp_Object
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
179 sub_char_table_ref (table, c)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
180 Lisp_Object table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
181 int c;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
182 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
183 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
184 int depth = XINT (tbl->depth);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
185 int min_char = XINT (tbl->min_char);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
186 Lisp_Object val;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
187
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
188 val = tbl->contents[CHARTAB_IDX (c, depth, min_char)];
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
189 if (SUB_CHAR_TABLE_P (val))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
190 val = sub_char_table_ref (val, c);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
191 return val;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
192 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
193
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
194 Lisp_Object
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
195 char_table_ref (table, c)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
196 Lisp_Object table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
197 int c;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
198 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
199 struct Lisp_Char_Table *tbl = XCHAR_TABLE (table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
200 Lisp_Object val;
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 if (ASCII_CHAR_P (c))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
203 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
204 val = tbl->ascii;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
205 if (SUB_CHAR_TABLE_P (val))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
206 val = XSUB_CHAR_TABLE (val)->contents[c];
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 else
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
209 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
210 val = tbl->contents[CHARTAB_IDX (c, 0, 0)];
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
211 if (SUB_CHAR_TABLE_P (val))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
212 val = sub_char_table_ref (val, c);
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 if (NILP (val))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
215 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
216 val = tbl->defalt;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
217 if (NILP (val) && CHAR_TABLE_P (tbl->parent))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
218 val = char_table_ref (tbl->parent, c);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
219 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
220 return val;
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
221 }
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
222
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
223 static Lisp_Object
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
224 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
225 Lisp_Object table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
226 int c;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
227 int *from, *to;
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
228 Lisp_Object defalt;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
229 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
230 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
231 int depth = XINT (tbl->depth);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
232 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
233 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
234 int index = CHARTAB_IDX (c, depth, min_char);
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
235 Lisp_Object val;
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
236
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
237 val = tbl->contents[index];
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
238 *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
239 *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
240 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
241 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
242 else if (NILP (val))
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
243 val = defalt;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
244
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
245 while (*from > min_char
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
246 && *from == min_char + index * chartab_chars[depth])
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
247 {
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
248 Lisp_Object this_val;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
249 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
250 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
251
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
252 index--;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
253 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
254 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
255 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
256 &this_from, &this_to,
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
257 defalt);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
258 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
259 this_val = defalt;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
260
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
261 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
262 break;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
263 *from = this_from;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
264 }
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
265 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
266 while (*to < max_char
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
267 && *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
268 {
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
269 Lisp_Object this_val;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
270 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
271 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
272
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
273 index++;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
274 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
275 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
276 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
277 &this_from, &this_to,
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
278 defalt);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
279 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
280 this_val = defalt;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
281 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
282 break;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
283 *to = this_to;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
284 }
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
285
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
286 return val;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
287 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
288
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
289
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
290 /* 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
291 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
292 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
293 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
294
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
295 Lisp_Object
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
296 char_table_ref_and_range (table, c, from, to)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
297 Lisp_Object table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
298 int c;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
299 int *from, *to;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
300 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
301 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
302 int index = CHARTAB_IDX (c, 0, 0);
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
303 Lisp_Object val;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
304
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
305 val = tbl->contents[index];
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
306 *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
307 *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
308 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
309 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
310 else if (NILP (val))
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
311 val = tbl->defalt;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
312
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
313 while (*from > 0 && *from == index * chartab_chars[0])
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
314 {
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
315 Lisp_Object this_val;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
316 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
317 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
318
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
319 index--;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
320 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
321 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
322 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
323 &this_from, &this_to,
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
324 tbl->defalt);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
325 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
326 this_val = tbl->defalt;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
327
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
328 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
329 break;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
330 *from = this_from;
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 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
333 {
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
334 Lisp_Object this_val;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
335 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
336 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
337
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
338 index++;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
339 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
340 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
341 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
342 &this_from, &this_to,
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
343 tbl->defalt);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
344 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
345 this_val = tbl->defalt;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
346 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
347 break;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
348 *to = this_to;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
349 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
350
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
351 return val;
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
352 }
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
353
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
354
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
355 #define ASET_RANGE(ARRAY, FROM, TO, LIMIT, VAL) \
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
356 do { \
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
357 int limit = (TO) < (LIMIT) ? (TO) : (LIMIT); \
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
358 for (; (FROM) < limit; (FROM)++) (ARRAY)->contents[(FROM)] = (VAL); \
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
359 } while (0)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
360
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
361 #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
362 do { \
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
363 (SUBTABLE) = (TABLE)->contents[(IDX)]; \
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
364 if (!SUB_CHAR_TABLE_P (SUBTABLE)) \
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
365 (SUBTABLE) = make_sub_char_table ((DEPTH), (MIN_CHAR), (SUBTABLE)); \
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
366 } while (0)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
367
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
368
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
369 static void
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
370 sub_char_table_set (table, c, val)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
371 Lisp_Object table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
372 int c;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
373 Lisp_Object val;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
374 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
375 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
376 int depth = XINT ((tbl)->depth);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
377 int min_char = XINT ((tbl)->min_char);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
378 int i = CHARTAB_IDX (c, depth, min_char);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
379 Lisp_Object sub;
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
380
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
381 if (depth == 3)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
382 tbl->contents[i] = val;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
383 else
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
384 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
385 sub = tbl->contents[i];
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
386 if (! SUB_CHAR_TABLE_P (sub))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
387 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
388 sub = make_sub_char_table (depth + 1,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
389 min_char + i * chartab_chars[depth], sub);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
390 tbl->contents[i] = sub;
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 sub_char_table_set (sub, c, val);
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 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
395
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
396 Lisp_Object
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
397 char_table_set (table, c, val)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
398 Lisp_Object table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
399 int c;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
400 Lisp_Object val;
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 struct Lisp_Char_Table *tbl = XCHAR_TABLE (table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
403
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
404 if (ASCII_CHAR_P (c)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
405 && SUB_CHAR_TABLE_P (tbl->ascii))
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 XSUB_CHAR_TABLE (tbl->ascii)->contents[c] = val;
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 else
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
410 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
411 int i = CHARTAB_IDX (c, 0, 0);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
412 Lisp_Object sub;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
413
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
414 sub = tbl->contents[i];
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
415 if (! SUB_CHAR_TABLE_P (sub))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
416 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
417 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
418 tbl->contents[i] = sub;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
419 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
420 sub_char_table_set (sub, c, val);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
421 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
422 tbl->ascii = char_table_ascii (table);
88358
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 return val;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
425 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
426
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
427 static void
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
428 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
429 Lisp_Object *table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
430 int depth;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
431 int min_char;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
432 int from, to;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
433 Lisp_Object val;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
434 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
435 int max_char = min_char + chartab_chars[depth] - 1;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
436
88988
cd3317b3e1a9 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 88900
diff changeset
437 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
438 *table = val;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
439 else
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 int i, j;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
442
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
443 depth++;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
444 if (! SUB_CHAR_TABLE_P (*table))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
445 *table = make_sub_char_table (depth, min_char, *table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
446 if (from < min_char)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
447 from = min_char;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
448 if (to > max_char)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
449 to = max_char;
88429
89eaf88b37b4 (sub_char_table_set_range): Optimized for the case
Kenichi Handa <handa@m17n.org>
parents: 88358
diff changeset
450 i = CHARTAB_IDX (from, depth, min_char);
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
451 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
452 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
453 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
454 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
455 depth, min_char, from, to, val);
88358
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
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
459
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
460 Lisp_Object
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
461 char_table_set_range (table, from, to, val)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
462 Lisp_Object table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
463 int from, to;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
464 Lisp_Object val;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
465 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
466 struct Lisp_Char_Table *tbl = XCHAR_TABLE (table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
467 Lisp_Object *contents = tbl->contents;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
468 int i, min_char;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
469
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
470 if (from == to)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
471 char_table_set (table, from, val);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
472 else
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
473 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
474 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
475 min_char <= to;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
476 i++, min_char += chartab_chars[0])
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
477 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
478 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
479 tbl->ascii = char_table_ascii (table);
88358
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 return val;
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
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
484
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
485 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
486 1, 1, 0,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
487 doc: /*
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
488 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
489 (char_table)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
490 Lisp_Object 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 CHECK_CHAR_TABLE (char_table);
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 return XCHAR_TABLE (char_table)->purpose;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
495 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
496
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
497 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
498 1, 1, 0,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
499 doc: /* Return the parent char-table of CHAR-TABLE.
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
500 The value is either nil or another char-table.
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
501 If CHAR-TABLE holds nil for a given character,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
502 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
503 \(or from its parents, if necessary). */)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
504 (char_table)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
505 Lisp_Object 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 CHECK_CHAR_TABLE (char_table);
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 return XCHAR_TABLE (char_table)->parent;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
510 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
511
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
512 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
513 2, 2, 0,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
514 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
515 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
516 (char_table, parent)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
517 Lisp_Object char_table, parent;
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 Lisp_Object temp;
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 CHECK_CHAR_TABLE (char_table);
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 if (!NILP (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 CHECK_CHAR_TABLE (parent);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
526
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
527 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
528 if (EQ (temp, char_table))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
529 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
530 }
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 XCHAR_TABLE (char_table)->parent = 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 return parent;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
535 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
536
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
537 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
538 2, 2, 0,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
539 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
540 (char_table, n)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
541 Lisp_Object char_table, n;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
542 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
543 CHECK_CHAR_TABLE (char_table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
544 CHECK_NUMBER (n);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
545 if (XINT (n) < 0
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
546 || 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
547 args_out_of_range (char_table, 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 return XCHAR_TABLE (char_table)->extras[XINT (n)];
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
550 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
551
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
552 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
553 Sset_char_table_extra_slot,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
554 3, 3, 0,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
555 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
556 (char_table, n, value)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
557 Lisp_Object char_table, n, value;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
558 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
559 CHECK_CHAR_TABLE (char_table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
560 CHECK_NUMBER (n);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
561 if (XINT (n) < 0
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
562 || 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
563 args_out_of_range (char_table, n);
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 return XCHAR_TABLE (char_table)->extras[XINT (n)] = value;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
566 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
567
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
568 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
569 2, 2, 0,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
570 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
571 RANGE should be nil (for the default value),
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
572 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
573 (char_table, range)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
574 Lisp_Object char_table, range;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
575 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
576 Lisp_Object val;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
577 CHECK_CHAR_TABLE (char_table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
578
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
579 if (EQ (range, Qnil))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
580 val = XCHAR_TABLE (char_table)->defalt;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
581 else if (INTEGERP (range))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
582 val = CHAR_TABLE_REF (char_table, XINT (range));
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
583 else if (CONSP (range))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
584 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
585 int from, to;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
586
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
587 CHECK_CHARACTER_CAR (range);
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
588 CHECK_CHARACTER_CDR (range);
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
589 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
590 &from, &to);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
591 /* Not yet implemented. */
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
592 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
593 else
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
594 error ("Invalid RANGE argument to `char-table-range'");
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
595 return val;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
596 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
597
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
598 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
599 3, 3, 0,
89909
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents: 89684
diff changeset
600 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
601 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
602 a cons of character codes (for characters in the range),
68c22ea6027c Sync to HEAD
Kenichi Handa <handa@m17n.org>
parents: 89684
diff changeset
603 or a character code. Return VALUE. */)
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
604 (char_table, range, value)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
605 Lisp_Object char_table, range, value;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
606 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
607 CHECK_CHAR_TABLE (char_table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
608 if (EQ (range, Qt))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
609 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
610 int i;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
611
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
612 XCHAR_TABLE (char_table)->ascii = Qnil;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
613 for (i = 0; i < chartab_size[0]; i++)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
614 XCHAR_TABLE (char_table)->contents[i] = 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 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
617 else if (EQ (range, Qnil))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
618 XCHAR_TABLE (char_table)->defalt = value;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
619 else if (INTEGERP (range))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
620 char_table_set (char_table, XINT (range), value);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
621 else if (CONSP (range))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
622 {
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
623 CHECK_CHARACTER_CAR (range);
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
624 CHECK_CHARACTER_CDR (range);
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
625 char_table_set_range (char_table,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
626 XINT (XCAR (range)), XINT (XCDR (range)), value);
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 else
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
629 error ("Invalid RANGE argument to `set-char-table-range'");
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 return value;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
632 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
633
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
634 DEFUN ("set-char-table-default", Fset_char_table_default,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
635 Sset_char_table_default, 3, 3, 0,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
636 doc: /*
88822
9c92853c0d10 (make_sub_char_table): Remove unused var.
Dave Love <fx@gnu.org>
parents: 88746
diff changeset
637 This function is obsolete and has no effect. */)
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
638 (char_table, ch, value)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
639 Lisp_Object char_table, ch, value;
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 return Qnil;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
642 }
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 /* 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
645 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
646
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
647 int
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
648 char_table_translate (table, ch)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
649 Lisp_Object table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
650 int ch;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
651 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
652 Lisp_Object value;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
653 value = Faref (table, make_number (ch));
89570
c92884b9ca4a (char_table_translate): Use CHARACTERP, not INETEGERP.
Kenichi Handa <handa@m17n.org>
parents: 89484
diff changeset
654 if (! CHARACTERP (value))
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
655 return ch;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
656 return XINT (value);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
657 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
658
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
659 static Lisp_Object
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
660 optimize_sub_char_table (table)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
661 Lisp_Object table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
662 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
663 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
664 int depth = XINT (tbl->depth);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
665 Lisp_Object elt, this;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
666 int i;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
667
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
668 elt = XSUB_CHAR_TABLE (table)->contents[0];
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
669 if (SUB_CHAR_TABLE_P (elt))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
670 elt = XSUB_CHAR_TABLE (table)->contents[0] = optimize_sub_char_table (elt);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
671 if (SUB_CHAR_TABLE_P (elt))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
672 return table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
673 for (i = 1; i < chartab_size[depth]; i++)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
674 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
675 this = XSUB_CHAR_TABLE (table)->contents[i];
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
676 if (SUB_CHAR_TABLE_P (this))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
677 this = XSUB_CHAR_TABLE (table)->contents[i]
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
678 = optimize_sub_char_table (this);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
679 if (SUB_CHAR_TABLE_P (this)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
680 || NILP (Fequal (this, elt)))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
681 break;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
682 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
683
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
684 return (i < chartab_size[depth] ? table : elt);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
685 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
686
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
687 DEFUN ("optimize-char-table", Foptimize_char_table, Soptimize_char_table,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
688 1, 1, 0,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
689 doc: /* Optimize CHAR-TABLE. */)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
690 (char_table)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
691 Lisp_Object char_table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
692 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
693 Lisp_Object elt;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
694 int i;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
695
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
696 CHECK_CHAR_TABLE (char_table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
697
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
698 for (i = 0; i < chartab_size[0]; i++)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
699 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
700 elt = XCHAR_TABLE (char_table)->contents[i];
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
701 if (SUB_CHAR_TABLE_P (elt))
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
702 XCHAR_TABLE (char_table)->contents[i] = optimize_sub_char_table (elt);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
703 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
704 return Qnil;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
705 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
706
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
707
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
708 static Lisp_Object
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
709 map_sub_char_table (c_function, function, table, arg, val, range,
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
710 default_val, parent)
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
711 void (*c_function) P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
712 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
713 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
714 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
715 int depth = XINT (tbl->depth);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
716 int i, c;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
717
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
718 for (i = 0, c = XINT (tbl->min_char); i < chartab_size[depth];
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
719 i++, c += chartab_chars[depth])
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
720 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
721 Lisp_Object this;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
722
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
723 this = tbl->contents[i];
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
724 if (SUB_CHAR_TABLE_P (this))
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
725 val = map_sub_char_table (c_function, function, this, arg, val, range,
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
726 default_val, parent);
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
727 else
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
728 {
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
729 if (NILP (this))
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
730 this = default_val;
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
731 if (NILP (this) && ! NILP (parent))
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
732 this = CHAR_TABLE_REF (parent, c);
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
733 if (NILP (Fequal (val, this)))
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
734 {
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
735 if (! NILP (val))
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
736 {
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
737 XSETCDR (range, make_number (c - 1));
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
738 if (depth == 3
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
739 && EQ (XCAR (range), XCDR (range)))
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
740 {
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
741 if (c_function)
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
742 (*c_function) (arg, XCAR (range), val);
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
743 else
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
744 call2 (function, XCAR (range), val);
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
745 }
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
746 else
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
747 {
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
748 if (c_function)
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
749 (*c_function) (arg, range, val);
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
750 else
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
751 call2 (function, range, val);
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
752 }
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
753 }
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
754 val = this;
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
755 XSETCAR (range, make_number (c));
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
756 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
757 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
758 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
759 return val;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
760 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
761
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
762
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
763 /* 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
764 character or group of characters that share a value.
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
765
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
766 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
767
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
768 void
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
769 map_char_table (c_function, function, table, arg)
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
770 void (*c_function) P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
771 Lisp_Object function, table, arg;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
772 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
773 Lisp_Object range, val;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
774 int c, i;
90047
20480108ff4e (map_char_table): GCPRO table and arg.
Andreas Schwab <schwab@suse.de>
parents: 89911
diff changeset
775 struct gcpro gcpro1, gcpro2, gcpro3;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
776
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
777 range = Fcons (make_number (0), Qnil);
90047
20480108ff4e (map_char_table): GCPRO table and arg.
Andreas Schwab <schwab@suse.de>
parents: 89911
diff changeset
778 GCPRO3 (table, arg, range);
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
779 val = XCHAR_TABLE (table)->ascii;
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
780 if (SUB_CHAR_TABLE_P (val))
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
781 val = XSUB_CHAR_TABLE (val)->contents[0];
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
782
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
783 for (i = 0, c = 0; i < chartab_size[0]; i++, c += chartab_chars[0])
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
784 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
785 Lisp_Object this;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
786
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
787 this = XCHAR_TABLE (table)->contents[i];
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
788 if (SUB_CHAR_TABLE_P (this))
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
789 val = map_sub_char_table (c_function, function, this, arg, val, range,
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
790 XCHAR_TABLE (table)->defalt,
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
791 XCHAR_TABLE (table)->parent);
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
792 else
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
793 {
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
794 if (NILP (this))
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
795 this = XCHAR_TABLE (table)->defalt;
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
796 if (NILP (this) && ! NILP (XCHAR_TABLE (table)->parent))
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
797 this = CHAR_TABLE_REF (XCHAR_TABLE (table)->parent, c);
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
798 if (NILP (Fequal (val, this)))
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
799 {
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
800 if (! NILP (val))
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
801 {
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
802 XSETCDR (range, make_number (c - 1));
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
803 if (c_function)
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
804 (*c_function) (arg, range, val);
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
805 else
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
806 call2 (function, range, val);
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
807 }
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
808 val = this;
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
809 XSETCAR (range, make_number (c));
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
810 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
811 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
812 }
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
813
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
814 if (! NILP (val))
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
815 {
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
816 XSETCDR (range, make_number (c - 1));
89424
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
817 if (c_function)
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
818 (*c_function) (arg, range, val);
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
819 else
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
820 call2 (function, range, val);
7020f4f73751 (map_sub_char_table): New argument DEFAULT_VAL.
Kenichi Handa <handa@m17n.org>
parents: 89334
diff changeset
821 }
89484
5c41371d228b (map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents: 89483
diff changeset
822
5c41371d228b (map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents: 89483
diff changeset
823 UNGCPRO;
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
824 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
825
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
826 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
827 2, 2, 0,
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
828 doc: /*
89425
32e34aaffbe3 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89424
diff changeset
829 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
830 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
831 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
832 range of characters that have the same value. */)
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
833 (function, char_table)
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
834 Lisp_Object function, char_table;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
835 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
836 CHECK_CHAR_TABLE (char_table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
837
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
838 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
839 return Qnil;
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
840 }
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
841
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
842
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
843 static void
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
844 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
845 charset, from, to)
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
846 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
847 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
848 struct charset *charset;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
849 unsigned from, to;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
850 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
851 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
852 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
853 int c, i;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
854
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
855 if (depth < 3)
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
856 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
857 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
858 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
859 Lisp_Object this;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
860
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
861 this = tbl->contents[i];
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
862 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
863 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
864 range, charset, from, to);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
865 else
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
866 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
867 if (! NILP (XCAR (range)))
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
868 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
869 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
870 if (c_function)
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
871 (*c_function) (arg, range);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
872 else
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
873 call2 (function, range, arg);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
874 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
875 XSETCAR (range, Qnil);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
876 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
877 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
878 else
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
879 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
880 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
881 Lisp_Object this;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
882 unsigned code;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
883
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
884 this = tbl->contents[i];
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
885 if (NILP (this)
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
886 || (charset
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
887 && (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
888 (code < from || code > to))))
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
889 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
890 if (! NILP (XCAR (range)))
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
891 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
892 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
893 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
894 (*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
895 else
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
896 call2 (function, range, arg);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
897 XSETCAR (range, Qnil);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
898 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
899 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
900 else
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
901 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
902 if (NILP (XCAR (range)))
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
903 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
904 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
905 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
906 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
907
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
908
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
909 void
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
910 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
911 charset, from, to)
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
912 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
913 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
914 struct charset *charset;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
915 unsigned from, to;
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 Lisp_Object range;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
918 int c, i;
89484
5c41371d228b (map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents: 89483
diff changeset
919 struct gcpro gcpro1;
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
920
89483
2f877ed80fa6 *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 89425
diff changeset
921 range = Fcons (Qnil, Qnil);
89484
5c41371d228b (map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents: 89483
diff changeset
922 GCPRO1 (range);
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
923
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
924 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
925 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
926 Lisp_Object this;
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
927
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
928 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
929 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
930 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
931 range, charset, from, to);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
932 else
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
933 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
934 if (! NILP (XCAR (range)))
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
935 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
936 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
937 if (c_function)
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
938 (*c_function) (arg, range);
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 call2 (function, range, arg);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
941 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
942 XSETCAR (range, Qnil);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
943 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
944 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
945 if (! NILP (XCAR (range)))
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
946 {
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
947 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
948 if (c_function)
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
949 (*c_function) (arg, range);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
950 else
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
951 call2 (function, range, arg);
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
952 }
89484
5c41371d228b (map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents: 89483
diff changeset
953
5c41371d228b (map_char_table): Protect `range' from GC.
Andreas Schwab <schwab@suse.de>
parents: 89483
diff changeset
954 UNGCPRO;
88746
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
955 }
388c82972bb9 (sub_char_table_ref_and_range): New arg defalt. Fix
Kenichi Handa <handa@m17n.org>
parents: 88429
diff changeset
956
88358
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
957
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
958 void
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
959 syms_of_chartab ()
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
960 {
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
961 defsubr (&Smake_char_table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
962 defsubr (&Schar_table_parent);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
963 defsubr (&Schar_table_subtype);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
964 defsubr (&Sset_char_table_parent);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
965 defsubr (&Schar_table_extra_slot);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
966 defsubr (&Sset_char_table_extra_slot);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
967 defsubr (&Schar_table_range);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
968 defsubr (&Sset_char_table_range);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
969 defsubr (&Sset_char_table_default);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
970 defsubr (&Soptimize_char_table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
971 defsubr (&Smap_char_table);
5f98d0806407 New file that implements char table.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
972 }
89911
cce857c68ba2 Add arch taglines
Miles Bader <miles@gnu.org>
parents: 89909
diff changeset
973
cce857c68ba2 Add arch taglines
Miles Bader <miles@gnu.org>
parents: 89909
diff changeset
974 /* arch-tag: 18b5b560-7ab5-4108-b09e-d5dd65dc6fda
cce857c68ba2 Add arch taglines
Miles Bader <miles@gnu.org>
parents: 89909
diff changeset
975 (do not change this comment) */