diff options
| author | Kenichi Handa | 2006-07-20 12:09:16 +0000 |
|---|---|---|
| committer | Kenichi Handa | 2006-07-20 12:09:16 +0000 |
| commit | 0d64f689595195a896eb9fdb433ce9b337c14518 (patch) | |
| tree | 62791ea518b4add6a62f4b7dcb499fa5de395393 /src/casefiddle.c | |
| parent | 63db3c1b3ffa669435b10aa362115ef664990ab2 (diff) | |
| download | emacs-0d64f689595195a896eb9fdb433ce9b337c14518.tar.gz emacs-0d64f689595195a896eb9fdb433ce9b337c14518.zip | |
(casify_object): Sync with HEAD.
Diffstat (limited to 'src/casefiddle.c')
| -rw-r--r-- | src/casefiddle.c | 124 |
1 files changed, 61 insertions, 63 deletions
diff --git a/src/casefiddle.c b/src/casefiddle.c index ba9b3e3adf4..8eb3cc69fca 100644 --- a/src/casefiddle.c +++ b/src/casefiddle.c | |||
| @@ -45,83 +45,81 @@ casify_object (flag, obj) | |||
| 45 | if (NILP (XCHAR_TABLE (current_buffer->downcase_table)->extras[1])) | 45 | if (NILP (XCHAR_TABLE (current_buffer->downcase_table)->extras[1])) |
| 46 | Fset_case_table (current_buffer->downcase_table); | 46 | Fset_case_table (current_buffer->downcase_table); |
| 47 | 47 | ||
| 48 | while (1) | 48 | if (INTEGERP (obj)) |
| 49 | { | 49 | { |
| 50 | if (INTEGERP (obj)) | 50 | int flagbits = (CHAR_ALT | CHAR_SUPER | CHAR_HYPER |
| 51 | | CHAR_SHIFT | CHAR_CTL | CHAR_META); | ||
| 52 | int flags = XINT (obj) & flagbits; | ||
| 53 | int multibyte = ! NILP (current_buffer->enable_multibyte_characters); | ||
| 54 | |||
| 55 | /* If the character has higher bits set | ||
| 56 | above the flags, return it unchanged. | ||
| 57 | It is not a real character. */ | ||
| 58 | if ((unsigned) XFASTINT (obj) > (unsigned) flagbits) | ||
| 59 | return obj; | ||
| 60 | |||
| 61 | c1 = XFASTINT (obj) & ~flagbits; | ||
| 62 | if (! multibyte) | ||
| 63 | MAKE_CHAR_MULTIBYTE (c1); | ||
| 64 | c = DOWNCASE (c1); | ||
| 65 | if (inword) | ||
| 66 | XSETFASTINT (obj, c | flags); | ||
| 67 | else if (c == (XFASTINT (obj) & ~flagbits)) | ||
| 51 | { | 68 | { |
| 52 | int flagbits = (CHAR_ALT | CHAR_SUPER | CHAR_HYPER | 69 | if (! inword) |
| 53 | | CHAR_SHIFT | CHAR_CTL | CHAR_META); | 70 | c = UPCASE1 (c1); |
| 54 | int flags = XINT (obj) & flagbits; | ||
| 55 | int multibyte = ! NILP (current_buffer->enable_multibyte_characters); | ||
| 56 | |||
| 57 | /* If the character has higher bits set | ||
| 58 | above the flags, return it unchanged. | ||
| 59 | It is not a real character. */ | ||
| 60 | if ((unsigned) XFASTINT (obj) > (unsigned) flagbits) | ||
| 61 | return obj; | ||
| 62 | |||
| 63 | c1 = XFASTINT (obj) & ~flagbits; | ||
| 64 | if (! multibyte) | 71 | if (! multibyte) |
| 65 | MAKE_CHAR_MULTIBYTE (c1); | 72 | MAKE_CHAR_UNIBYTE (c); |
| 66 | c = DOWNCASE (c1); | 73 | XSETFASTINT (obj, c | flags); |
| 67 | if (inword) | ||
| 68 | XSETFASTINT (obj, c | flags); | ||
| 69 | else if (c == (XFASTINT (obj) & ~flagbits)) | ||
| 70 | { | ||
| 71 | if (! inword) | ||
| 72 | c = UPCASE1 (c1); | ||
| 73 | if (! multibyte) | ||
| 74 | MAKE_CHAR_UNIBYTE (c); | ||
| 75 | XSETFASTINT (obj, c | flags); | ||
| 76 | } | ||
| 77 | return obj; | ||
| 78 | } | 74 | } |
| 75 | return obj; | ||
| 76 | } | ||
| 79 | 77 | ||
| 80 | if (STRINGP (obj)) | 78 | if (STRINGP (obj)) |
| 81 | { | 79 | { |
| 82 | int multibyte = STRING_MULTIBYTE (obj); | 80 | int multibyte = STRING_MULTIBYTE (obj); |
| 83 | int i, i_byte, len; | 81 | int i, i_byte, len; |
| 84 | int size = SCHARS (obj); | 82 | int size = SCHARS (obj); |
| 85 | 83 | ||
| 86 | obj = Fcopy_sequence (obj); | 84 | obj = Fcopy_sequence (obj); |
| 87 | for (i = i_byte = 0; i < size; i++, i_byte += len) | 85 | for (i = i_byte = 0; i < size; i++, i_byte += len) |
| 86 | { | ||
| 87 | if (multibyte) | ||
| 88 | c = STRING_CHAR_AND_LENGTH (SDATA (obj) + i_byte, 0, len); | ||
| 89 | else | ||
| 88 | { | 90 | { |
| 89 | if (multibyte) | 91 | c = SREF (obj, i_byte); |
| 90 | c = STRING_CHAR_AND_LENGTH (SDATA (obj) + i_byte, 0, len); | 92 | len = 1; |
| 91 | else | 93 | MAKE_CHAR_MULTIBYTE (c); |
| 94 | } | ||
| 95 | c1 = c; | ||
| 96 | if (inword && flag != CASE_CAPITALIZE_UP) | ||
| 97 | c = DOWNCASE (c); | ||
| 98 | else if (!UPPERCASEP (c) | ||
| 99 | && (!inword || flag != CASE_CAPITALIZE_UP)) | ||
| 100 | c = UPCASE1 (c1); | ||
| 101 | if ((int) flag >= (int) CASE_CAPITALIZE) | ||
| 102 | inword = (SYNTAX (c) == Sword); | ||
| 103 | if (c != c1) | ||
| 104 | { | ||
| 105 | if (! multibyte) | ||
| 92 | { | 106 | { |
| 93 | c = SREF (obj, i_byte); | 107 | MAKE_CHAR_UNIBYTE (c); |
| 94 | len = 1; | 108 | SSET (obj, i_byte, c); |
| 95 | MAKE_CHAR_MULTIBYTE (c); | ||
| 96 | } | 109 | } |
| 97 | c1 = c; | 110 | else if (ASCII_CHAR_P (c1) && ASCII_CHAR_P (c)) |
| 98 | if (inword && flag != CASE_CAPITALIZE_UP) | 111 | SSET (obj, i_byte, c); |
| 99 | c = DOWNCASE (c); | 112 | else |
| 100 | else if (!UPPERCASEP (c) | ||
| 101 | && (!inword || flag != CASE_CAPITALIZE_UP)) | ||
| 102 | c = UPCASE1 (c1); | ||
| 103 | if ((int) flag >= (int) CASE_CAPITALIZE) | ||
| 104 | inword = (SYNTAX (c) == Sword); | ||
| 105 | if (c != c1) | ||
| 106 | { | 113 | { |
| 107 | if (! multibyte) | 114 | Faset (obj, make_number (i), make_number (c)); |
| 108 | { | 115 | i_byte += CHAR_BYTES (c) - len; |
| 109 | MAKE_CHAR_UNIBYTE (c); | ||
| 110 | SSET (obj, i_byte, c); | ||
| 111 | } | ||
| 112 | else if (ASCII_CHAR_P (c1) && ASCII_CHAR_P (c)) | ||
| 113 | SSET (obj, i_byte, c); | ||
| 114 | else | ||
| 115 | { | ||
| 116 | Faset (obj, make_number (i), make_number (c)); | ||
| 117 | i_byte += CHAR_BYTES (c) - len; | ||
| 118 | } | ||
| 119 | } | 116 | } |
| 120 | } | 117 | } |
| 121 | return obj; | ||
| 122 | } | 118 | } |
| 123 | obj = wrong_type_argument (Qchar_or_string_p, obj); | 119 | return obj; |
| 124 | } | 120 | } |
| 121 | |||
| 122 | wrong_type_argument (Qchar_or_string_p, obj); | ||
| 125 | } | 123 | } |
| 126 | 124 | ||
| 127 | DEFUN ("upcase", Fupcase, Supcase, 1, 1, 0, | 125 | DEFUN ("upcase", Fupcase, Supcase, 1, 1, 0, |