/* Lisp object printing and output streams.
- Copyright (C) 1985, 86, 88, 93, 94, 95, 97, 98, 1999, 2000, 2001
+ Copyright (C) 1985, 86, 88, 93, 94, 95, 97, 98, 1999, 2000, 01, 2003
Free Software Foundation, Inc.
This file is part of GNU Emacs.
and must start with PRINTPREPARE, end with PRINTFINISH,
and use PRINTDECLARE to declare common variables.
Use PRINTCHAR to output one character,
- or call strout to output a block of characters. */
+ or call strout to output a block of characters. */
#define PRINTDECLARE \
struct buffer *old = current_buffer; \
int len = CHAR_STRING (ch, str);
QUIT;
-
+
if (NILP (fun))
{
if (print_buffer_pos_byte + len >= print_buffer_size)
{
int multibyte_p
= !NILP (current_buffer->enable_multibyte_characters);
-
+
setup_echo_area_for_printing (multibyte_p);
insert_char (ch);
message_dolog (str, len, 0, multibyte_p);
int i;
int multibyte_p
= !NILP (current_buffer->enable_multibyte_characters);
-
+
setup_echo_area_for_printing (multibyte_p);
message_dolog (ptr, size_byte, 0, multibyte_p);
-
+
if (size == size_byte)
{
for (i = 0; i < size; ++i)
insert_char (ch);
}
}
-
+
#ifdef MAX_PRINT_CHARS
if (max_print)
print_chars += size;
for (i = 0; i < size; i++)
PRINTCHAR (SREF (string, i));
else
- for (i = 0; i < size_byte; i++)
+ for (i = 0; i < size_byte; )
{
/* Here, we must convert each multi-byte form to the
corresponding character code before handing it to PRINTCHAR. */
Fset_buffer (Fget_buffer_create (build_string (bufname)));
Fkill_all_local_variables ();
+ delete_all_overlays (current_buffer);
current_buffer->directory = old->directory;
current_buffer->read_only = Qnil;
current_buffer->filename = Qnil;
current_buffer->undo_list = Qt;
- current_buffer->overlays_before = Qnil;
- current_buffer->overlays_after = Qnil;
+ eassert (current_buffer->overlays_before == NULL);
+ eassert (current_buffer->overlays_after == NULL);
current_buffer->enable_multibyte_characters
= buffer_defaults.enable_multibyte_characters;
Ferase_buffer ();
If variable `temp-buffer-show-function' is non-nil, call it at the end
to get the buffer displayed instead of just displaying the non-selected
-buffer and calling the hook. It gets one argument, the buffer to display.
+buffer and calling the hook. It gets one argument, the buffer to display.
usage: (with-output-to-temp-buffer BUFFNAME BODY ...) */)
(args)
(object, noescape)
Lisp_Object object, noescape;
{
- PRINTDECLARE;
Lisp_Object printcharfun;
- struct gcpro gcpro1, gcpro2;
- Lisp_Object tem;
+ /* struct gcpro gcpro1, gcpro2; */
+ Lisp_Object save_deactivate_mark;
+ int count = specpdl_ptr - specpdl;
+ struct buffer *previous;
- /* Save and restore this--we are altering a buffer
- but we don't want to deactivate the mark just for that.
- No need for specbind, since errors deactivate the mark. */
- tem = Vdeactivate_mark;
- GCPRO2 (object, tem);
+ specbind (Qinhibit_modification_hooks, Qt);
- printcharfun = Vprin1_to_string_buffer;
- PRINTPREPARE;
- print (object, printcharfun, NILP (noescape));
- /* Make Vprin1_to_string_buffer be the default buffer after PRINTFINSH */
- PRINTFINISH;
+ {
+ PRINTDECLARE;
+
+ /* Save and restore this--we are altering a buffer
+ but we don't want to deactivate the mark just for that.
+ No need for specbind, since errors deactivate the mark. */
+ save_deactivate_mark = Vdeactivate_mark;
+ /* GCPRO2 (object, save_deactivate_mark); */
+ abort_on_gc++;
+
+ printcharfun = Vprin1_to_string_buffer;
+ PRINTPREPARE;
+ print (object, printcharfun, NILP (noescape));
+ /* Make Vprin1_to_string_buffer be the default buffer after PRINTFINSH */
+ PRINTFINISH;
+ }
+
+ previous = current_buffer;
set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
object = Fbuffer_string ();
+ if (SBYTES (object) == SCHARS (object))
+ STRING_SET_UNIBYTE (object);
+ /* Note that this won't make prepare_to_modify_buffer call
+ ask-user-about-supersession-threat because this buffer
+ does not visit a file. */
Ferase_buffer ();
- set_buffer_internal (old);
+ set_buffer_internal (previous);
- Vdeactivate_mark = tem;
- UNGCPRO;
+ Vdeactivate_mark = save_deactivate_mark;
+ /* UNGCPRO; */
- return object;
+ abort_on_gc--;
+ return unbind_to (count, object);
}
DEFUN ("princ", Fprinc, Sprinc, 1, 2, 0,
else
Fprin1 (obj, stream);
}
-
+
UNGCPRO;
}
* largest float, printed in the biggest notation. This is undoubtedly
* 20d float_output_format, with the negative of the C-constant "HUGE"
* from <math.h>.
- *
+ *
* On the vax the worst case is -1e38 in 20d format which takes 61 bytes.
- *
+ *
* I assume that IEEE-754 format numbers can take 329 bytes for the worst
* case of -1e307 in 20d float_output_format. What is one to do (short of
* re-writing _doprnt to be more sane)?
{
unsigned char *cp;
int width;
-
+
/* Check for plus infinity in a way that won't lose
if there is no plus infinity. */
if (data == data / 2 && data > 1.0)
*buf++ = '-';
break;
}
-
+
strcpy (buf, "0.0e+NaN");
return;
}
else
{
PRINTCHAR ('(');
-
+
/* If the first element is a backquote form,
print it old-style so it won't be misunderstood. */
if (print_quoted && CONSP (XCAR (obj))
}
}
}
-
+
if (i++)
PRINTCHAR (' ');
-
+
if (print_length && i > print_length)
{
strout ("...", 3, 3, printcharfun, 0);
goto end_of_list;
}
-
+
print_object (XCAR (obj), printcharfun, escapeflag);
-
+
obj = XCDR (obj);
if (!(i & 1))
halftail = XCDR (halftail);
strout (" . ", 3, 3, printcharfun, 0);
print_object (obj, printcharfun, escapeflag);
}
-
+
end_of_list:
PRINTCHAR (')');
}
DEFVAR_BOOL ("print-escape-nonascii", &print_escape_nonascii,
doc: /* Non-nil means print unibyte non-ASCII chars in strings as \\OOO.
\(OOO is the octal representation of the character code.)
-Only single-byte characters are affected, and only in `prin1'. */);
+Only single-byte characters are affected, and only in `prin1'.
+When the output goes in a multibyte buffer, this feature is
+enabled regardless of the value of the variable. */);
print_escape_nonascii = 0;
DEFVAR_BOOL ("print-escape-multibyte", &print_escape_multibyte,
defsubr (&Swith_output_to_temp_buffer);
}
+
+/* arch-tag: bc797170-94ae-41de-86e3-75e20f8f7a39
+ (do not change this comment) */