From dbda4aad5605d7b984de04c89bd3a7024eb9a4a8 Mon Sep 17 00:00:00 2001 From: Kenichi Handa Date: Mon, 12 Oct 1998 12:00:44 +0000 Subject: [PATCH] (Faset): If ARRAY is a multibyte string, pay attention to byte-combining situation. --- src/data.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/data.c b/src/data.c index f704c8fa049..da9d86f81bc 100644 --- a/src/data.c +++ b/src/data.c @@ -1853,7 +1853,8 @@ IDX starts at 0.") else if (STRING_MULTIBYTE (array)) { int c, idxval_byte, new_len, actual_len; - unsigned char *p, *str; + unsigned char *p, workbuf[4], *str; + int recount = 0; if (idxval < 0 || idxval >= XSTRING (array)->size) args_out_of_range (array, idx); @@ -1864,13 +1865,22 @@ IDX starts at 0.") actual_len = MULTIBYTE_FORM_LENGTH (p, STRING_BYTES (XSTRING (array)) - idxval_byte); CHECK_NUMBER (newelt, 2); - new_len = CHAR_BYTES (XINT (newelt)); + new_len = CHAR_STRING (XINT (newelt), workbuf, str); if (actual_len != new_len) error ("Attempt to change byte length of a string"); - - CHAR_STRING (XINT (newelt), p, str); - if (p != str) - bcopy (str, p, actual_len); + if (!CHAR_HEAD_P (*str) + || !CHAR_HEAD_P (XSTRING (array)->data[idxval_byte + actual_len])) + /* We may have to combine bytes. */ + recount = 1; + while (new_len--) + *p++ = *str++; + if (recount) + { + XSTRING (array)->size = + chars_in_text (XSTRING (array)->data, + STRING_BYTES (XSTRING (array))); + clear_string_char_byte_cache (); + } } else {