Mercurial > emacs
changeset 18311:8b716cb12cdd
(concat): Pay attention to multibyte characters when
TARGET_TYPE is Lisp_String.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Wed, 18 Jun 1997 13:09:05 +0000 |
parents | a97ed8efcb6a |
children | 705da3ce58c0 |
files | src/fns.c |
diffstat | 1 files changed, 25 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/fns.c Wed Jun 18 13:09:00 1997 +0000 +++ b/src/fns.c Wed Jun 18 13:09:05 1997 +0000 @@ -406,7 +406,23 @@ { this = args[argnum]; len = Flength (this); - leni += XFASTINT (len); + if (VECTORP (this) && target_type == Lisp_String) + { + /* We must pay attention to a multibyte character which + takes more than one byte in string. */ + int i; + Lisp_Object ch; + + for (i = 0; i < XFASTINT (len); i++) + { + ch = XVECTOR (this)->contents[i]; + if (! INTEGERP (ch)) + wrong_type_argument (Qintegerp, ch); + leni += Fchar_bytes (ch); + } + } + else + leni += XFASTINT (len); } XSETFASTINT (len, leni); @@ -490,14 +506,19 @@ while (!INTEGERP (elt)) elt = wrong_type_argument (Qintegerp, elt); { + int c = XINT (elt); + unsigned char work[4], *str; + int i = CHAR_STRING (c, work, str); + #ifdef MASSC_REGISTER_BUG /* Even removing all "register"s doesn't disable this bug! Nothing simpler than this seems to work. */ - unsigned char *p = & XSTRING (val)->data[toindex++]; - *p = XINT (elt); + unsigned char *p = & XSTRING (val)->data[toindex]; + bcopy (str, p, i); #else - XSTRING (val)->data[toindex++] = XINT (elt); + bcopy (str, & XSTRING (val)->data[toindex], i); #endif + toindex += i; } } }