#include "charset.h"
#include "commands.h"
#include "syntax.h"
+#include "composite.h"
enum case_action {CASE_UP, CASE_DOWN, CASE_CAPITALIZE, CASE_CAPITALIZE_UP};
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);
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;
}
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 */
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;
&& (!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;
}
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)
}
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",