diff options
| author | Richard M. Stallman | 1998-01-09 23:16:01 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1998-01-09 23:16:01 +0000 |
| commit | f3ba54094e9f22ff95216f8aa0b528125591ea52 (patch) | |
| tree | 49a450966812ad4297f476b5189c1bf9cd1fbd8e /src/keymap.c | |
| parent | 301738ed7bd6cc3337bbd749f55542ff1ded5095 (diff) | |
| download | emacs-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.c | 40 |
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, |