This source file includes following definitions.
- DEFUN
- check_case_table
- DEFUN
- DEFUN
- DEFUN
- DEFUN
- set_case_table
- set_canon
- set_identity
- shuffle
- init_casetab_once
- syms_of_casetab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include <config.h>
22
23 #include "lisp.h"
24 #include "buffer.h"
25
26 Lisp_Object Vascii_downcase_table;
27 static Lisp_Object Vascii_upcase_table;
28 Lisp_Object Vascii_canon_table;
29 static Lisp_Object Vascii_eqv_table;
30
31 static void set_canon (Lisp_Object case_table, Lisp_Object range, Lisp_Object elt);
32 static void set_identity (Lisp_Object table, Lisp_Object c, Lisp_Object elt);
33 static void shuffle (Lisp_Object table, Lisp_Object c, Lisp_Object elt);
34
35 DEFUN ("case-table-p", Fcase_table_p, Scase_table_p, 1, 1, 0,
36 doc:
37 )
38 (Lisp_Object object)
39 {
40 Lisp_Object up, canon, eqv;
41
42 if (! CHAR_TABLE_P (object))
43 return Qnil;
44 if (! EQ (XCHAR_TABLE (object)->purpose, Qcase_table))
45 return Qnil;
46
47 up = XCHAR_TABLE (object)->extras[0];
48 canon = XCHAR_TABLE (object)->extras[1];
49 eqv = XCHAR_TABLE (object)->extras[2];
50
51 return ((NILP (up) || CHAR_TABLE_P (up))
52 && ((NILP (canon) && NILP (eqv))
53 || (CHAR_TABLE_P (canon)
54 && (NILP (eqv) || CHAR_TABLE_P (eqv))))
55 ? Qt : Qnil);
56 }
57
58 static Lisp_Object
59 check_case_table (Lisp_Object obj)
60 {
61 CHECK_TYPE (!NILP (Fcase_table_p (obj)), Qcase_table_p, obj);
62 return (obj);
63 }
64
65 DEFUN ("current-case-table", Fcurrent_case_table, Scurrent_case_table, 0, 0, 0,
66 doc: )
67 (void)
68 {
69 return BVAR (current_buffer, downcase_table);
70 }
71
72 DEFUN ("standard-case-table", Fstandard_case_table, Sstandard_case_table, 0, 0, 0,
73 doc:
74 )
75 (void)
76 {
77 return Vascii_downcase_table;
78 }
79
80 static Lisp_Object set_case_table (Lisp_Object, bool);
81
82 DEFUN ("set-case-table", Fset_case_table, Sset_case_table, 1, 1, 0,
83 doc:
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 )
99 (Lisp_Object table)
100 {
101 return set_case_table (table, 0);
102 }
103
104 DEFUN ("set-standard-case-table", Fset_standard_case_table,
105 Sset_standard_case_table, 1, 1, 0,
106 doc:
107 )
108 (Lisp_Object table)
109 {
110 return set_case_table (table, 1);
111 }
112
113 static Lisp_Object
114 set_case_table (Lisp_Object table, bool standard)
115 {
116 Lisp_Object up, canon, eqv;
117
118 check_case_table (table);
119
120 up = XCHAR_TABLE (table)->extras[0];
121 canon = XCHAR_TABLE (table)->extras[1];
122 eqv = XCHAR_TABLE (table)->extras[2];
123
124 if (NILP (up))
125 {
126 up = Fmake_char_table (Qcase_table, Qnil);
127 map_char_table (set_identity, Qnil, table, up);
128 map_char_table (shuffle, Qnil, table, up);
129 set_char_table_extras (table, 0, up);
130 }
131
132 if (NILP (canon))
133 {
134 canon = Fmake_char_table (Qcase_table, Qnil);
135 set_char_table_extras (table, 1, canon);
136 map_char_table (set_canon, Qnil, table, table);
137 }
138
139 if (NILP (eqv))
140 {
141 eqv = Fmake_char_table (Qcase_table, Qnil);
142 map_char_table (set_identity, Qnil, canon, eqv);
143 map_char_table (shuffle, Qnil, canon, eqv);
144 set_char_table_extras (table, 2, eqv);
145 }
146
147
148
149 set_char_table_extras (canon, 2, eqv);
150
151 if (standard)
152 {
153 Vascii_downcase_table = table;
154 Vascii_upcase_table = up;
155 Vascii_canon_table = canon;
156 Vascii_eqv_table = eqv;
157 }
158 else
159 {
160 bset_downcase_table (current_buffer, table);
161 bset_upcase_table (current_buffer, up);
162 bset_case_canon_table (current_buffer, canon);
163 bset_case_eqv_table (current_buffer, eqv);
164 }
165
166 return table;
167 }
168
169
170
171
172
173
174
175
176 static void
177 set_canon (Lisp_Object case_table, Lisp_Object range, Lisp_Object elt)
178 {
179 Lisp_Object up = XCHAR_TABLE (case_table)->extras[0];
180 Lisp_Object canon = XCHAR_TABLE (case_table)->extras[1];
181
182 if (FIXNATP (elt))
183 Fset_char_table_range (canon, range, Faref (case_table, Faref (up, elt)));
184 }
185
186
187
188
189
190
191 static void
192 set_identity (Lisp_Object table, Lisp_Object c, Lisp_Object elt)
193 {
194 if (FIXNATP (elt))
195 {
196 int from, to;
197
198 if (CONSP (c))
199 {
200 from = XFIXNUM (XCAR (c));
201 to = XFIXNUM (XCDR (c));
202 }
203 else
204 from = to = XFIXNUM (c);
205
206 to++;
207 for (; from < to; from++)
208 CHAR_TABLE_SET (table, from, make_fixnum (from));
209 }
210 }
211
212
213
214
215
216
217 static void
218 shuffle (Lisp_Object table, Lisp_Object c, Lisp_Object elt)
219 {
220 if (FIXNATP (elt))
221 {
222 int from, to;
223
224 if (CONSP (c))
225 {
226 from = XFIXNUM (XCAR (c));
227 to = XFIXNUM (XCDR (c));
228 }
229 else
230 from = to = XFIXNUM (c);
231
232 to++;
233 for (; from < to; from++)
234 {
235 Lisp_Object tem = Faref (table, elt);
236 Faset (table, elt, make_fixnum (from));
237 Faset (table, make_fixnum (from), tem);
238 }
239 }
240 }
241
242 void
243 init_casetab_once (void)
244 {
245 register int i;
246 Lisp_Object down, up, eqv;
247
248 DEFSYM (Qcase_table, "case-table");
249 Fput (Qcase_table, Qchar_table_extra_slots, make_fixnum (3));
250
251 down = Fmake_char_table (Qcase_table, Qnil);
252 Vascii_downcase_table = down;
253 set_char_table_purpose (down, Qcase_table);
254
255 for (i = 0; i < 128; i++)
256 {
257 int c = (i >= 'A' && i <= 'Z') ? i + ('a' - 'A') : i;
258 CHAR_TABLE_SET (down, i, make_fixnum (c));
259 }
260
261 set_char_table_extras (down, 1, Fcopy_sequence (down));
262
263 up = Fmake_char_table (Qcase_table, Qnil);
264 set_char_table_extras (down, 0, up);
265
266 for (i = 0; i < 128; i++)
267 {
268 int c = (i >= 'a' && i <= 'z') ? i + ('A' - 'a') : i;
269 CHAR_TABLE_SET (up, i, make_fixnum (c));
270 }
271
272 eqv = Fmake_char_table (Qcase_table, Qnil);
273
274 for (i = 0; i < 128; i++)
275 {
276 int c = ((i >= 'A' && i <= 'Z') ? i + ('a' - 'A')
277 : ((i >= 'a' && i <= 'z') ? i + ('A' - 'a')
278 : i));
279 CHAR_TABLE_SET (eqv, i, make_fixnum (c));
280 }
281
282 set_char_table_extras (down, 2, eqv);
283
284
285 set_case_table (down, 1);
286 }
287
288 void
289 syms_of_casetab (void)
290 {
291 DEFSYM (Qcase_table_p, "case-table-p");
292
293 staticpro (&Vascii_canon_table);
294 staticpro (&Vascii_downcase_table);
295 staticpro (&Vascii_eqv_table);
296 staticpro (&Vascii_upcase_table);
297
298 defsubr (&Scase_table_p);
299 defsubr (&Scurrent_case_table);
300 defsubr (&Sstandard_case_table);
301 defsubr (&Sset_case_table);
302 defsubr (&Sset_standard_case_table);
303 }