diff options
author | Richard M. Stallman <[email protected]> | 1996-11-04 05:31:25 +0000 |
---|---|---|
committer | Richard M. Stallman <[email protected]> | 1996-11-04 05:31:25 +0000 |
commit | 08e8d2975c72feecc748a62320efe215d6b42eaf (patch) | |
tree | dadd282a70548ceaa6d3d1a2d9af6c9aa8ab44d8 | |
parent | 984322b6ac429dcdccf0ba059de6c1f710d57b01 (diff) |
(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.
-rw-r--r-- | src/print.c | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/src/print.c b/src/print.c index 518f020576..5d87c1ad61 100644 --- a/src/print.c +++ b/src/print.c @@ -169,42 +169,55 @@ glyph_to_str_cpy (glyphs, str) #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 @@ glyph_to_str_cpy (glyphs, str) (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 @@ print (obj, printcharfun, escapeflag) char buf[30]; QUIT; - if (PRINTFULLP ()) - return; #if 1 /* I'm not sure this is really worth doing. */ /* Detect circularities and truncate them. |