aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenichi Handa2000-03-21 00:37:25 +0000
committerKenichi Handa2000-03-21 00:37:25 +0000
commit52ef6c896ed8c785d21148b1ba58f5a3c058b3ec (patch)
treede215632040cf37d6cd2b55b553b49f3f04b7a4e /src
parentb3091a238849daf332191a3f929143260f085a44 (diff)
downloademacs-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.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/fns.c b/src/fns.c
index ec4a549b7e7..852c821f1bb 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -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
2266static void
2267optimize_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
2288DEFUN ("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);