diff options
| author | Kenichi Handa | 2000-03-21 00:37:25 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2000-03-21 00:37:25 +0000 |
| commit | 52ef6c896ed8c785d21148b1ba58f5a3c058b3ec (patch) | |
| tree | de215632040cf37d6cd2b55b553b49f3f04b7a4e /src | |
| parent | b3091a238849daf332191a3f929143260f085a44 (diff) | |
| download | emacs-52ef6c896ed8c785d21148b1ba58f5a3c058b3ec.tar.gz emacs-52ef6c896ed8c785d21148b1ba58f5a3c058b3ec.zip | |
(optimize_sub_char_table): New function.
(Foptimize_char_table): New function.
(syms_of_fns): Defsubr Soptimize_char_table.
Diffstat (limited to 'src')
| -rw-r--r-- | src/fns.c | 50 |
1 files changed, 50 insertions, 0 deletions
| @@ -2262,6 +2262,55 @@ char_table_translate (table, ch) | |||
| 2262 | return ch; | 2262 | return ch; |
| 2263 | return XINT (value); | 2263 | return XINT (value); |
| 2264 | } | 2264 | } |
| 2265 | |||
| 2266 | static void | ||
| 2267 | optimize_sub_char_table (table, chars) | ||
| 2268 | Lisp_Object *table; | ||
| 2269 | int chars; | ||
| 2270 | { | ||
| 2271 | Lisp_Object elt; | ||
| 2272 | int from, to; | ||
| 2273 | |||
| 2274 | if (chars == 94) | ||
| 2275 | from = 33, to = 127; | ||
| 2276 | else | ||
| 2277 | from = 32, to = 128; | ||
| 2278 | |||
| 2279 | if (!SUB_CHAR_TABLE_P (*table)) | ||
| 2280 | return; | ||
| 2281 | elt = XCHAR_TABLE (*table)->contents[from++]; | ||
| 2282 | for (; from < to; from++) | ||
| 2283 | if (NILP (Fequal (elt, XCHAR_TABLE (*table)->contents[from]))) | ||
| 2284 | return; | ||
| 2285 | *table = elt; | ||
| 2286 | } | ||
| 2287 | |||
| 2288 | DEFUN ("optimize-char-table", Foptimize_char_table, Soptimize_char_table, | ||
| 2289 | 1, 1, 0, | ||
| 2290 | "Optimize char table TABLE.") | ||
| 2291 | (table) | ||
| 2292 | Lisp_Object table; | ||
| 2293 | { | ||
| 2294 | Lisp_Object elt; | ||
| 2295 | int dim; | ||
| 2296 | int i, j; | ||
| 2297 | |||
| 2298 | CHECK_CHAR_TABLE (table, 0); | ||
| 2299 | |||
| 2300 | for (i = CHAR_TABLE_SINGLE_BYTE_SLOTS; i < CHAR_TABLE_ORDINARY_SLOTS; i++) | ||
| 2301 | { | ||
| 2302 | elt = XCHAR_TABLE (table)->contents[i]; | ||
| 2303 | if (!SUB_CHAR_TABLE_P (elt)) | ||
| 2304 | continue; | ||
| 2305 | dim = CHARSET_DIMENSION (i); | ||
| 2306 | if (dim == 2) | ||
| 2307 | for (j = 32; j < SUB_CHAR_TABLE_ORDINARY_SLOTS; j++) | ||
| 2308 | optimize_sub_char_table (XCHAR_TABLE (elt)->contents + j, dim); | ||
| 2309 | optimize_sub_char_table (XCHAR_TABLE (table)->contents + i, dim); | ||
| 2310 | } | ||
| 2311 | return Qnil; | ||
| 2312 | } | ||
| 2313 | |||
| 2265 | 2314 | ||
| 2266 | /* Map C_FUNCTION or FUNCTION over SUBTABLE, calling it for each | 2315 | /* Map C_FUNCTION or FUNCTION over SUBTABLE, calling it for each |
| 2267 | character or group of characters that share a value. | 2316 | character or group of characters that share a value. |
| @@ -4774,6 +4823,7 @@ invoked by mouse clicks and mouse menu items."); | |||
| 4774 | defsubr (&Schar_table_range); | 4823 | defsubr (&Schar_table_range); |
| 4775 | defsubr (&Sset_char_table_range); | 4824 | defsubr (&Sset_char_table_range); |
| 4776 | defsubr (&Sset_char_table_default); | 4825 | defsubr (&Sset_char_table_default); |
| 4826 | defsubr (&Soptimize_char_table); | ||
| 4777 | defsubr (&Smap_char_table); | 4827 | defsubr (&Smap_char_table); |
| 4778 | defsubr (&Snconc); | 4828 | defsubr (&Snconc); |
| 4779 | defsubr (&Smapcar); | 4829 | defsubr (&Smapcar); |