Mercurial > emacs
changeset 23425:3ae4cc2b716c
(Faset): If ARRAY is a multibyte string, pay attention to
byte-combining situation.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Mon, 12 Oct 1998 12:00:44 +0000 |
parents | 982f97638a8e |
children | 088cb2a804c7 |
files | src/data.c |
diffstat | 1 files changed, 16 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/data.c Mon Oct 12 12:00:44 1998 +0000 +++ b/src/data.c Mon Oct 12 12:00:44 1998 +0000 @@ -1853,7 +1853,8 @@ 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 @@ 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 {