+ int i, len;
+ int cvt;
+
+ /* Check the type of last-kbd-macro in case Lisp code changed it. */
+ if (!STRINGP (current_kboard->Vlast_kbd_macro)
+ && !VECTORP (current_kboard->Vlast_kbd_macro))
+ current_kboard->Vlast_kbd_macro
+ = wrong_type_argument (Qarrayp, current_kboard->Vlast_kbd_macro);
+
+ len = XINT (Flength (current_kboard->Vlast_kbd_macro));
+
+ /* Copy last-kbd-macro into the buffer, in case the Lisp code
+ has put another macro there. */
+ if (current_kboard->kbd_macro_bufsize < len + 30)
+ {
+ current_kboard->kbd_macro_bufsize = len + 30;
+ current_kboard->kbd_macro_buffer
+ = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer,
+ (len + 30) * sizeof (Lisp_Object));
+ }
+
+ /* Must convert meta modifier when copying string to vector. */
+ cvt = STRINGP (current_kboard->Vlast_kbd_macro);
+ for (i = 0; i < len; i++)
+ {
+ Lisp_Object c;
+ c = Faref (current_kboard->Vlast_kbd_macro, make_number (i));
+ if (cvt && NATNUMP (c) && (XFASTINT (c) & 0x80))
+ XSETFASTINT (c, CHAR_META | (XFASTINT (c) & ~0x80));
+ current_kboard->kbd_macro_buffer[i] = c;
+ }
+
+ current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer + len;
+ current_kboard->kbd_macro_end = current_kboard->kbd_macro_ptr;
+
+ /* Re-execute the macro we are appending to,
+ for consistency of behavior. */
+ if (NILP (no_exec))
+ Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro,
+ make_number (1), Qnil);
+