aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenichi Handa2003-05-06 23:24:36 +0000
committerKenichi Handa2003-05-06 23:24:36 +0000
commit2f76e15edacb544de71cab4b2c3ae14b90a4da90 (patch)
treeb9a005c0ef22938e7cee7ca4d5113e3074598f25 /src
parentfd12904bd6af753b311eb2b89bc13a7e20daf660 (diff)
downloademacs-2f76e15edacb544de71cab4b2c3ae14b90a4da90.tar.gz
emacs-2f76e15edacb544de71cab4b2c3ae14b90a4da90.zip
(map_sub_char_table): New argument DEFAULT_VAL.
(map_char_table): Don't inherit the value from the parent on initializing VAL. Adjusted for the above change.
Diffstat (limited to 'src')
-rw-r--r--src/chartab.c88
1 files changed, 56 insertions, 32 deletions
diff --git a/src/chartab.c b/src/chartab.c
index 2b4c37755fa..1aae0969e6c 100644
--- a/src/chartab.c
+++ b/src/chartab.c
@@ -707,9 +707,9 @@ DEFUN ("optimize-char-table", Foptimize_char_table, Soptimize_char_table,
707 707
708 708
709static Lisp_Object 709static Lisp_Object
710map_sub_char_table (c_function, function, table, arg, val, range) 710map_sub_char_table (c_function, function, table, arg, val, range, default_val)
711 void (*c_function) P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); 711 void (*c_function) P_ ((Lisp_Object, Lisp_Object, Lisp_Object));
712 Lisp_Object function, table, arg, val, range; 712 Lisp_Object function, table, arg, val, range, default_val;
713{ 713{
714 struct Lisp_Sub_Char_Table *tbl = XSUB_CHAR_TABLE (table); 714 struct Lisp_Sub_Char_Table *tbl = XSUB_CHAR_TABLE (table);
715 int depth = XINT (tbl->depth); 715 int depth = XINT (tbl->depth);
@@ -722,30 +722,36 @@ map_sub_char_table (c_function, function, table, arg, val, range)
722 722
723 this = tbl->contents[i]; 723 this = tbl->contents[i];
724 if (SUB_CHAR_TABLE_P (this)) 724 if (SUB_CHAR_TABLE_P (this))
725 val = map_sub_char_table (c_function, function, this, arg, val, range); 725 val = map_sub_char_table (c_function, function, this, arg, val, range,
726 else if (NILP (Fequal (val, this))) 726 default_val);
727 else
727 { 728 {
728 if (! NILP (val)) 729 if (NILP (this))
730 this = default_val;
731 if (NILP (Fequal (val, this)))
729 { 732 {
730 XCDR (range) = make_number (c - 1); 733 if (! NILP (val))
731 if (depth == 3
732 && EQ (XCAR (range), XCDR (range)))
733 {
734 if (c_function)
735 (*c_function) (arg, XCAR (range), val);
736 else
737 call2 (function, XCAR (range), val);
738 }
739 else
740 { 734 {
741 if (c_function) 735 XCDR (range) = make_number (c - 1);
742 (*c_function) (arg, range, val); 736 if (depth == 3
737 && EQ (XCAR (range), XCDR (range)))
738 {
739 if (c_function)
740 (*c_function) (arg, XCAR (range), val);
741 else
742 call2 (function, XCAR (range), val);
743 }
743 else 744 else
744 call2 (function, range, val); 745 {
746 if (c_function)
747 (*c_function) (arg, range, val);
748 else
749 call2 (function, range, val);
750 }
745 } 751 }
752 val = this;
753 XCAR (range) = make_number (c);
746 } 754 }
747 val = this;
748 XCAR (range) = make_number (c);
749 } 755 }
750 } 756 }
751 return val; 757 return val;
@@ -770,7 +776,9 @@ map_char_table (c_function, function, table, arg, depth, indices)
770 int c, i; 776 int c, i;
771 777
772 range = Fcons (make_number (0), Qnil); 778 range = Fcons (make_number (0), Qnil);
773 val = char_table_ref (table, 0); 779 val = XCHAR_TABLE (table)->ascii;
780 if (SUB_CHAR_TABLE_P (val))
781 val = XSUB_CHAR_TABLE (val)->contents[0];
774 782
775 for (i = 0, c = 0; i < chartab_size[0]; i++, c += chartab_chars[0]) 783 for (i = 0, c = 0; i < chartab_size[0]; i++, c += chartab_chars[0])
776 { 784 {
@@ -778,21 +786,36 @@ map_char_table (c_function, function, table, arg, depth, indices)
778 786
779 this = XCHAR_TABLE (table)->contents[i]; 787 this = XCHAR_TABLE (table)->contents[i];
780 if (SUB_CHAR_TABLE_P (this)) 788 if (SUB_CHAR_TABLE_P (this))
781 val = map_sub_char_table (c_function, function, this, arg, val, range); 789 val = map_sub_char_table (c_function, function, this, arg, val, range,
782 else if (NILP (Fequal (val, this))) 790 XCHAR_TABLE (table)->defalt);
791 else
783 { 792 {
784 if (! NILP (val)) 793 if (NILP (this))
794 this = XCHAR_TABLE (table)->defalt;
795 if (NILP (Fequal (val, this)))
785 { 796 {
786 XCDR (range) = make_number (c - 1); 797 if (! NILP (val))
787 if (c_function) 798 {
788 (*c_function) (arg, range, val); 799 XCDR (range) = make_number (c - 1);
789 else 800 if (c_function)
790 call2 (function, range, val); 801 (*c_function) (arg, range, val);
802 else
803 call2 (function, range, val);
804 }
805 val = this;
806 XCAR (range) = make_number (c);
791 } 807 }
792 val = this;
793 XCAR (range) = make_number (c);
794 } 808 }
795 } 809 }
810
811 if (! NILP (val))
812 {
813 XCDR (range) = make_number (c - 1);
814 if (c_function)
815 (*c_function) (arg, range, val);
816 else
817 call2 (function, range, val);
818 }
796} 819}
797 820
798DEFUN ("map-char-table", Fmap_char_table, Smap_char_table, 821DEFUN ("map-char-table", Fmap_char_table, Smap_char_table,
@@ -800,7 +823,8 @@ DEFUN ("map-char-table", Fmap_char_table, Smap_char_table,
800 doc: /* 823 doc: /*
801Call FUNCTION for each character in CHAR-TABLE. 824Call FUNCTION for each character in CHAR-TABLE.
802FUNCTION is called with two arguments--a key and a value. 825FUNCTION is called with two arguments--a key and a value.
803The key is always a possible IDX argument to `aref'. */) 826The key is a character code or a cons of character codes specifying a
827range of characters that have the same value. */)
804 (function, char_table) 828 (function, char_table)
805 Lisp_Object function, char_table; 829 Lisp_Object function, char_table;
806{ 830{