Commit 6fec5601 authored by Richard M. Stallman's avatar Richard M. Stallman
Browse files

When printing into a buffer, generate all the text

first, then insert it all at once.
(print_buffer): New variable.
(print_buffer_size, print_buffer_pos): New variables.
(PRINTPREPARE): Allocate print_buffer.
(PRINTFINISH): Free print_buffer after inserting its contents.
(printchar, strout): Output into print_buffer.
(print_string): If printcharfun is nil, use strout.
parent 3b979258
...@@ -50,6 +50,15 @@ int print_depth; ...@@ -50,6 +50,15 @@ int print_depth;
#define PRINT_CIRCLE 200 #define PRINT_CIRCLE 200
Lisp_Object being_printed[PRINT_CIRCLE]; Lisp_Object being_printed[PRINT_CIRCLE];
/* When printing into a buffer, first we put the text in this
block, then insert it all at once. */
char *print_buffer;
/* Size allocated in print_buffer. */
int print_buffer_size;
/* Size used in print_buffer. */
int print_buffer_pos;
/* Maximum length of list to print in full; noninteger means /* Maximum length of list to print in full; noninteger means
effectively infinity */ effectively infinity */
...@@ -158,9 +167,20 @@ glyph_to_str_cpy (glyphs, str) ...@@ -158,9 +167,20 @@ glyph_to_str_cpy (glyphs, str)
old_point = point; \ old_point = point; \
SET_PT (marker_position (printcharfun)); \ SET_PT (marker_position (printcharfun)); \
start_point = point; \ start_point = point; \
printcharfun = Qnil;} printcharfun = Qnil;} \
if (NILP (printcharfun)) \
{ \
print_buffer_pos = 0; \
print_buffer_size = 1000; \
print_buffer = (char *) xmalloc (print_buffer_size); \
} \
else \
print_buffer = 0;
#define PRINTFINISH \ #define PRINTFINISH \
if (NILP (printcharfun)) \
insert (print_buffer, print_buffer_pos); \
if (print_buffer) free (print_buffer); \
if (MARKERP (original)) \ if (MARKERP (original)) \
Fset_marker (original, make_number (point), Qnil); \ Fset_marker (original, make_number (point), Qnil); \
if (old_point >= 0) \ if (old_point >= 0) \
...@@ -189,7 +209,10 @@ printchar (ch, fun) ...@@ -189,7 +209,10 @@ printchar (ch, fun)
if (EQ (fun, Qnil)) if (EQ (fun, Qnil))
{ {
QUIT; QUIT;
insert (&ch, 1); if (print_buffer_pos == print_buffer_size)
print_buffer = (char *) xrealloc (print_buffer,
print_buffer_size *= 2);
print_buffer[print_buffer_pos++] = ch;
return; return;
} }
...@@ -239,10 +262,21 @@ strout (ptr, size, printcharfun) ...@@ -239,10 +262,21 @@ strout (ptr, size, printcharfun)
if (EQ (printcharfun, Qnil)) if (EQ (printcharfun, Qnil))
{ {
insert (ptr, size >= 0 ? size : strlen (ptr)); if (size < 0)
size = strlen (ptr);
if (print_buffer_pos + size > print_buffer_size)
{
print_buffer_size = print_buffer_size * 2 + size;
print_buffer = (char *) xrealloc (print_buffer,
print_buffer_size);
}
bcopy (ptr, print_buffer + print_buffer_pos, size);
print_buffer_pos += size;
#ifdef MAX_PRINT_CHARS #ifdef MAX_PRINT_CHARS
if (max_print) if (max_print)
print_chars += size >= 0 ? size : strlen(ptr); print_chars += size;
#endif /* MAX_PRINT_CHARS */ #endif /* MAX_PRINT_CHARS */
return; return;
} }
...@@ -301,17 +335,9 @@ print_string (string, printcharfun) ...@@ -301,17 +335,9 @@ print_string (string, printcharfun)
Lisp_Object string; Lisp_Object string;
Lisp_Object printcharfun; Lisp_Object printcharfun;
{ {
if (EQ (printcharfun, Qt)) if (EQ (printcharfun, Qt) || NILP (printcharfun))
/* strout is safe for output to a frame (echo area). */ /* strout is safe for output to a frame (echo area) or to print_buffer. */
strout (XSTRING (string)->data, XSTRING (string)->size, printcharfun); strout (XSTRING (string)->data, XSTRING (string)->size, printcharfun);
else if (EQ (printcharfun, Qnil))
{
#ifdef MAX_PRINT_CHARS
if (max_print)
print_chars += XSTRING (string)->size;
#endif /* MAX_PRINT_CHARS */
insert_from_string (string, 0, XSTRING (string)->size, 1);
}
else else
{ {
/* Otherwise, fetch the string address for each character. */ /* Otherwise, fetch the string address for each character. */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment