From: Richard M. Stallman Date: Wed, 13 Sep 2006 15:16:12 +0000 (+0000) Subject: (print_string): When printcharfun is t, X-Git-Tag: emacs-pretest-22.0.90~586 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=efb15f96f524ea117b7451bf1c099773b1d5e766;p=emacs.git (print_string): When printcharfun is t, copy string contents and call strout on the copy. --- diff --git a/src/ChangeLog b/src/ChangeLog index 8cafaa59e32..f2125895c2c 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,13 @@ +2006-09-13 Richard Stallman + + * print.c (print_string): When printcharfun is t, + copy string contents and call strout on the copy. + + * keyboard.c (read_char): If end_time specified, don't put the + event into this_command_keys. + (read_key_sequence): If Voverriding_terminal_local_map is specified, + don't check Voverriding_local_map at all. + 2006-09-12 Stefan Monnier * textprop.c (Fnext_property_change, Fnext_single_property_change) diff --git a/src/print.c b/src/print.c index 13354763f90..57f83cae696 100644 --- a/src/print.c +++ b/src/print.c @@ -364,7 +364,10 @@ printchar (ch, fun) print_buffer. PRINTCHARFUN t means output to the echo area or to stdout if non-interactive. If neither nil nor t, call Lisp function PRINTCHARFUN for each character printed. MULTIBYTE - non-zero means PTR contains multibyte characters. */ + non-zero means PTR contains multibyte characters. + + In the case where PRINTCHARFUN is nil, it is safe for PTR to point + to data in a Lisp string. Otherwise that is not safe. */ static void strout (ptr, size, size_byte, printcharfun, multibyte) @@ -497,10 +500,29 @@ print_string (string, printcharfun) else chars = SBYTES (string); - /* 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)); } else {