- /* strout is safe for output to a frame (echo area) or to print_buffer. */
- strout (SDATA (string),
- chars, SBYTES (string),
- printcharfun, STRING_MULTIBYTE (string));
+ if (EQ (printcharfun, Qt))
+ {
+ /* Output to echo area. */
+ int nbytes = SBYTES (string);
+ char *buffer;
+
+ /* Copy the string contents so that relocation of STRING by
+ GC does not cause trouble. */
+ USE_SAFE_ALLOCA;
+
+ SAFE_ALLOCA (buffer, char *, nbytes);
+ bcopy (SDATA (string), buffer, nbytes);
+
+ strout (buffer, chars, SBYTES (string),
+ printcharfun, STRING_MULTIBYTE (string));
+
+ SAFE_FREE ();
+ }
+ else
+ /* No need to copy, since output to print_buffer can't GC. */
+ strout (SDATA (string),
+ chars, SBYTES (string),
+ printcharfun, STRING_MULTIBYTE (string));