aboutsummaryrefslogtreecommitdiffstats
path: root/src/keymap.c
diff options
context:
space:
mode:
authorRichard M. Stallman1998-01-09 23:16:01 +0000
committerRichard M. Stallman1998-01-09 23:16:01 +0000
commitf3ba54094e9f22ff95216f8aa0b528125591ea52 (patch)
tree49a450966812ad4297f476b5189c1bf9cd1fbd8e /src/keymap.c
parent301738ed7bd6cc3337bbd749f55542ff1ded5095 (diff)
downloademacs-f3ba54094e9f22ff95216f8aa0b528125591ea52.tar.gz
emacs-f3ba54094e9f22ff95216f8aa0b528125591ea52.zip
(describe_vector): Unconditionally handle multibyte chars.
(describe_vector): Pass new args to insert_from_string. (Ftext_char_description): Use make_multibyte_string. (Fkey_binding): Scan PREFIX a char at a time. (Fkey_description): Scan KEYS by chars.
Diffstat (limited to 'src/keymap.c')
-rw-r--r--src/keymap.c40
1 files changed, 25 insertions, 15 deletions
diff --git a/src/keymap.c b/src/keymap.c
index 4137de08a57..5f24f1b750f 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -1398,16 +1398,20 @@ then the value includes only maps for prefixes that start with PREFIX.")
1398 we don't have to deal with the possibility of a string. */ 1398 we don't have to deal with the possibility of a string. */
1399 if (STRINGP (prefix)) 1399 if (STRINGP (prefix))
1400 { 1400 {
1401 int i; 1401 int i, i_byte, c;
1402 Lisp_Object copy; 1402 Lisp_Object copy;
1403 1403
1404 copy = Fmake_vector (make_number (XSTRING (prefix)->size), Qnil); 1404 copy = Fmake_vector (make_number (XSTRING (prefix)->size), Qnil);
1405 for (i = 0; i < XSTRING (prefix)->size; i++) 1405 for (i = 0, i_byte; i < XSTRING (prefix)->size;)
1406 { 1406 {
1407 int c = XSTRING (prefix)->data[i]; 1407 int i_before = i;
1408 if (STRING_MULTIBYTE (prefix))
1409 FETCH_STRING_CHAR_ADVANCE (c, prefix, i, i_byte);
1410 else
1411 c = XSTRING (prefix)->data[i++];
1408 if (c & 0200) 1412 if (c & 0200)
1409 c ^= 0200 | meta_modifier; 1413 c ^= 0200 | meta_modifier;
1410 XVECTOR (copy)->contents[i] = make_number (c); 1414 XVECTOR (copy)->contents[i_before] = make_number (c);
1411 } 1415 }
1412 prefix = copy; 1416 prefix = copy;
1413 } 1417 }
@@ -1622,7 +1626,7 @@ spaces are put between sequence elements, etc.")
1622 Lisp_Object keys; 1626 Lisp_Object keys;
1623{ 1627{
1624 int len; 1628 int len;
1625 int i; 1629 int i, i_byte;
1626 Lisp_Object sep; 1630 Lisp_Object sep;
1627 Lisp_Object *args; 1631 Lisp_Object *args;
1628 1632
@@ -1630,14 +1634,21 @@ spaces are put between sequence elements, etc.")
1630 { 1634 {
1631 Lisp_Object vector; 1635 Lisp_Object vector;
1632 vector = Fmake_vector (Flength (keys), Qnil); 1636 vector = Fmake_vector (Flength (keys), Qnil);
1633 for (i = 0; i < XSTRING (keys)->size; i++) 1637 for (i = 0; i < XSTRING (keys)->size; )
1634 { 1638 {
1635 if (XSTRING (keys)->data[i] & 0x80) 1639 int c;
1636 XSETFASTINT (XVECTOR (vector)->contents[i], 1640 int i_before;
1637 meta_modifier | (XSTRING (keys)->data[i] & ~0x80)); 1641
1642 if (STRING_MULTIBYTE (keys))
1643 FETCH_STRING_CHAR_ADVANCE (c, keys, i, i_byte);
1638 else 1644 else
1645 c = XSTRING (keys)->data[i++];
1646
1647 if (c & 0x80)
1639 XSETFASTINT (XVECTOR (vector)->contents[i], 1648 XSETFASTINT (XVECTOR (vector)->contents[i],
1640 XSTRING (keys)->data[i]); 1649 meta_modifier | (c & ~0x80));
1650 else
1651 XSETFASTINT (XVECTOR (vector)->contents[i_before], c);
1641 } 1652 }
1642 keys = vector; 1653 keys = vector;
1643 } 1654 }
@@ -1839,7 +1850,7 @@ Control characters turn into \"^char\", etc.")
1839 unsigned char *str; 1850 unsigned char *str;
1840 int len = non_ascii_char_to_string (XFASTINT (character), tem, &str); 1851 int len = non_ascii_char_to_string (XFASTINT (character), tem, &str);
1841 1852
1842 return make_string (str, len); 1853 return make_multibyte_string (str, 1, len);
1843 } 1854 }
1844 1855
1845 *push_text_char_description (XINT (character) & 0377, tem) = 0; 1856 *push_text_char_description (XINT (character) & 0377, tem) = 0;
@@ -2756,8 +2767,6 @@ describe_vector (vector, elt_prefix, elt_describer,
2756 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; 2767 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
2757 /* Range of elements to be handled. */ 2768 /* Range of elements to be handled. */
2758 int from, to; 2769 int from, to;
2759 /* Flag to tell if we should handle multibyte characters. */
2760 int multibyte = !NILP (current_buffer->enable_multibyte_characters);
2761 /* A flag to tell if a leaf in this level of char-table is not a 2770 /* A flag to tell if a leaf in this level of char-table is not a
2762 generic character (i.e. a complete multibyte character). */ 2771 generic character (i.e. a complete multibyte character). */
2763 int complete_char; 2772 int complete_char;
@@ -2932,7 +2941,8 @@ describe_vector (vector, elt_prefix, elt_describer,
2932 insert_string ("<"); 2941 insert_string ("<");
2933 tem2 = CHARSET_TABLE_INFO (i - 128, CHARSET_SHORT_NAME_IDX); 2942 tem2 = CHARSET_TABLE_INFO (i - 128, CHARSET_SHORT_NAME_IDX);
2934 if (STRINGP (tem2)) 2943 if (STRINGP (tem2))
2935 insert_from_string (tem2, 0 , XSTRING (tem2)->size, 0); 2944 insert_from_string (tem2, 0, 0, XSTRING (tem2)->size,
2945 XSTRING (tem2)->size_byte, 0);
2936 else 2946 else
2937 insert ("?", 1); 2947 insert ("?", 1);
2938 insert (">", 1); 2948 insert (">", 1);
@@ -2946,7 +2956,7 @@ describe_vector (vector, elt_prefix, elt_describer,
2946 /* If we find a sub char-table within a char-table, 2956 /* If we find a sub char-table within a char-table,
2947 scan it recursively; it defines the details for 2957 scan it recursively; it defines the details for
2948 a character set or a portion of a character set. */ 2958 a character set or a portion of a character set. */
2949 if (multibyte && CHAR_TABLE_P (vector) && SUB_CHAR_TABLE_P (definition)) 2959 if (CHAR_TABLE_P (vector) && SUB_CHAR_TABLE_P (definition))
2950 { 2960 {
2951 insert ("\n", 1); 2961 insert ("\n", 1);
2952 describe_vector (definition, elt_prefix, elt_describer, 2962 describe_vector (definition, elt_prefix, elt_describer,