Mercurial > emacs
changeset 16512:59835b743b93
(PRINTDECLARE): Declare specpdl_count and free_print_buffer.
(PRINTPREPARE): If print_buffer is nonzero,
save its contents in a string using record_unwind_protect.
(PRINTFINISH): Restore old print_buffer contents.
Free it only if this PRINTPREPARE malloc'd it.
(print): Don't call PRINTFULLP after all.
(print_unwind): New function.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Mon, 04 Nov 1996 05:31:25 +0000 |
parents | f81633edcbf5 |
children | ecf0700e9550 |
files | src/print.c |
diffstat | 1 files changed, 31 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/print.c Sun Nov 03 20:38:56 1996 +0000 +++ b/src/print.c Mon Nov 04 05:31:25 1996 +0000 @@ -169,42 +169,55 @@ #define PRINTDECLARE \ struct buffer *old = current_buffer; \ int old_point = -1, start_point; \ + int specpdl_count = specpdl_ptr - specpdl; \ + int free_print_buffer = 0; \ Lisp_Object original #define PRINTPREPARE \ original = printcharfun; \ if (NILP (printcharfun)) printcharfun = Qt; \ if (BUFFERP (printcharfun)) \ - { if (XBUFFER (printcharfun) != current_buffer) \ + { \ + if (XBUFFER (printcharfun) != current_buffer) \ Fset_buffer (printcharfun); \ - printcharfun = Qnil;} \ + printcharfun = Qnil; \ + } \ if (MARKERP (printcharfun)) \ - { if (!(XMARKER (original)->buffer)) \ + { \ + if (!(XMARKER (original)->buffer)) \ error ("Marker does not point anywhere"); \ if (XMARKER (original)->buffer != current_buffer) \ set_buffer_internal (XMARKER (original)->buffer); \ old_point = PT; \ SET_PT (marker_position (printcharfun)); \ start_point = PT; \ - printcharfun = Qnil;} \ + printcharfun = Qnil; \ + } \ if (NILP (printcharfun)) \ { \ + if (print_buffer != 0) \ + record_unwind_protect (print_unwind, \ + make_string (print_buffer, \ + print_buffer_pos)); \ + else \ + { \ + print_buffer_size = 1000; \ + print_buffer = (char *) xmalloc (print_buffer_size); \ + free_print_buffer = 0; \ + } \ print_buffer_pos = 0; \ - print_buffer_size = 1000; \ - print_buffer = (char *) xmalloc (print_buffer_size); \ } \ - else \ - print_buffer = 0; \ printed_gensyms = Qnil #define PRINTFINISH \ if (NILP (printcharfun)) \ insert (print_buffer, print_buffer_pos); \ - if (print_buffer) \ + if (free_print_buffer) \ { \ free (print_buffer); \ print_buffer = 0; \ } \ + unbind_to (specpdl_count, Qnil); \ if (MARKERP (original)) \ Fset_marker (original, make_number (PT), Qnil); \ if (old_point >= 0) \ @@ -223,6 +236,15 @@ (EQ (printcharfun, Qt) && !noninteractive \ && printbufidx >= FRAME_WIDTH (XFRAME (WINDOW_FRAME (XWINDOW (minibuf_window))))) +/* This is used to restore the saved contents of print_buffer + when there is a recursive call to print. */ +static Lisp_Object +print_unwind (saved_text) + Lisp_Object saved_text; +{ + bcopy (XSTRING (saved_text)->data, print_buffer, XSTRING (saved_text)->size); +} + /* Index of first unused element of FRAME_MESSAGE_BUF (mini_frame). */ static int printbufidx; @@ -856,8 +878,6 @@ char buf[30]; QUIT; - if (PRINTFULLP ()) - return; #if 1 /* I'm not sure this is really worth doing. */ /* Detect circularities and truncate them.