From: Kenichi Handa Date: Wed, 18 Jun 1997 13:09:05 +0000 (+0000) Subject: (concat): Pay attention to multibyte characters when X-Git-Tag: emacs-20.1~1635 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=5b6dddaac2774bfa81e6d07328205c264ffcc22c;p=emacs.git (concat): Pay attention to multibyte characters when TARGET_TYPE is Lisp_String. --- diff --git a/src/fns.c b/src/fns.c index 24c737141cc..d8f51afbde0 100644 --- a/src/fns.c +++ b/src/fns.c @@ -406,7 +406,23 @@ concat (nargs, args, target_type, last_special) { 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 @@ concat (nargs, args, target_type, last_special) 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; } } }