Mercurial > emacs
changeset 26839:97029667b1a9
Include composite.h.
(casify_object): Use MAX_MULTIBYTE_LENGTH to allocate memory for a
multibyte character. Adjusted for the change of CHAR_STRING.
(casify_region): Likewise. Call update_compositions.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Wed, 15 Dec 1999 00:02:33 +0000 |
parents | 27b6d3367b47 |
children | 141799992598 |
files | src/casefiddle.c |
diffstat | 1 files changed, 20 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/casefiddle.c Wed Dec 15 00:02:12 1999 +0000 +++ b/src/casefiddle.c Wed Dec 15 00:02:33 1999 +0000 @@ -25,6 +25,7 @@ #include "charset.h" #include "commands.h" #include "syntax.h" +#include "composite.h" enum case_action {CASE_UP, CASE_DOWN, CASE_CAPITALIZE, CASE_CAPITALIZE_UP}; @@ -102,9 +103,7 @@ character just encountered. */ int fromlen, tolen, j_byte = i; char *buf - = (char *) alloca ((len - i) * MAX_LENGTH_OF_MULTI_BYTE_FORM - + i); - unsigned char *str, workbuf[4]; + = (char *) alloca ((len - i) * MAX_MULTIBYTE_LENGTH + i); /* Copy data already handled. */ bcopy (XSTRING (obj)->data, buf, i); @@ -119,10 +118,8 @@ else if (!UPPERCASEP (c) && (!inword || flag != CASE_CAPITALIZE_UP)) c = UPCASE1 (c); - tolen = CHAR_STRING (c, workbuf, str); - bcopy (str, buf + j_byte, tolen); i += fromlen; - j_byte += tolen; + j_byte += CHAR_STRING (c, buf + j_byte); if ((int) flag >= (int) CASE_CAPITALIZE) inword = SYNTAX (c) == Sword; } @@ -195,6 +192,7 @@ register int multibyte = !NILP (current_buffer->enable_multibyte_characters); int start, end; int start_byte, end_byte; + int changed = 0; if (EQ (b, e)) /* Not modifying because nothing marked */ @@ -212,9 +210,10 @@ start_byte = CHAR_TO_BYTE (start); end_byte = CHAR_TO_BYTE (end); - for (i = start_byte; i < end_byte; i++) + for (i = start_byte; i < end_byte; i++, start++) { - c = FETCH_BYTE (i); + int c2; + c = c2 = FETCH_BYTE (i); if (multibyte && c >= 0x80) /* A multibyte character can't be handled in this simple loop. */ break; @@ -224,6 +223,8 @@ && (!inword || flag != CASE_CAPITALIZE_UP)) c = UPCASE1 (c); FETCH_BYTE (i) = c; + if (c != c2) + changed = 1; if ((int) flag >= (int) CASE_CAPITALIZE) inword = SYNTAX (c) == Sword; } @@ -248,13 +249,14 @@ if (c != c2) { int fromlen, tolen, j; - unsigned char workbuf[4], *str; + unsigned char str[MAX_MULTIBYTE_LENGTH]; + changed = 1; /* Handle the most likely case */ if (c < 0400 && c2 < 0400) FETCH_BYTE (i) = c2; - else if (fromlen = CHAR_STRING (c, workbuf, str), - tolen = CHAR_STRING (c2, workbuf, str), + else if (fromlen = CHAR_STRING (c, str), + tolen = CHAR_STRING (c2, str), fromlen == tolen) { for (j = 0; j < tolen; ++j) @@ -276,12 +278,17 @@ } if ((int) flag >= (int) CASE_CAPITALIZE) inword = SYNTAX (c2) == Sword; - INC_POS (i); + INC_BOTH (start, i); } TEMP_SET_PT_BOTH (opoint, opoint_byte); } - signal_after_change (start, end - start, end - start); + start = XFASTINT (b); + if (changed) + { + signal_after_change (start, end - start, end - start); + update_compositions (start, end, CHECK_ALL); + } } DEFUN ("upcase-region", Fupcase_region, Supcase_region, 2, 2, "r",