(concat): Pay attention to multibyte characters when
authorKenichi Handa <handa@m17n.org>
Wed, 18 Jun 1997 13:09:05 +0000 (13:09 +0000)
committerKenichi Handa <handa@m17n.org>
Wed, 18 Jun 1997 13:09:05 +0000 (13:09 +0000)
TARGET_TYPE is Lisp_String.

src/fns.c

index 24c7371..d8f51af 100644 (file)
--- 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;
              }
            }
        }