Add yank-handled-properties; use it for `font-lock-face' and `category'
[bpt/emacs.git] / src / print.c
CommitLineData
38010d50 1/* Lisp object printing and output streams.
95df8112 2
acaf905b 3Copyright (C) 1985-1986, 1988, 1993-1995, 1997-2012
95df8112 4 Free Software Foundation, Inc.
38010d50
JB
5
6This file is part of GNU Emacs.
7
9ec0b715 8GNU Emacs is free software: you can redistribute it and/or modify
38010d50 9it under the terms of the GNU General Public License as published by
9ec0b715
GM
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
38010d50
JB
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
9ec0b715 19along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
38010d50
JB
20
21
18160b98 22#include <config.h>
38010d50 23#include <stdio.h>
d7306fe6 24#include <setjmp.h>
38010d50 25#include "lisp.h"
8b4b4467 26#include "character.h"
e5560ff7 27#include "buffer.h"
71ea13cb 28#include "charset.h"
2538fae4 29#include "keyboard.h"
0137dbf7 30#include "frame.h"
38010d50
JB
31#include "window.h"
32#include "process.h"
33#include "dispextern.h"
34#include "termchar.h"
7651e1f5 35#include "intervals.h"
f9467be3 36#include "blockinput.h"
f76c8b1e 37#include "termhooks.h" /* For struct terminal. */
2a7b7982 38#include "font.h"
7651e1f5 39
29208e82 40Lisp_Object Qstandard_output;
38010d50 41
955cbe7b 42static Lisp_Object Qtemp_buffer_setup_hook;
d9c21094 43
2f100b5c 44/* These are used to print like we read. */
2f100b5c 45
955cbe7b 46static Lisp_Object Qfloat_output_format;
f356c3fb 47
f356c3fb 48#include <math.h>
f356c3fb 49#include <float.h>
fa2c4f56 50#include <ftoastr.h>
f356c3fb
PE
51
52/* Default to values appropriate for IEEE floating point. */
f356c3fb
PE
53#ifndef DBL_DIG
54#define DBL_DIG 15
55#endif
f356c3fb 56
38010d50 57/* Avoid actual stack overflow in print. */
a8b7caa3 58static ptrdiff_t print_depth;
38010d50 59
a22dec27 60/* Level of nesting inside outputting backquote in new style. */
a8b7caa3 61static ptrdiff_t new_backquote_output;
0330bb60 62
ec838c39
RS
63/* Detect most circularities to print finite output. */
64#define PRINT_CIRCLE 200
ad64fc97 65static Lisp_Object being_printed[PRINT_CIRCLE];
ec838c39 66
6fec5601
RS
67/* When printing into a buffer, first we put the text in this
68 block, then insert it all at once. */
ad64fc97 69static char *print_buffer;
6fec5601
RS
70
71/* Size allocated in print_buffer. */
d311d28c 72static ptrdiff_t print_buffer_size;
dc2a0b79 73/* Chars stored in print_buffer. */
d311d28c 74static ptrdiff_t print_buffer_pos;
dc2a0b79 75/* Bytes stored in print_buffer. */
d311d28c 76static ptrdiff_t print_buffer_pos_byte;
6fec5601 77
835d0be6 78Lisp_Object Qprint_escape_newlines;
955cbe7b 79static Lisp_Object Qprint_escape_multibyte, Qprint_escape_nonascii;
835d0be6 80
a65b85b5
SM
81/* Vprint_number_table is a table, that keeps objects that are going to
82 be printed, to allow use of #n= and #n# to express sharing.
83 For any given object, the table can give the following values:
84 t the object will be printed only once.
85 -N the object will be printed several times and will take number N.
86 N the object has been printed so we can refer to it as #N#.
87 print_number_index holds the largest N already used.
88 N has to be striclty larger than 0 since we need to distinguish -N. */
a8b7caa3 89static ptrdiff_t print_number_index;
ad64fc97 90static void print_interval (INTERVAL interval, Lisp_Object printcharfun);
38010d50 91
945b0111 92/* GDB resets this to zero on W32 to disable OutputDebugString calls. */
42c8bc9b 93int print_output_debug_flag EXTERNALLY_VISIBLE = 1;
945b0111 94
38010d50 95\f
4ae29f89 96/* Low level output routines for characters and strings. */
38010d50
JB
97
98/* Lisp functions to do output using a stream
081e0581
EN
99 must have the stream in a variable called printcharfun
100 and must start with PRINTPREPARE, end with PRINTFINISH,
101 and use PRINTDECLARE to declare common variables.
102 Use PRINTCHAR to output one character,
4ae29f89 103 or call strout to output a block of characters. */
0788646c
GM
104
105#define PRINTDECLARE \
106 struct buffer *old = current_buffer; \
d311d28c
PE
107 ptrdiff_t old_point = -1, start_point = -1; \
108 ptrdiff_t old_point_byte = -1, start_point_byte = -1; \
109 ptrdiff_t specpdl_count = SPECPDL_INDEX (); \
0788646c 110 int free_print_buffer = 0; \
4b4deea2 111 int multibyte = !NILP (BVAR (current_buffer, enable_multibyte_characters)); \
081e0581
EN
112 Lisp_Object original
113
0788646c
GM
114#define PRINTPREPARE \
115 original = printcharfun; \
116 if (NILP (printcharfun)) printcharfun = Qt; \
117 if (BUFFERP (printcharfun)) \
118 { \
119 if (XBUFFER (printcharfun) != current_buffer) \
120 Fset_buffer (printcharfun); \
121 printcharfun = Qnil; \
122 } \
123 if (MARKERP (printcharfun)) \
124 { \
d311d28c 125 ptrdiff_t marker_pos; \
cd3587c1 126 if (! XMARKER (printcharfun)->buffer) \
0788646c 127 error ("Marker does not point anywhere"); \
1cf21850
LK
128 if (XMARKER (printcharfun)->buffer != current_buffer) \
129 set_buffer_internal (XMARKER (printcharfun)->buffer); \
130 marker_pos = marker_position (printcharfun); \
131 if (marker_pos < BEGV || marker_pos > ZV) \
132 error ("Marker is outside the accessible part of the buffer"); \
0788646c
GM
133 old_point = PT; \
134 old_point_byte = PT_BYTE; \
1cf21850 135 SET_PT_BOTH (marker_pos, \
0788646c
GM
136 marker_byte_position (printcharfun)); \
137 start_point = PT; \
138 start_point_byte = PT_BYTE; \
139 printcharfun = Qnil; \
140 } \
141 if (NILP (printcharfun)) \
142 { \
143 Lisp_Object string; \
4b4deea2 144 if (NILP (BVAR (current_buffer, enable_multibyte_characters)) \
0788646c
GM
145 && ! print_escape_multibyte) \
146 specbind (Qprint_escape_multibyte, Qt); \
4b4deea2 147 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)) \
d39f07c2
RS
148 && ! print_escape_nonascii) \
149 specbind (Qprint_escape_nonascii, Qt); \
0788646c
GM
150 if (print_buffer != 0) \
151 { \
152 string = make_string_from_bytes (print_buffer, \
153 print_buffer_pos, \
154 print_buffer_pos_byte); \
155 record_unwind_protect (print_unwind, string); \
156 } \
157 else \
158 { \
d311d28c 159 int new_size = 1000; \
23f86fce 160 print_buffer = xmalloc (new_size); \
ff5844ad 161 print_buffer_size = new_size; \
0788646c
GM
162 free_print_buffer = 1; \
163 } \
164 print_buffer_pos = 0; \
165 print_buffer_pos_byte = 0; \
166 } \
5494b50f 167 if (EQ (printcharfun, Qt) && ! noninteractive) \
0f25ecc6 168 setup_echo_area_for_printing (multibyte);
38010d50 169
8a2ab0c6
RS
170#define PRINTFINISH \
171 if (NILP (printcharfun)) \
172 { \
173 if (print_buffer_pos != print_buffer_pos_byte \
4b4deea2 174 && NILP (BVAR (current_buffer, enable_multibyte_characters))) \
8a2ab0c6 175 { \
38182d90 176 unsigned char *temp = alloca (print_buffer_pos + 1); \
09125ef8
PE
177 copy_text ((unsigned char *) print_buffer, temp, \
178 print_buffer_pos_byte, 1, 0); \
b68864e5 179 insert_1_both ((char *) temp, print_buffer_pos, \
8a2ab0c6
RS
180 print_buffer_pos, 0, 1, 0); \
181 } \
182 else \
183 insert_1_both (print_buffer, print_buffer_pos, \
184 print_buffer_pos_byte, 0, 1, 0); \
570fab6c 185 signal_after_change (PT - print_buffer_pos, 0, print_buffer_pos);\
8a2ab0c6
RS
186 } \
187 if (free_print_buffer) \
188 { \
189 xfree (print_buffer); \
190 print_buffer = 0; \
191 } \
192 unbind_to (specpdl_count, Qnil); \
193 if (MARKERP (original)) \
194 set_marker_both (original, Qnil, PT, PT_BYTE); \
195 if (old_point >= 0) \
196 SET_PT_BOTH (old_point + (old_point >= start_point \
197 ? PT - start_point : 0), \
6ddd6eee 198 old_point_byte + (old_point_byte >= start_point_byte \
cd3587c1 199 ? PT_BYTE - start_point_byte : 0)); \
8a2ab0c6 200 if (old != current_buffer) \
0f25ecc6 201 set_buffer_internal (old);
38010d50
JB
202
203#define PRINTCHAR(ch) printchar (ch, printcharfun)
204
08e8d297
RS
205/* This is used to restore the saved contents of print_buffer
206 when there is a recursive call to print. */
0788646c 207
08e8d297 208static Lisp_Object
971de7fb 209print_unwind (Lisp_Object saved_text)
08e8d297 210{
72af86bd 211 memcpy (print_buffer, SDATA (saved_text), SCHARS (saved_text));
ee5263af 212 return Qnil;
08e8d297
RS
213}
214
0788646c
GM
215
216/* Print character CH using method FUN. FUN nil means print to
217 print_buffer. FUN t means print to echo area or stdout if
218 non-interactive. If FUN is neither nil nor t, call FUN with CH as
219 argument. */
38010d50
JB
220
221static void
971de7fb 222printchar (unsigned int ch, Lisp_Object fun)
38010d50 223{
0788646c
GM
224 if (!NILP (fun) && !EQ (fun, Qt))
225 call1 (fun, make_number (ch));
226 else
38010d50 227 {
19a86a03
KH
228 unsigned char str[MAX_MULTIBYTE_LENGTH];
229 int len = CHAR_STRING (ch, str);
230
09eddb56 231 QUIT;
177c0ea7 232
0788646c 233 if (NILP (fun))
9a4d01d8 234 {
d311d28c
PE
235 ptrdiff_t incr = len - (print_buffer_size - print_buffer_pos_byte);
236 if (0 < incr)
237 print_buffer =
238 xpalloc (print_buffer, &print_buffer_size, incr, -1, 1);
72af86bd 239 memcpy (print_buffer + print_buffer_pos_byte, str, len);
0788646c
GM
240 print_buffer_pos += 1;
241 print_buffer_pos_byte += len;
9a4d01d8 242 }
0788646c 243 else if (noninteractive)
1134b854 244 {
0788646c
GM
245 fwrite (str, 1, len, stdout);
246 noninteractive_need_newline = 1;
1134b854 247 }
0788646c 248 else
d366d2e4 249 {
0788646c 250 int multibyte_p
4b4deea2 251 = !NILP (BVAR (current_buffer, enable_multibyte_characters));
177c0ea7 252
eb7b678b 253 setup_echo_area_for_printing (multibyte_p);
0788646c 254 insert_char (ch);
09125ef8 255 message_dolog ((char *) str, len, 0, multibyte_p);
d366d2e4 256 }
38010d50 257 }
38010d50
JB
258}
259
0788646c
GM
260
261/* Output SIZE characters, SIZE_BYTE bytes from string PTR using
262 method PRINTCHARFUN. If SIZE < 0, use the string length of PTR for
263 both SIZE and SIZE_BYTE. PRINTCHARFUN nil means output to
264 print_buffer. PRINTCHARFUN t means output to the echo area or to
265 stdout if non-interactive. If neither nil nor t, call Lisp
266 function PRINTCHARFUN for each character printed. MULTIBYTE
efb15f96
RS
267 non-zero means PTR contains multibyte characters.
268
269 In the case where PRINTCHARFUN is nil, it is safe for PTR to point
270 to data in a Lisp string. Otherwise that is not safe. */
0788646c 271
38010d50 272static void
d311d28c 273strout (const char *ptr, ptrdiff_t size, ptrdiff_t size_byte,
1db5b1ad 274 Lisp_Object printcharfun)
38010d50 275{
087e3c46 276 if (size < 0)
dc2a0b79 277 size_byte = size = strlen (ptr);
087e3c46 278
0788646c 279 if (NILP (printcharfun))
38010d50 280 {
d311d28c
PE
281 ptrdiff_t incr = size_byte - (print_buffer_size - print_buffer_pos_byte);
282 if (0 < incr)
283 print_buffer = xpalloc (print_buffer, &print_buffer_size, incr, -1, 1);
72af86bd 284 memcpy (print_buffer + print_buffer_pos_byte, ptr, size_byte);
6fec5601 285 print_buffer_pos += size;
dc2a0b79 286 print_buffer_pos_byte += size_byte;
38010d50 287 }
7b0cb8a0 288 else if (noninteractive && EQ (printcharfun, Qt))
38010d50 289 {
0788646c
GM
290 fwrite (ptr, 1, size_byte, stdout);
291 noninteractive_need_newline = 1;
292 }
293 else if (EQ (printcharfun, Qt))
294 {
295 /* Output to echo area. We're trying to avoid a little overhead
296 here, that's the reason we don't call printchar to do the
297 job. */
298 int i;
299 int multibyte_p
4b4deea2 300 = !NILP (BVAR (current_buffer, enable_multibyte_characters));
177c0ea7 301
eb7b678b 302 setup_echo_area_for_printing (multibyte_p);
0788646c 303 message_dolog (ptr, size_byte, 0, multibyte_p);
177c0ea7 304
0788646c 305 if (size == size_byte)
38010d50 306 {
0788646c 307 for (i = 0; i < size; ++i)
bcdbfd36 308 insert_char ((unsigned char) *ptr++);
38010d50 309 }
0788646c 310 else
38010d50 311 {
0788646c
GM
312 int len;
313 for (i = 0; i < size_byte; i += len)
aec2b95b 314 {
09125ef8
PE
315 int ch = STRING_CHAR_AND_LENGTH ((const unsigned char *) ptr + i,
316 len);
0788646c 317 insert_char (ch);
aec2b95b 318 }
38010d50 319 }
0788646c
GM
320 }
321 else
322 {
323 /* PRINTCHARFUN is a Lisp function. */
d311d28c 324 ptrdiff_t i = 0;
38010d50 325
0788646c 326 if (size == size_byte)
4ad8bb20 327 {
0788646c 328 while (i < size_byte)
4ad8bb20 329 {
0788646c
GM
330 int ch = ptr[i++];
331 PRINTCHAR (ch);
4ad8bb20 332 }
4ad8bb20 333 }
0788646c 334 else
087e3c46 335 {
0788646c
GM
336 while (i < size_byte)
337 {
338 /* Here, we must convert each multi-byte form to the
339 corresponding character code before handing it to
340 PRINTCHAR. */
341 int len;
09125ef8
PE
342 int ch = STRING_CHAR_AND_LENGTH ((const unsigned char *) ptr + i,
343 len);
0788646c
GM
344 PRINTCHAR (ch);
345 i += len;
346 }
087e3c46 347 }
38010d50 348 }
38010d50
JB
349}
350
351/* Print the contents of a string STRING using PRINTCHARFUN.
ed2c35ef
RS
352 It isn't safe to use strout in many cases,
353 because printing one char can relocate. */
38010d50 354
dc2a0b79 355static void
971de7fb 356print_string (Lisp_Object string, Lisp_Object printcharfun)
38010d50 357{
6fec5601 358 if (EQ (printcharfun, Qt) || NILP (printcharfun))
375fcc09 359 {
d311d28c 360 ptrdiff_t chars;
375fcc09 361
8b4b4467
KH
362 if (print_escape_nonascii)
363 string = string_escape_byte8 (string);
364
375fcc09 365 if (STRING_MULTIBYTE (string))
d5db4077 366 chars = SCHARS (string);
8b4b4467
KH
367 else if (! print_escape_nonascii
368 && (EQ (printcharfun, Qt)
4b4deea2
TT
369 ? ! NILP (BVAR (&buffer_defaults, enable_multibyte_characters))
370 : ! NILP (BVAR (current_buffer, enable_multibyte_characters))))
a76ef35d
KH
371 {
372 /* If unibyte string STRING contains 8-bit codes, we must
373 convert STRING to a multibyte string containing the same
374 character codes. */
375 Lisp_Object newstr;
d311d28c 376 ptrdiff_t bytes;
a76ef35d 377
d5db4077 378 chars = SBYTES (string);
de883a70 379 bytes = count_size_as_multibyte (SDATA (string), chars);
a76ef35d
KH
380 if (chars < bytes)
381 {
382 newstr = make_uninit_multibyte_string (chars, bytes);
72af86bd 383 memcpy (SDATA (newstr), SDATA (string), chars);
d5db4077 384 str_to_multibyte (SDATA (newstr), bytes, chars);
a76ef35d
KH
385 string = newstr;
386 }
387 }
375fcc09 388 else
d5db4077 389 chars = SBYTES (string);
375fcc09 390
efb15f96
RS
391 if (EQ (printcharfun, Qt))
392 {
393 /* Output to echo area. */
d311d28c 394 ptrdiff_t nbytes = SBYTES (string);
efb15f96
RS
395
396 /* Copy the string contents so that relocation of STRING by
397 GC does not cause trouble. */
398 USE_SAFE_ALLOCA;
98c6f1e3 399 char *buffer = SAFE_ALLOCA (nbytes);
72af86bd 400 memcpy (buffer, SDATA (string), nbytes);
efb15f96 401
98c6f1e3 402 strout (buffer, chars, nbytes, printcharfun);
efb15f96
RS
403
404 SAFE_FREE ();
405 }
406 else
407 /* No need to copy, since output to print_buffer can't GC. */
1db5b1ad 408 strout (SSDATA (string), chars, SBYTES (string), printcharfun);
375fcc09 409 }
38010d50
JB
410 else
411 {
dc2a0b79
RS
412 /* Otherwise, string may be relocated by printing one char.
413 So re-fetch the string address for each character. */
d311d28c
PE
414 ptrdiff_t i;
415 ptrdiff_t size = SCHARS (string);
416 ptrdiff_t size_byte = SBYTES (string);
38010d50
JB
417 struct gcpro gcpro1;
418 GCPRO1 (string);
dc2a0b79
RS
419 if (size == size_byte)
420 for (i = 0; i < size; i++)
d5db4077 421 PRINTCHAR (SREF (string, i));
dc2a0b79 422 else
6b61353c 423 for (i = 0; i < size_byte; )
dc2a0b79
RS
424 {
425 /* Here, we must convert each multi-byte form to the
426 corresponding character code before handing it to PRINTCHAR. */
427 int len;
62a6e103 428 int ch = STRING_CHAR_AND_LENGTH (SDATA (string) + i, len);
dc2a0b79
RS
429 PRINTCHAR (ch);
430 i += len;
431 }
38010d50
JB
432 UNGCPRO;
433 }
434}
435\f
436DEFUN ("write-char", Fwrite_char, Swrite_char, 1, 2, 0,
8c1a1077
PJ
437 doc: /* Output character CHARACTER to stream PRINTCHARFUN.
438PRINTCHARFUN defaults to the value of `standard-output' (which see). */)
5842a27b 439 (Lisp_Object character, Lisp_Object printcharfun)
38010d50 440{
081e0581 441 PRINTDECLARE;
38010d50 442
10eebdbb 443 if (NILP (printcharfun))
38010d50 444 printcharfun = Vstandard_output;
b7826503 445 CHECK_NUMBER (character);
38010d50 446 PRINTPREPARE;
3738a371 447 PRINTCHAR (XINT (character));
38010d50 448 PRINTFINISH;
3738a371 449 return character;
38010d50
JB
450}
451
dc2a0b79
RS
452/* Used from outside of print.c to print a block of SIZE
453 single-byte chars at DATA on the default output stream.
38010d50
JB
454 Do not use this on the contents of a Lisp string. */
455
dc22f25e 456void
a8fe7202 457write_string (const char *data, int size)
38010d50 458{
081e0581 459 PRINTDECLARE;
38010d50 460 Lisp_Object printcharfun;
38010d50
JB
461
462 printcharfun = Vstandard_output;
463
464 PRINTPREPARE;
1db5b1ad 465 strout (data, size, size, printcharfun);
38010d50
JB
466 PRINTFINISH;
467}
468
2f7c71a1
AS
469/* Used to print a block of SIZE single-byte chars at DATA on a
470 specified stream PRINTCHARFUN.
38010d50
JB
471 Do not use this on the contents of a Lisp string. */
472
2f7c71a1 473static void
a8fe7202 474write_string_1 (const char *data, int size, Lisp_Object printcharfun)
38010d50 475{
081e0581 476 PRINTDECLARE;
38010d50
JB
477
478 PRINTPREPARE;
1db5b1ad 479 strout (data, size, size, printcharfun);
38010d50
JB
480 PRINTFINISH;
481}
482
483
38010d50 484void
971de7fb 485temp_output_buffer_setup (const char *bufname)
38010d50 486{
d311d28c 487 ptrdiff_t count = SPECPDL_INDEX ();
38010d50
JB
488 register struct buffer *old = current_buffer;
489 register Lisp_Object buf;
490
d9c21094
RS
491 record_unwind_protect (set_buffer_if_live, Fcurrent_buffer ());
492
38010d50
JB
493 Fset_buffer (Fget_buffer_create (build_string (bufname)));
494
9756ea0f 495 Fkill_all_local_variables ();
fd531951 496 delete_all_overlays (current_buffer);
4c31be61
DA
497 BSET (current_buffer, directory, BVAR (old, directory));
498 BSET (current_buffer, read_only, Qnil);
499 BSET (current_buffer, filename, Qnil);
500 BSET (current_buffer, undo_list, Qt);
fd318b54
DA
501 eassert (current_buffer->overlays_before == NULL);
502 eassert (current_buffer->overlays_after == NULL);
4c31be61 503 BSET (current_buffer, enable_multibyte_characters,
fd318b54 504 BVAR (&buffer_defaults, enable_multibyte_characters));
d28eab19
KH
505 specbind (Qinhibit_read_only, Qt);
506 specbind (Qinhibit_modification_hooks, Qt);
38010d50 507 Ferase_buffer ();
633307b5 508 XSETBUFFER (buf, current_buffer);
38010d50 509
98040cf1 510 Frun_hooks (1, &Qtemp_buffer_setup_hook);
d9c21094
RS
511
512 unbind_to (count, Qnil);
513
514 specbind (Qstandard_output, buf);
38010d50 515}
38010d50 516\f
971de7fb
DN
517static void print (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag);
518static void print_preprocess (Lisp_Object obj);
519static void print_preprocess_string (INTERVAL interval, Lisp_Object arg);
520static void print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag);
38010d50 521
a7ca3326 522DEFUN ("terpri", Fterpri, Sterpri, 0, 1, 0,
8c1a1077
PJ
523 doc: /* Output a newline to stream PRINTCHARFUN.
524If PRINTCHARFUN is omitted or nil, the value of `standard-output' is used. */)
5842a27b 525 (Lisp_Object printcharfun)
38010d50 526{
081e0581 527 PRINTDECLARE;
38010d50 528
10eebdbb 529 if (NILP (printcharfun))
38010d50
JB
530 printcharfun = Vstandard_output;
531 PRINTPREPARE;
532 PRINTCHAR ('\n');
533 PRINTFINISH;
534 return Qt;
535}
536
a7ca3326 537DEFUN ("prin1", Fprin1, Sprin1, 1, 2, 0,
8c1a1077
PJ
538 doc: /* Output the printed representation of OBJECT, any Lisp object.
539Quoting characters are printed when needed to make output that `read'
9474c847 540can handle, whenever this is possible. For complex objects, the behavior
7fab9223 541is controlled by `print-level' and `print-length', which see.
8c1a1077
PJ
542
543OBJECT is any of the Lisp data types: a number, a string, a symbol,
544a list, a buffer, a window, a frame, etc.
545
546A printed representation of an object is text which describes that object.
547
548Optional argument PRINTCHARFUN is the output stream, which can be one
549of these:
550
551 - a buffer, in which case output is inserted into that buffer at point;
552 - a marker, in which case output is inserted at marker's position;
553 - a function, in which case that function is called once for each
554 character of OBJECT's printed representation;
555 - a symbol, in which case that symbol's function definition is called; or
556 - t, in which case the output is displayed in the echo area.
557
558If PRINTCHARFUN is omitted, the value of `standard-output' (which see)
559is used instead. */)
5842a27b 560 (Lisp_Object object, Lisp_Object printcharfun)
38010d50 561{
081e0581 562 PRINTDECLARE;
38010d50 563
10eebdbb 564 if (NILP (printcharfun))
38010d50
JB
565 printcharfun = Vstandard_output;
566 PRINTPREPARE;
3738a371 567 print (object, printcharfun, 1);
38010d50 568 PRINTFINISH;
3738a371 569 return object;
38010d50
JB
570}
571
572/* a buffer which is used to hold output being built by prin1-to-string */
573Lisp_Object Vprin1_to_string_buffer;
574
a7ca3326 575DEFUN ("prin1-to-string", Fprin1_to_string, Sprin1_to_string, 1, 2, 0,
fd4d156b
RS
576 doc: /* Return a string containing the printed representation of OBJECT.
577OBJECT can be any Lisp object. This function outputs quoting characters
cf393f9b 578when necessary to make output that `read' can handle, whenever possible,
a2612656
EZ
579unless the optional second argument NOESCAPE is non-nil. For complex objects,
580the behavior is controlled by `print-level' and `print-length', which see.
8c1a1077
PJ
581
582OBJECT is any of the Lisp data types: a number, a string, a symbol,
583a list, a buffer, a window, a frame, etc.
584
585A printed representation of an object is text which describes that object. */)
5842a27b 586 (Lisp_Object object, Lisp_Object noescape)
38010d50 587{
081e0581 588 Lisp_Object printcharfun;
ca2de342
RS
589 /* struct gcpro gcpro1, gcpro2; */
590 Lisp_Object save_deactivate_mark;
d311d28c 591 ptrdiff_t count = SPECPDL_INDEX ();
6b61353c 592 struct buffer *previous;
ca2de342
RS
593
594 specbind (Qinhibit_modification_hooks, Qt);
2a42e8f6 595
6b61353c
KH
596 {
597 PRINTDECLARE;
598
599 /* Save and restore this--we are altering a buffer
600 but we don't want to deactivate the mark just for that.
601 No need for specbind, since errors deactivate the mark. */
602 save_deactivate_mark = Vdeactivate_mark;
603 /* GCPRO2 (object, save_deactivate_mark); */
604 abort_on_gc++;
605
606 printcharfun = Vprin1_to_string_buffer;
607 PRINTPREPARE;
608 print (object, printcharfun, NILP (noescape));
6196cffe 609 /* Make Vprin1_to_string_buffer be the default buffer after PRINTFINISH */
6b61353c
KH
610 PRINTFINISH;
611 }
38010d50 612
6b61353c 613 previous = current_buffer;
38010d50 614 set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
3738a371 615 object = Fbuffer_string ();
b51ee131
SM
616 if (SBYTES (object) == SCHARS (object))
617 STRING_SET_UNIBYTE (object);
38010d50 618
28b8f740 619 /* Note that this won't make prepare_to_modify_buffer call
6b61353c
KH
620 ask-user-about-supersession-threat because this buffer
621 does not visit a file. */
38010d50 622 Ferase_buffer ();
6b61353c 623 set_buffer_internal (previous);
2a42e8f6 624
ca2de342
RS
625 Vdeactivate_mark = save_deactivate_mark;
626 /* UNGCPRO; */
38010d50 627
ca2de342
RS
628 abort_on_gc--;
629 return unbind_to (count, object);
38010d50
JB
630}
631
ad64fc97 632DEFUN ("princ", Fprinc, Sprinc, 1, 2, 0,
8c1a1077
PJ
633 doc: /* Output the printed representation of OBJECT, any Lisp object.
634No quoting characters are used; no delimiters are printed around
635the contents of strings.
636
637OBJECT is any of the Lisp data types: a number, a string, a symbol,
638a list, a buffer, a window, a frame, etc.
639
640A printed representation of an object is text which describes that object.
641
642Optional argument PRINTCHARFUN is the output stream, which can be one
643of these:
644
645 - a buffer, in which case output is inserted into that buffer at point;
646 - a marker, in which case output is inserted at marker's position;
647 - a function, in which case that function is called once for each
648 character of OBJECT's printed representation;
649 - a symbol, in which case that symbol's function definition is called; or
650 - t, in which case the output is displayed in the echo area.
651
652If PRINTCHARFUN is omitted, the value of `standard-output' (which see)
653is used instead. */)
5842a27b 654 (Lisp_Object object, Lisp_Object printcharfun)
38010d50 655{
081e0581 656 PRINTDECLARE;
38010d50 657
10eebdbb 658 if (NILP (printcharfun))
38010d50
JB
659 printcharfun = Vstandard_output;
660 PRINTPREPARE;
3738a371 661 print (object, printcharfun, 0);
38010d50 662 PRINTFINISH;
3738a371 663 return object;
38010d50
JB
664}
665
a7ca3326 666DEFUN ("print", Fprint, Sprint, 1, 2, 0,
8c1a1077
PJ
667 doc: /* Output the printed representation of OBJECT, with newlines around it.
668Quoting characters are printed when needed to make output that `read'
9474c847 669can handle, whenever this is possible. For complex objects, the behavior
7fab9223 670is controlled by `print-level' and `print-length', which see.
8c1a1077
PJ
671
672OBJECT is any of the Lisp data types: a number, a string, a symbol,
673a list, a buffer, a window, a frame, etc.
674
675A printed representation of an object is text which describes that object.
676
677Optional argument PRINTCHARFUN is the output stream, which can be one
678of these:
679
680 - a buffer, in which case output is inserted into that buffer at point;
681 - a marker, in which case output is inserted at marker's position;
682 - a function, in which case that function is called once for each
683 character of OBJECT's printed representation;
684 - a symbol, in which case that symbol's function definition is called; or
685 - t, in which case the output is displayed in the echo area.
686
687If PRINTCHARFUN is omitted, the value of `standard-output' (which see)
688is used instead. */)
5842a27b 689 (Lisp_Object object, Lisp_Object printcharfun)
38010d50 690{
081e0581 691 PRINTDECLARE;
38010d50
JB
692 struct gcpro gcpro1;
693
10eebdbb 694 if (NILP (printcharfun))
38010d50 695 printcharfun = Vstandard_output;
3738a371 696 GCPRO1 (object);
38010d50 697 PRINTPREPARE;
38010d50 698 PRINTCHAR ('\n');
3738a371 699 print (object, printcharfun, 1);
38010d50
JB
700 PRINTCHAR ('\n');
701 PRINTFINISH;
38010d50 702 UNGCPRO;
3738a371 703 return object;
38010d50
JB
704}
705
706/* The subroutine object for external-debugging-output is kept here
707 for the convenience of the debugger. */
708Lisp_Object Qexternal_debugging_output;
709
4746118a 710DEFUN ("external-debugging-output", Fexternal_debugging_output, Sexternal_debugging_output, 1, 1, 0,
8c1a1077
PJ
711 doc: /* Write CHARACTER to stderr.
712You can call print while debugging emacs, and pass it this function
713to make it write to the debugging output. */)
5842a27b 714 (Lisp_Object character)
38010d50 715{
0fd11aa5
PE
716 CHECK_NUMBER (character);
717 putc (XINT (character) & 0xFF, stderr);
cd22039d
RS
718
719#ifdef WINDOWSNT
720 /* Send the output to a debugger (nothing happens if there isn't one). */
945b0111
EZ
721 if (print_output_debug_flag)
722 {
723 char buf[2] = {(char) XINT (character), '\0'};
724 OutputDebugString (buf);
725 }
cd22039d
RS
726#endif
727
38010d50
JB
728 return character;
729}
cf1bb91b 730
c33f8948
RS
731/* This function is never called. Its purpose is to prevent
732 print_output_debug_flag from being optimized away. */
733
c38bf546 734extern void debug_output_compilation_hack (int) EXTERNALLY_VISIBLE;
dae581bf 735void
971de7fb 736debug_output_compilation_hack (int x)
c33f8948
RS
737{
738 print_output_debug_flag = x;
739}
6b61353c 740
cd3587c1 741#if defined (GNU_LINUX)
6b61353c
KH
742
743/* This functionality is not vitally important in general, so we rely on
744 non-portable ability to use stderr as lvalue. */
745
746#define WITH_REDIRECT_DEBUGGING_OUTPUT 1
747
ad64fc97 748static FILE *initial_stderr_stream = NULL;
6b61353c
KH
749
750DEFUN ("redirect-debugging-output", Fredirect_debugging_output, Sredirect_debugging_output,
751 1, 2,
752 "FDebug output file: \nP",
753 doc: /* Redirect debugging output (stderr stream) to file FILE.
754If FILE is nil, reset target to the initial stderr stream.
755Optional arg APPEND non-nil (interactively, with prefix arg) means
28b8f740 756append to existing target file. */)
5842a27b 757 (Lisp_Object file, Lisp_Object append)
6b61353c
KH
758{
759 if (initial_stderr_stream != NULL)
f9467be3
YM
760 {
761 BLOCK_INPUT;
762 fclose (stderr);
763 UNBLOCK_INPUT;
764 }
6b61353c
KH
765 stderr = initial_stderr_stream;
766 initial_stderr_stream = NULL;
767
768 if (STRINGP (file))
769 {
770 file = Fexpand_file_name (file, Qnil);
771 initial_stderr_stream = stderr;
d4d7173a 772 stderr = fopen (SSDATA (file), NILP (append) ? "w" : "a");
6b61353c
KH
773 if (stderr == NULL)
774 {
775 stderr = initial_stderr_stream;
776 initial_stderr_stream = NULL;
777 report_file_error ("Cannot open debugging output stream",
778 Fcons (file, Qnil));
779 }
780 }
781 return Qnil;
782}
783#endif /* GNU_LINUX */
784
785
cf1bb91b
RS
786/* This is the interface for debugging printing. */
787
788void
971de7fb 789debug_print (Lisp_Object arg)
cf1bb91b
RS
790{
791 Fprin1 (arg, Qexternal_debugging_output);
3684eb78 792 fprintf (stderr, "\r\n");
cf1bb91b 793}
bd90dcd0 794
e3b27b31 795void safe_debug_print (Lisp_Object) EXTERNALLY_VISIBLE;
bd90dcd0 796void
971de7fb 797safe_debug_print (Lisp_Object arg)
bd90dcd0
KS
798{
799 int valid = valid_lisp_object_p (arg);
800
801 if (valid > 0)
802 debug_print (arg);
803 else
c2982e87 804 fprintf (stderr, "#<%s_LISP_OBJECT 0x%08"pI"x>\r\n",
bd90dcd0 805 !valid ? "INVALID" : "SOME",
c2982e87 806 XHASH (arg));
bd90dcd0
KS
807}
808
38010d50 809\f
a7ca3326 810DEFUN ("error-message-string", Ferror_message_string, Serror_message_string,
113620cc 811 1, 1, 0,
6b61353c
KH
812 doc: /* Convert an error value (ERROR-SYMBOL . DATA) to an error message.
813See Info anchor `(elisp)Definition of signal' for some details on how this
814error message is constructed. */)
5842a27b 815 (Lisp_Object obj)
113620cc
KH
816{
817 struct buffer *old = current_buffer;
63fbf4ff 818 Lisp_Object value;
113620cc
KH
819 struct gcpro gcpro1;
820
0872e11f
RS
821 /* If OBJ is (error STRING), just return STRING.
822 That is not only faster, it also avoids the need to allocate
823 space here when the error is due to memory full. */
94b342ce
KR
824 if (CONSP (obj) && EQ (XCAR (obj), Qerror)
825 && CONSP (XCDR (obj))
826 && STRINGP (XCAR (XCDR (obj)))
827 && NILP (XCDR (XCDR (obj))))
828 return XCAR (XCDR (obj));
0872e11f 829
240e806c 830 print_error_message (obj, Vprin1_to_string_buffer, 0, Qnil);
113620cc
KH
831
832 set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
833 value = Fbuffer_string ();
834
835 GCPRO1 (value);
836 Ferase_buffer ();
837 set_buffer_internal (old);
838 UNGCPRO;
839
840 return value;
841}
842
c02279de 843/* Print an error message for the error DATA onto Lisp output stream
7ab56fea
RS
844 STREAM (suitable for the print functions).
845 CONTEXT is a C string describing the context of the error.
846 CALLER is the Lisp function inside which the error was signaled. */
113620cc 847
dc22f25e 848void
a8fe7202
AS
849print_error_message (Lisp_Object data, Lisp_Object stream, const char *context,
850 Lisp_Object caller)
113620cc
KH
851{
852 Lisp_Object errname, errmsg, file_error, tail;
853 struct gcpro gcpro1;
113620cc 854
240e806c
RS
855 if (context != 0)
856 write_string_1 (context, -1, stream);
857
858 /* If we know from where the error was signaled, show it in
859 *Messages*. */
860 if (!NILP (caller) && SYMBOLP (caller))
861 {
11fb15d5 862 Lisp_Object cname = SYMBOL_NAME (caller);
98c6f1e3 863 ptrdiff_t cnamelen = SBYTES (cname);
d311d28c 864 USE_SAFE_ALLOCA;
98c6f1e3
PE
865 char *name = SAFE_ALLOCA (cnamelen);
866 memcpy (name, SDATA (cname), cnamelen);
867 message_dolog (name, cnamelen, 0, 0);
240e806c 868 message_dolog (": ", 2, 0, 0);
d311d28c 869 SAFE_FREE ();
240e806c
RS
870 }
871
113620cc
KH
872 errname = Fcar (data);
873
874 if (EQ (errname, Qerror))
875 {
876 data = Fcdr (data);
c02279de
GM
877 if (!CONSP (data))
878 data = Qnil;
113620cc
KH
879 errmsg = Fcar (data);
880 file_error = Qnil;
881 }
882 else
883 {
71873e2b 884 Lisp_Object error_conditions = Fget (errname, Qerror_conditions);
113620cc 885 errmsg = Fget (errname, Qerror_message);
c02279de 886 file_error = Fmemq (Qfile_error, error_conditions);
113620cc
KH
887 }
888
889 /* Print an error message including the data items. */
890
891 tail = Fcdr_safe (data);
892 GCPRO1 (tail);
893
894 /* For file-error, make error message by concatenating
895 all the data items. They are all strings. */
8c29413d 896 if (!NILP (file_error) && CONSP (tail))
94b342ce 897 errmsg = XCAR (tail), tail = XCDR (tail);
113620cc 898
71873e2b
SM
899 {
900 const char *sep = ": ";
901
902 if (!STRINGP (errmsg))
903 write_string_1 ("peculiar error", -1, stream);
904 else if (SCHARS (errmsg))
905 Fprinc (errmsg, stream);
906 else
907 sep = NULL;
908
909 for (; CONSP (tail); tail = XCDR (tail), sep = ", ")
910 {
911 Lisp_Object obj;
99027bdd 912
71873e2b
SM
913 if (sep)
914 write_string_1 (sep, 2, stream);
915 obj = XCAR (tail);
916 if (!NILP (file_error)
917 || EQ (errname, Qend_of_file) || EQ (errname, Quser_error))
918 Fprinc (obj, stream);
919 else
920 Fprin1 (obj, stream);
921 }
922 }
177c0ea7 923
113620cc
KH
924 UNGCPRO;
925}
38010d50 926
c02279de
GM
927
928\f
38010d50 929/*
edb2a707 930 * The buffer should be at least as large as the max string size of the
8e6208c5 931 * largest float, printed in the biggest notation. This is undoubtedly
38010d50
JB
932 * 20d float_output_format, with the negative of the C-constant "HUGE"
933 * from <math.h>.
177c0ea7 934 *
38010d50 935 * On the vax the worst case is -1e38 in 20d format which takes 61 bytes.
177c0ea7 936 *
38010d50
JB
937 * I assume that IEEE-754 format numbers can take 329 bytes for the worst
938 * case of -1e307 in 20d float_output_format. What is one to do (short of
939 * re-writing _doprnt to be more sane)?
940 * -wsr
6e8e6bf2 941 * Given the above, the buffer must be least FLOAT_TO_STRING_BUFSIZE bytes.
38010d50 942 */
edb2a707 943
99027bdd 944int
57ace6d0 945float_to_string (char *buf, double data)
38010d50 946{
57ace6d0 947 char *cp;
322890c4 948 int width;
99027bdd 949 int len;
177c0ea7 950
7f45de2d
RS
951 /* Check for plus infinity in a way that won't lose
952 if there is no plus infinity. */
953 if (data == data / 2 && data > 1.0)
954 {
99027bdd
PE
955 static char const infinity_string[] = "1.0e+INF";
956 strcpy (buf, infinity_string);
957 return sizeof infinity_string - 1;
7f45de2d
RS
958 }
959 /* Likewise for minus infinity. */
960 if (data == data / 2 && data < -1.0)
961 {
99027bdd
PE
962 static char const minus_infinity_string[] = "-1.0e+INF";
963 strcpy (buf, minus_infinity_string);
964 return sizeof minus_infinity_string - 1;
7f45de2d
RS
965 }
966 /* Check for NaN in a way that won't fail if there are no NaNs. */
967 if (! (data * 0.0 >= 0.0))
968 {
68c45bf0
PE
969 /* Prepend "-" if the NaN's sign bit is negative.
970 The sign bit of a double is the bit that is 1 in -0.0. */
99027bdd 971 static char const NaN_string[] = "0.0e+NaN";
68c45bf0
PE
972 int i;
973 union { double d; char c[sizeof (double)]; } u_data, u_minus_zero;
99027bdd 974 int negative = 0;
68c45bf0
PE
975 u_data.d = data;
976 u_minus_zero.d = - 0.0;
977 for (i = 0; i < sizeof (double); i++)
978 if (u_data.c[i] & u_minus_zero.c[i])
979 {
99027bdd
PE
980 *buf = '-';
981 negative = 1;
68c45bf0
PE
982 break;
983 }
177c0ea7 984
99027bdd
PE
985 strcpy (buf + negative, NaN_string);
986 return negative + sizeof NaN_string - 1;
7f45de2d
RS
987 }
988
10eebdbb 989 if (NILP (Vfloat_output_format)
d4ae1f7e 990 || !STRINGP (Vfloat_output_format))
38010d50 991 lose:
322890c4 992 {
f356c3fb 993 /* Generate the fewest number of digits that represent the
6e8e6bf2 994 floating point value without losing information. */
99027bdd 995 len = dtoastr (buf, FLOAT_TO_STRING_BUFSIZE - 2, 0, 0, data);
75b43359
MWD
996 /* The decimal point must be printed, or the byte compiler can
997 get confused (Bug#8033). */
998 width = 1;
322890c4 999 }
38010d50
JB
1000 else /* oink oink */
1001 {
1002 /* Check that the spec we have is fully valid.
1003 This means not only valid for printf,
1004 but meant for floats, and reasonable. */
57ace6d0 1005 cp = SSDATA (Vfloat_output_format);
38010d50
JB
1006
1007 if (cp[0] != '%')
1008 goto lose;
1009 if (cp[1] != '.')
1010 goto lose;
1011
1012 cp += 2;
c7b14277
JB
1013
1014 /* Check the width specification. */
322890c4 1015 width = -1;
c7b14277 1016 if ('0' <= *cp && *cp <= '9')
381cd4bb
KH
1017 {
1018 width = 0;
1019 do
aca216ff
PE
1020 {
1021 width = (width * 10) + (*cp++ - '0');
1022 if (DBL_DIG < width)
1023 goto lose;
1024 }
381cd4bb
KH
1025 while (*cp >= '0' && *cp <= '9');
1026
1027 /* A precision of zero is valid only for %f. */
aca216ff 1028 if (width == 0 && *cp != 'f')
381cd4bb
KH
1029 goto lose;
1030 }
38010d50
JB
1031
1032 if (*cp != 'e' && *cp != 'f' && *cp != 'g')
1033 goto lose;
1034
38010d50
JB
1035 if (cp[1] != 0)
1036 goto lose;
1037
99027bdd 1038 len = sprintf (buf, SSDATA (Vfloat_output_format), data);
38010d50 1039 }
edb2a707 1040
c7b14277
JB
1041 /* Make sure there is a decimal point with digit after, or an
1042 exponent, so that the value is readable as a float. But don't do
322890c4
RS
1043 this with "%.0f"; it's valid for that not to produce a decimal
1044 point. Note that width can be 0 only for %.0f. */
1045 if (width != 0)
0601fd3d 1046 {
c7b14277
JB
1047 for (cp = buf; *cp; cp++)
1048 if ((*cp < '0' || *cp > '9') && *cp != '-')
1049 break;
0601fd3d 1050
c7b14277
JB
1051 if (*cp == '.' && cp[1] == 0)
1052 {
1053 cp[1] = '0';
1054 cp[2] = 0;
99027bdd 1055 len++;
c7b14277 1056 }
75b43359 1057 else if (*cp == 0)
c7b14277
JB
1058 {
1059 *cp++ = '.';
1060 *cp++ = '0';
1061 *cp++ = 0;
99027bdd 1062 len += 2;
c7b14277 1063 }
edb2a707 1064 }
99027bdd
PE
1065
1066 return len;
38010d50 1067}
cc94f3b2 1068
38010d50
JB
1069\f
1070static void
971de7fb 1071print (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag)
38010d50 1072{
a22dec27 1073 new_backquote_output = 0;
38010d50 1074
0f25ecc6
RS
1075 /* Reset print_number_index and Vprint_number_table only when
1076 the variable Vprint_continuous_numbering is nil. Otherwise,
1077 the values of these variables will be kept between several
1078 print functions. */
e026eb89
KS
1079 if (NILP (Vprint_continuous_numbering)
1080 || NILP (Vprint_number_table))
0f25ecc6
RS
1081 {
1082 print_number_index = 0;
1083 Vprint_number_table = Qnil;
1084 }
38010d50 1085
0f25ecc6
RS
1086 /* Construct Vprint_number_table for print-gensym and print-circle. */
1087 if (!NILP (Vprint_gensym) || !NILP (Vprint_circle))
ec838c39 1088 {
e6d4cddd
RS
1089 /* Construct Vprint_number_table.
1090 This increments print_number_index for the objects added. */
9a6a4c40 1091 print_depth = 0;
0f25ecc6 1092 print_preprocess (obj);
e6d4cddd 1093
a65b85b5
SM
1094 if (HASH_TABLE_P (Vprint_number_table))
1095 { /* Remove unnecessary objects, which appear only once in OBJ;
a179e3f7 1096 that is, whose status is Qt. */
a65b85b5 1097 struct Lisp_Hash_Table *h = XHASH_TABLE (Vprint_number_table);
d311d28c 1098 ptrdiff_t i;
e6d4cddd 1099
a65b85b5
SM
1100 for (i = 0; i < HASH_TABLE_SIZE (h); ++i)
1101 if (!NILP (HASH_HASH (h, i))
1102 && EQ (HASH_VALUE (h, i), Qt))
1103 Fremhash (HASH_KEY (h, i), Vprint_number_table);
1104 }
0f25ecc6
RS
1105 }
1106
9a6a4c40 1107 print_depth = 0;
0f25ecc6
RS
1108 print_object (obj, printcharfun, escapeflag);
1109}
1110
fb103ca9
SM
1111#define PRINT_CIRCLE_CANDIDATE_P(obj) \
1112 (STRINGP (obj) || CONSP (obj) \
1113 || (VECTORLIKEP (obj) \
1114 && (VECTORP (obj) || COMPILEDP (obj) \
1115 || CHAR_TABLE_P (obj) || SUB_CHAR_TABLE_P (obj) \
1116 || HASH_TABLE_P (obj) || FONTP (obj))) \
1117 || (! NILP (Vprint_gensym) \
1118 && SYMBOLP (obj) \
1119 && !SYMBOL_INTERNED_P (obj)))
1120
0f25ecc6
RS
1121/* Construct Vprint_number_table according to the structure of OBJ.
1122 OBJ itself and all its elements will be added to Vprint_number_table
1123 recursively if it is a list, vector, compiled function, char-table,
1124 string (its text properties will be traced), or a symbol that has
1125 no obarray (this is for the print-gensym feature).
1126 The status fields of Vprint_number_table mean whether each object appears
1127 more than once in OBJ: Qnil at the first time, and Qt after that . */
1128static void
971de7fb 1129print_preprocess (Lisp_Object obj)
0f25ecc6 1130{
6b61353c 1131 int i;
d311d28c 1132 ptrdiff_t size;
c1132671
RS
1133 int loop_count = 0;
1134 Lisp_Object halftail;
1135
1136 /* Avoid infinite recursion for circular nested structure
1137 in the case where Vprint_circle is nil. */
1138 if (NILP (Vprint_circle))
1139 {
4ae29f89
SM
1140 /* Give up if we go so deep that print_object will get an error. */
1141 /* See similar code in print_object. */
1142 if (print_depth >= PRINT_CIRCLE)
1143 error ("Apparently circular structure being printed");
1144
c1132671
RS
1145 for (i = 0; i < print_depth; i++)
1146 if (EQ (obj, being_printed[i]))
1147 return;
1148 being_printed[print_depth] = obj;
1149 }
1150
c1132671
RS
1151 print_depth++;
1152 halftail = obj;
0f25ecc6
RS
1153
1154 loop:
fb103ca9 1155 if (PRINT_CIRCLE_CANDIDATE_P (obj))
0f25ecc6 1156 {
a65b85b5
SM
1157 if (!HASH_TABLE_P (Vprint_number_table))
1158 {
1159 Lisp_Object args[2];
1160 args[0] = QCtest;
1161 args[1] = Qeq;
1162 Vprint_number_table = Fmake_hash_table (2, args);
1163 }
1164
aca2020b
KH
1165 /* In case print-circle is nil and print-gensym is t,
1166 add OBJ to Vprint_number_table only when OBJ is a symbol. */
1167 if (! NILP (Vprint_circle) || SYMBOLP (obj))
0f25ecc6 1168 {
a65b85b5
SM
1169 Lisp_Object num = Fgethash (obj, Vprint_number_table, Qnil);
1170 if (!NILP (num)
1171 /* If Vprint_continuous_numbering is non-nil and OBJ is a gensym,
1172 always print the gensym with a number. This is a special for
1173 the lisp function byte-compile-output-docform. */
1174 || (!NILP (Vprint_continuous_numbering)
1175 && SYMBOLP (obj)
1176 && !SYMBOL_INTERNED_P (obj)))
1177 { /* OBJ appears more than once. Let's remember that. */
17870c01 1178 if (!INTEGERP (num))
aca2020b 1179 {
a65b85b5
SM
1180 print_number_index++;
1181 /* Negative number indicates it hasn't been printed yet. */
1182 Fputhash (obj, make_number (- print_number_index),
1183 Vprint_number_table);
aca2020b 1184 }
a65b85b5
SM
1185 print_depth--;
1186 return;
0f25ecc6 1187 }
a65b85b5
SM
1188 else
1189 /* OBJ is not yet recorded. Let's add to the table. */
1190 Fputhash (obj, Qt, Vprint_number_table);
0f25ecc6 1191 }
0f25ecc6 1192
8e50cc2d 1193 switch (XTYPE (obj))
0f25ecc6
RS
1194 {
1195 case Lisp_String:
0f25ecc6 1196 /* A string may have text properties, which can be circular. */
0c94c8d6 1197 traverse_intervals_noorder (string_intervals (obj),
8bbfc258 1198 print_preprocess_string, Qnil);
0f25ecc6
RS
1199 break;
1200
1201 case Lisp_Cons:
c1132671
RS
1202 /* Use HALFTAIL and LOOP_COUNT to detect circular lists,
1203 just as in print_object. */
1204 if (loop_count && EQ (obj, halftail))
1205 break;
0f25ecc6
RS
1206 print_preprocess (XCAR (obj));
1207 obj = XCDR (obj);
c1132671
RS
1208 loop_count++;
1209 if (!(loop_count & 1))
1210 halftail = XCDR (halftail);
0f25ecc6
RS
1211 goto loop;
1212
1213 case Lisp_Vectorlike:
77b37c05 1214 size = ASIZE (obj);
6b61353c
KH
1215 if (size & PSEUDOVECTOR_FLAG)
1216 size &= PSEUDOVECTOR_SIZE_MASK;
0f25ecc6 1217 for (i = 0; i < size; i++)
28be1ada 1218 print_preprocess (AREF (obj, i));
3e0de07f
SM
1219 if (HASH_TABLE_P (obj))
1220 { /* For hash tables, the key_and_value slot is past
a65b85b5
SM
1221 `size' because it needs to be marked specially in case
1222 the table is weak. */
3e0de07f
SM
1223 struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
1224 print_preprocess (h->key_and_value);
1225 }
ee5263af
GM
1226 break;
1227
1228 default:
1229 break;
0f25ecc6
RS
1230 }
1231 }
c1132671 1232 print_depth--;
0f25ecc6
RS
1233}
1234
0f25ecc6 1235static void
971de7fb 1236print_preprocess_string (INTERVAL interval, Lisp_Object arg)
0f25ecc6
RS
1237{
1238 print_preprocess (interval->plist);
1239}
0f25ecc6 1240
971de7fb 1241static void print_check_string_charset_prop (INTERVAL interval, Lisp_Object string);
71ea13cb
KH
1242
1243#define PRINT_STRING_NON_CHARSET_FOUND 1
1244#define PRINT_STRING_UNSAFE_CHARSET_FOUND 2
1245
4ae29f89 1246/* Bitwise or of the above macros. */
71ea13cb
KH
1247static int print_check_string_result;
1248
1249static void
971de7fb 1250print_check_string_charset_prop (INTERVAL interval, Lisp_Object string)
71ea13cb
KH
1251{
1252 Lisp_Object val;
1253
1254 if (NILP (interval->plist)
1255 || (print_check_string_result == (PRINT_STRING_NON_CHARSET_FOUND
1256 | PRINT_STRING_UNSAFE_CHARSET_FOUND)))
1257 return;
1258 for (val = interval->plist; CONSP (val) && ! EQ (XCAR (val), Qcharset);
1259 val = XCDR (XCDR (val)));
1260 if (! CONSP (val))
1261 {
1262 print_check_string_result |= PRINT_STRING_NON_CHARSET_FOUND;
1263 return;
1264 }
1265 if (! (print_check_string_result & PRINT_STRING_NON_CHARSET_FOUND))
1266 {
1267 if (! EQ (val, interval->plist)
1268 || CONSP (XCDR (XCDR (val))))
1269 print_check_string_result |= PRINT_STRING_NON_CHARSET_FOUND;
1270 }
1271 if (NILP (Vprint_charset_text_property)
1272 || ! (print_check_string_result & PRINT_STRING_UNSAFE_CHARSET_FOUND))
1273 {
1274 int i, c;
d311d28c
PE
1275 ptrdiff_t charpos = interval->position;
1276 ptrdiff_t bytepos = string_char_to_byte (string, charpos);
71ea13cb
KH
1277 Lisp_Object charset;
1278
1279 charset = XCAR (XCDR (val));
1280 for (i = 0; i < LENGTH (interval); i++)
1281 {
1282 FETCH_STRING_CHAR_ADVANCE (c, string, charpos, bytepos);
c80bcdbc
KH
1283 if (! ASCII_CHAR_P (c)
1284 && ! EQ (CHARSET_NAME (CHAR_CHARSET (c)), charset))
71ea13cb
KH
1285 {
1286 print_check_string_result |= PRINT_STRING_UNSAFE_CHARSET_FOUND;
1287 break;
1288 }
1289 }
1290 }
1291}
1292
1293/* The value is (charset . nil). */
1294static Lisp_Object print_prune_charset_plist;
1295
1296static Lisp_Object
971de7fb 1297print_prune_string_charset (Lisp_Object string)
71ea13cb
KH
1298{
1299 print_check_string_result = 0;
0c94c8d6 1300 traverse_intervals (string_intervals (string), 0,
71ea13cb
KH
1301 print_check_string_charset_prop, string);
1302 if (! (print_check_string_result & PRINT_STRING_UNSAFE_CHARSET_FOUND))
1303 {
1304 string = Fcopy_sequence (string);
1305 if (print_check_string_result & PRINT_STRING_NON_CHARSET_FOUND)
1306 {
1307 if (NILP (print_prune_charset_plist))
1308 print_prune_charset_plist = Fcons (Qcharset, Qnil);
eabe04c0
KH
1309 Fremove_text_properties (make_number (0),
1310 make_number (SCHARS (string)),
71ea13cb
KH
1311 print_prune_charset_plist, string);
1312 }
1313 else
eabe04c0
KH
1314 Fset_text_properties (make_number (0), make_number (SCHARS (string)),
1315 Qnil, string);
71ea13cb
KH
1316 }
1317 return string;
1318}
1319
0f25ecc6 1320static void
971de7fb 1321print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag)
0f25ecc6 1322{
aca216ff
PE
1323 char buf[max (sizeof "from..to..in " + 2 * INT_STRLEN_BOUND (EMACS_INT),
1324 max (sizeof " . #" + INT_STRLEN_BOUND (printmax_t),
1325 40))];
0f25ecc6
RS
1326
1327 QUIT;
1328
1329 /* Detect circularities and truncate them. */
4ae29f89 1330 if (NILP (Vprint_circle))
0f25ecc6 1331 {
4ae29f89
SM
1332 /* Simple but incomplete way. */
1333 int i;
1334
1335 /* See similar code in print_preprocess. */
1336 if (print_depth >= PRINT_CIRCLE)
1337 error ("Apparently circular structure being printed");
1338
1339 for (i = 0; i < print_depth; i++)
1340 if (EQ (obj, being_printed[i]))
1341 {
99027bdd
PE
1342 int len = sprintf (buf, "#%d", i);
1343 strout (buf, len, len, printcharfun);
4ae29f89
SM
1344 return;
1345 }
1346 being_printed[print_depth] = obj;
1347 }
1348 else if (PRINT_CIRCLE_CANDIDATE_P (obj))
1349 {
1350 /* With the print-circle feature. */
1351 Lisp_Object num = Fgethash (obj, Vprint_number_table, Qnil);
1352 if (INTEGERP (num))
0f25ecc6 1353 {
4ae29f89
SM
1354 EMACS_INT n = XINT (num);
1355 if (n < 0)
1356 { /* Add a prefix #n= if OBJ has not yet been printed;
1357 that is, its status field is nil. */
99027bdd
PE
1358 int len = sprintf (buf, "#%"pI"d=", -n);
1359 strout (buf, len, len, printcharfun);
4ae29f89
SM
1360 /* OBJ is going to be printed. Remember that fact. */
1361 Fputhash (obj, make_number (- n), Vprint_number_table);
1362 }
1363 else
a65b85b5 1364 {
4ae29f89 1365 /* Just print #n# if OBJ has already been printed. */
99027bdd
PE
1366 int len = sprintf (buf, "#%"pI"d#", n);
1367 strout (buf, len, len, printcharfun);
4ae29f89 1368 return;
a65b85b5 1369 }
0f25ecc6 1370 }
ec838c39 1371 }
ec838c39 1372
38010d50
JB
1373 print_depth++;
1374
8e50cc2d 1375 switch (XTYPE (obj))
38010d50 1376 {
2de9f71c 1377 case_Lisp_Int:
99027bdd
PE
1378 {
1379 int len = sprintf (buf, "%"pI"d", XINT (obj));
1380 strout (buf, len, len, printcharfun);
1381 }
ca0569ad
RS
1382 break;
1383
ca0569ad
RS
1384 case Lisp_Float:
1385 {
6e8e6bf2 1386 char pigbuf[FLOAT_TO_STRING_BUFSIZE];
99027bdd
PE
1387 int len = float_to_string (pigbuf, XFLOAT_DATA (obj));
1388 strout (pigbuf, len, len, printcharfun);
ca0569ad
RS
1389 }
1390 break;
ca0569ad
RS
1391
1392 case Lisp_String:
38010d50
JB
1393 if (!escapeflag)
1394 print_string (obj, printcharfun);
1395 else
1396 {
d311d28c 1397 register ptrdiff_t i_byte;
38010d50 1398 struct gcpro gcpro1;
872a36d2 1399 unsigned char *str;
d311d28c 1400 ptrdiff_t size_byte;
453fa987
RS
1401 /* 1 means we must ensure that the next character we output
1402 cannot be taken as part of a hex character escape. */
1403 int need_nonhex = 0;
db300f59 1404 int multibyte = STRING_MULTIBYTE (obj);
38010d50 1405
7651e1f5
RS
1406 GCPRO1 (obj);
1407
71ea13cb
KH
1408 if (! EQ (Vprint_charset_text_property, Qt))
1409 obj = print_prune_string_charset (obj);
1410
0c94c8d6 1411 if (string_intervals (obj))
7651e1f5
RS
1412 {
1413 PRINTCHAR ('#');
1414 PRINTCHAR ('(');
1415 }
38010d50
JB
1416
1417 PRINTCHAR ('\"');
d5db4077
KR
1418 str = SDATA (obj);
1419 size_byte = SBYTES (obj);
dc2a0b79 1420
47553fa8 1421 for (i_byte = 0; i_byte < size_byte;)
38010d50 1422 {
6ddd6eee
RS
1423 /* Here, we must convert each multi-byte form to the
1424 corresponding character code before handing it to PRINTCHAR. */
1425 int len;
dc2a0b79
RS
1426 int c;
1427
db300f59 1428 if (multibyte)
872a36d2 1429 {
62a6e103 1430 c = STRING_CHAR_AND_LENGTH (str + i_byte, len);
8b4b4467 1431 i_byte += len;
872a36d2 1432 }
dc2a0b79 1433 else
872a36d2 1434 c = str[i_byte++];
dc2a0b79 1435
38010d50 1436 QUIT;
6ddd6eee 1437
38010d50
JB
1438 if (c == '\n' && print_escape_newlines)
1439 {
1440 PRINTCHAR ('\\');
1441 PRINTCHAR ('n');
1442 }
c6f7982f
RM
1443 else if (c == '\f' && print_escape_newlines)
1444 {
1445 PRINTCHAR ('\\');
1446 PRINTCHAR ('f');
1447 }
ae7367d3 1448 else if (multibyte
42a5b22f 1449 && (CHAR_BYTE8_P (c)
73af357a 1450 || (! ASCII_CHAR_P (c) && print_escape_multibyte)))
dc2a0b79
RS
1451 {
1452 /* When multibyte is disabled,
ae7367d3
RS
1453 print multibyte string chars using hex escapes.
1454 For a char code that could be in a unibyte string,
1455 when found in a multibyte string, always use a hex escape
1456 so it reads back as multibyte. */
09125ef8 1457 char outbuf[50];
99027bdd 1458 int len;
8b4b4467
KH
1459
1460 if (CHAR_BYTE8_P (c))
99027bdd 1461 len = sprintf (outbuf, "\\%03o", CHAR_TO_BYTE8 (c));
8b4b4467 1462 else
8f924df7 1463 {
99027bdd 1464 len = sprintf (outbuf, "\\x%04x", c);
8f924df7
KH
1465 need_nonhex = 1;
1466 }
99027bdd 1467 strout (outbuf, len, len, printcharfun);
dc2a0b79 1468 }
db300f59
RS
1469 else if (! multibyte
1470 && SINGLE_BYTE_CHAR_P (c) && ! ASCII_BYTE_P (c)
835d0be6 1471 && print_escape_nonascii)
974a6ff5 1472 {
835d0be6
RS
1473 /* When printing in a multibyte buffer
1474 or when explicitly requested,
974a6ff5
KH
1475 print single-byte non-ASCII string chars
1476 using octal escapes. */
09125ef8 1477 char outbuf[5];
99027bdd
PE
1478 int len = sprintf (outbuf, "\\%03o", c);
1479 strout (outbuf, len, len, printcharfun);
974a6ff5 1480 }
38010d50
JB
1481 else
1482 {
453fa987
RS
1483 /* If we just had a hex escape, and this character
1484 could be taken as part of it,
1485 output `\ ' to prevent that. */
1b62edd6
KH
1486 if (need_nonhex)
1487 {
1488 need_nonhex = 0;
1489 if ((c >= 'a' && c <= 'f')
453fa987 1490 || (c >= 'A' && c <= 'F')
1b62edd6 1491 || (c >= '0' && c <= '9'))
1db5b1ad 1492 strout ("\\ ", -1, -1, printcharfun);
1b62edd6 1493 }
453fa987 1494
38010d50
JB
1495 if (c == '\"' || c == '\\')
1496 PRINTCHAR ('\\');
1497 PRINTCHAR (c);
1498 }
1499 }
1500 PRINTCHAR ('\"');
7651e1f5 1501
0c94c8d6 1502 if (string_intervals (obj))
7651e1f5 1503 {
0c94c8d6 1504 traverse_intervals (string_intervals (obj),
8bbfc258 1505 0, print_interval, printcharfun);
7651e1f5
RS
1506 PRINTCHAR (')');
1507 }
7651e1f5 1508
38010d50
JB
1509 UNGCPRO;
1510 }
ca0569ad 1511 break;
38010d50 1512
ca0569ad
RS
1513 case Lisp_Symbol:
1514 {
1515 register int confusing;
d5db4077
KR
1516 register unsigned char *p = SDATA (SYMBOL_NAME (obj));
1517 register unsigned char *end = p + SBYTES (SYMBOL_NAME (obj));
2190a05e 1518 register int c;
d311d28c
PE
1519 ptrdiff_t i, i_byte;
1520 ptrdiff_t size_byte;
dc2a0b79
RS
1521 Lisp_Object name;
1522
76d0b3ae 1523 name = SYMBOL_NAME (obj);
ca0569ad
RS
1524
1525 if (p != end && (*p == '-' || *p == '+')) p++;
1526 if (p == end)
1527 confusing = 0;
d27497e3
RS
1528 /* If symbol name begins with a digit, and ends with a digit,
1529 and contains nothing but digits and `e', it could be treated
1530 as a number. So set CONFUSING.
1531
1532 Symbols that contain periods could also be taken as numbers,
1533 but periods are always escaped, so we don't have to worry
1534 about them here. */
1535 else if (*p >= '0' && *p <= '9'
1536 && end[-1] >= '0' && end[-1] <= '9')
ca0569ad 1537 {
e837058b
RS
1538 while (p != end && ((*p >= '0' && *p <= '9')
1539 /* Needed for \2e10. */
01a8d3fa 1540 || *p == 'e' || *p == 'E'))
ca0569ad
RS
1541 p++;
1542 confusing = (end == p);
1543 }
d27497e3
RS
1544 else
1545 confusing = 0;
ca0569ad 1546
9a79b20c
AS
1547 size_byte = SBYTES (name);
1548
bf9f2aab 1549 if (! NILP (Vprint_gensym) && !SYMBOL_INTERNED_P (obj))
081e0581 1550 {
081e0581
EN
1551 PRINTCHAR ('#');
1552 PRINTCHAR (':');
1553 }
9a79b20c
AS
1554 else if (size_byte == 0)
1555 {
1556 PRINTCHAR ('#');
1557 PRINTCHAR ('#');
1558 break;
1559 }
dc2a0b79
RS
1560
1561 for (i = 0, i_byte = 0; i_byte < size_byte;)
ca0569ad 1562 {
6ddd6eee
RS
1563 /* Here, we must convert each multi-byte form to the
1564 corresponding character code before handing it to PRINTCHAR. */
eba90784 1565 FETCH_STRING_CHAR_ADVANCE (c, name, i, i_byte);
ca0569ad 1566 QUIT;
09eddb56 1567
ca0569ad
RS
1568 if (escapeflag)
1569 {
09eddb56
RS
1570 if (c == '\"' || c == '\\' || c == '\''
1571 || c == ';' || c == '#' || c == '(' || c == ')'
9a79b20c 1572 || c == ',' || c == '.' || c == '`'
09eddb56
RS
1573 || c == '[' || c == ']' || c == '?' || c <= 040
1574 || confusing)
ca0569ad
RS
1575 PRINTCHAR ('\\'), confusing = 0;
1576 }
1577 PRINTCHAR (c);
1578 }
1579 }
1580 break;
1581
1582 case Lisp_Cons:
38010d50 1583 /* If deeper than spec'd depth, print placeholder. */
d4ae1f7e 1584 if (INTEGERP (Vprint_level)
38010d50 1585 && print_depth > XINT (Vprint_level))
1db5b1ad 1586 strout ("...", -1, -1, printcharfun);
2f100b5c
EN
1587 else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
1588 && (EQ (XCAR (obj), Qquote)))
1589 {
1590 PRINTCHAR ('\'');
0f25ecc6 1591 print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
2f100b5c
EN
1592 }
1593 else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
1594 && (EQ (XCAR (obj), Qfunction)))
1595 {
1596 PRINTCHAR ('#');
1597 PRINTCHAR ('\'');
0f25ecc6 1598 print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
2f100b5c
EN
1599 }
1600 else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
a22dec27
SM
1601 && ((EQ (XCAR (obj), Qbackquote))))
1602 {
1603 print_object (XCAR (obj), printcharfun, 0);
1604 new_backquote_output++;
1605 print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
1606 new_backquote_output--;
1607 }
1608 else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
1609 && new_backquote_output
2f100b5c
EN
1610 && ((EQ (XCAR (obj), Qbackquote)
1611 || EQ (XCAR (obj), Qcomma)
1612 || EQ (XCAR (obj), Qcomma_at)
1613 || EQ (XCAR (obj), Qcomma_dot))))
1614 {
0f25ecc6 1615 print_object (XCAR (obj), printcharfun, 0);
a22dec27 1616 new_backquote_output--;
0f25ecc6 1617 print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
a22dec27 1618 new_backquote_output++;
2f100b5c 1619 }
e0f93814 1620 else
38010d50 1621 {
e0f93814 1622 PRINTCHAR ('(');
177c0ea7 1623
38010d50 1624 {
aca216ff 1625 printmax_t i, print_length;
1eab22b5 1626 Lisp_Object halftail = obj;
e0f93814 1627
9ab8560d 1628 /* Negative values of print-length are invalid in CL.
42ac1ed4
GM
1629 Treat them like nil, as CMUCL does. */
1630 if (NATNUMP (Vprint_length))
1631 print_length = XFASTINT (Vprint_length);
1632 else
aca216ff 1633 print_length = TYPE_MAXIMUM (printmax_t);
42ac1ed4
GM
1634
1635 i = 0;
e0f93814 1636 while (CONSP (obj))
38010d50 1637 {
1eab22b5 1638 /* Detect circular list. */
0f25ecc6 1639 if (NILP (Vprint_circle))
1eab22b5 1640 {
53964682 1641 /* Simple but incomplete way. */
0f25ecc6
RS
1642 if (i != 0 && EQ (obj, halftail))
1643 {
99027bdd
PE
1644 int len = sprintf (buf, " . #%"pMd, i / 2);
1645 strout (buf, len, len, printcharfun);
0f25ecc6
RS
1646 goto end_of_list;
1647 }
1648 }
1649 else
1650 {
1651 /* With the print-circle feature. */
1652 if (i != 0)
1653 {
a65b85b5
SM
1654 Lisp_Object num = Fgethash (obj, Vprint_number_table, Qnil);
1655 if (INTEGERP (num))
36de6a04 1656 {
1db5b1ad 1657 strout (" . ", 3, 3, printcharfun);
36de6a04
AS
1658 print_object (obj, printcharfun, escapeflag);
1659 goto end_of_list;
1660 }
0f25ecc6 1661 }
1eab22b5 1662 }
177c0ea7 1663
aca216ff 1664 if (i)
e0f93814 1665 PRINTCHAR (' ');
177c0ea7 1666
aca216ff 1667 if (print_length <= i)
e0f93814 1668 {
1db5b1ad 1669 strout ("...", 3, 3, printcharfun);
0f25ecc6 1670 goto end_of_list;
e0f93814 1671 }
177c0ea7 1672
aca216ff 1673 i++;
0f25ecc6 1674 print_object (XCAR (obj), printcharfun, escapeflag);
177c0ea7 1675
2f100b5c 1676 obj = XCDR (obj);
1eab22b5
RS
1677 if (!(i & 1))
1678 halftail = XCDR (halftail);
38010d50 1679 }
38010d50 1680 }
42ac1ed4
GM
1681
1682 /* OBJ non-nil here means it's the end of a dotted list. */
2f100b5c 1683 if (!NILP (obj))
e0f93814 1684 {
1db5b1ad 1685 strout (" . ", 3, 3, printcharfun);
0f25ecc6 1686 print_object (obj, printcharfun, escapeflag);
e0f93814 1687 }
177c0ea7 1688
0f25ecc6 1689 end_of_list:
e0f93814 1690 PRINTCHAR (')');
38010d50 1691 }
ca0569ad
RS
1692 break;
1693
1694 case Lisp_Vectorlike:
1695 if (PROCESSP (obj))
1696 {
1697 if (escapeflag)
1698 {
1db5b1ad 1699 strout ("#<process ", -1, -1, printcharfun);
4d2b044c 1700 print_string (XPROCESS (obj)->name, printcharfun);
ca0569ad
RS
1701 PRINTCHAR ('>');
1702 }
1703 else
4d2b044c 1704 print_string (XPROCESS (obj)->name, printcharfun);
ca0569ad 1705 }
ed2c35ef
RS
1706 else if (BOOL_VECTOR_P (obj))
1707 {
29ebea3b 1708 ptrdiff_t i;
99027bdd
PE
1709 int len;
1710 unsigned char c;
ed2c35ef 1711 struct gcpro gcpro1;
d311d28c 1712 ptrdiff_t size_in_chars
4b5af5e4
AS
1713 = ((XBOOL_VECTOR (obj)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
1714 / BOOL_VECTOR_BITS_PER_CHAR);
ed2c35ef
RS
1715
1716 GCPRO1 (obj);
1717
1718 PRINTCHAR ('#');
1719 PRINTCHAR ('&');
99027bdd
PE
1720 len = sprintf (buf, "%"pI"d", XBOOL_VECTOR (obj)->size);
1721 strout (buf, len, len, printcharfun);
ed2c35ef 1722 PRINTCHAR ('\"');
a40384bc 1723
42ac1ed4 1724 /* Don't print more characters than the specified maximum.
9ab8560d 1725 Negative values of print-length are invalid. Treat them
42ac1ed4
GM
1726 like a print-length of nil. */
1727 if (NATNUMP (Vprint_length)
1728 && XFASTINT (Vprint_length) < size_in_chars)
1729 size_in_chars = XFASTINT (Vprint_length);
a40384bc 1730
ed2c35ef
RS
1731 for (i = 0; i < size_in_chars; i++)
1732 {
1733 QUIT;
1734 c = XBOOL_VECTOR (obj)->data[i];
f10fdbfd 1735 if (c == '\n' && print_escape_newlines)
ed2c35ef
RS
1736 {
1737 PRINTCHAR ('\\');
1738 PRINTCHAR ('n');
1739 }
1740 else if (c == '\f' && print_escape_newlines)
1741 {
1742 PRINTCHAR ('\\');
1743 PRINTCHAR ('f');
1744 }
4b5af5e4
AS
1745 else if (c > '\177')
1746 {
1747 /* Use octal escapes to avoid encoding issues. */
1748 PRINTCHAR ('\\');
1749 PRINTCHAR ('0' + ((c >> 6) & 3));
1750 PRINTCHAR ('0' + ((c >> 3) & 7));
1751 PRINTCHAR ('0' + (c & 7));
1752 }
ed2c35ef
RS
1753 else
1754 {
1755 if (c == '\"' || c == '\\')
1756 PRINTCHAR ('\\');
1757 PRINTCHAR (c);
1758 }
1759 }
1760 PRINTCHAR ('\"');
1761
1762 UNGCPRO;
1763 }
ca0569ad
RS
1764 else if (SUBRP (obj))
1765 {
1db5b1ad
JB
1766 strout ("#<subr ", -1, -1, printcharfun);
1767 strout (XSUBR (obj)->symbol_name, -1, -1, printcharfun);
ca0569ad
RS
1768 PRINTCHAR ('>');
1769 }
ca0569ad
RS
1770 else if (WINDOWP (obj))
1771 {
99027bdd 1772 int len;
1db5b1ad 1773 strout ("#<window ", -1, -1, printcharfun);
45942c7d 1774 len = sprintf (buf, "%d", XWINDOW (obj)->sequence_number);
99027bdd 1775 strout (buf, len, len, printcharfun);
d3d50620 1776 if (!NILP (XWINDOW (obj)->buffer))
ca0569ad 1777 {
1db5b1ad 1778 strout (" on ", -1, -1, printcharfun);
d3d50620 1779 print_string (BVAR (XBUFFER (XWINDOW (obj)->buffer), name),
3a45383a 1780 printcharfun);
ca0569ad
RS
1781 }
1782 PRINTCHAR ('>');
1783 }
f76c8b1e
SM
1784 else if (TERMINALP (obj))
1785 {
99027bdd 1786 int len;
f76c8b1e 1787 struct terminal *t = XTERMINAL (obj);
1db5b1ad 1788 strout ("#<terminal ", -1, -1, printcharfun);
99027bdd
PE
1789 len = sprintf (buf, "%d", t->id);
1790 strout (buf, len, len, printcharfun);
f76c8b1e
SM
1791 if (t->name)
1792 {
1db5b1ad
JB
1793 strout (" on ", -1, -1, printcharfun);
1794 strout (t->name, -1, -1, printcharfun);
f76c8b1e
SM
1795 }
1796 PRINTCHAR ('>');
1797 }
7eb03302
GM
1798 else if (HASH_TABLE_P (obj))
1799 {
1800 struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
d311d28c
PE
1801 ptrdiff_t i;
1802 ptrdiff_t real_size, size;
99027bdd 1803 int len;
f19a0f5b 1804#if 0
1db5b1ad 1805 strout ("#<hash-table", -1, -1, printcharfun);
7eb03302
GM
1806 if (SYMBOLP (h->test))
1807 {
1808 PRINTCHAR (' ');
1809 PRINTCHAR ('\'');
1db5b1ad 1810 strout (SDATA (SYMBOL_NAME (h->test)), -1, -1, printcharfun);
7eb03302 1811 PRINTCHAR (' ');
1db5b1ad 1812 strout (SDATA (SYMBOL_NAME (h->weak)), -1, -1, printcharfun);
7eb03302 1813 PRINTCHAR (' ');
99027bdd
PE
1814 len = sprintf (buf, "%"pD"d/%"pD"d", h->count, ASIZE (h->next));
1815 strout (buf, len, len, printcharfun);
7eb03302 1816 }
99027bdd
PE
1817 len = sprintf (buf, " %p", h);
1818 strout (buf, len, len, printcharfun);
7eb03302 1819 PRINTCHAR ('>');
f19a0f5b
TZ
1820#endif
1821 /* Implement a readable output, e.g.:
1822 #s(hash-table size 2 test equal data (k1 v1 k2 v2)) */
1823 /* Always print the size. */
99027bdd
PE
1824 len = sprintf (buf, "#s(hash-table size %"pD"d", ASIZE (h->next));
1825 strout (buf, len, len, printcharfun);
f19a0f5b
TZ
1826
1827 if (!NILP (h->test))
1828 {
1db5b1ad 1829 strout (" test ", -1, -1, printcharfun);
617a0e83 1830 print_object (h->test, printcharfun, escapeflag);
f19a0f5b
TZ
1831 }
1832
1833 if (!NILP (h->weak))
1834 {
1db5b1ad 1835 strout (" weakness ", -1, -1, printcharfun);
617a0e83 1836 print_object (h->weak, printcharfun, escapeflag);
f19a0f5b
TZ
1837 }
1838
1839 if (!NILP (h->rehash_size))
1840 {
1db5b1ad 1841 strout (" rehash-size ", -1, -1, printcharfun);
617a0e83 1842 print_object (h->rehash_size, printcharfun, escapeflag);
f19a0f5b
TZ
1843 }
1844
1845 if (!NILP (h->rehash_threshold))
1846 {
1db5b1ad 1847 strout (" rehash-threshold ", -1, -1, printcharfun);
617a0e83 1848 print_object (h->rehash_threshold, printcharfun, escapeflag);
f19a0f5b
TZ
1849 }
1850
1db5b1ad 1851 strout (" data ", -1, -1, printcharfun);
f19a0f5b
TZ
1852
1853 /* Print the data here as a plist. */
b0ca0f33
DN
1854 real_size = HASH_TABLE_SIZE (h);
1855 size = real_size;
f19a0f5b
TZ
1856
1857 /* Don't print more elements than the specified maximum. */
1858 if (NATNUMP (Vprint_length)
1859 && XFASTINT (Vprint_length) < size)
1860 size = XFASTINT (Vprint_length);
42a5b22f 1861
f19a0f5b
TZ
1862 PRINTCHAR ('(');
1863 for (i = 0; i < size; i++)
1864 if (!NILP (HASH_HASH (h, i)))
1865 {
1866 if (i) PRINTCHAR (' ');
617a0e83 1867 print_object (HASH_KEY (h, i), printcharfun, escapeflag);
f19a0f5b 1868 PRINTCHAR (' ');
617a0e83 1869 print_object (HASH_VALUE (h, i), printcharfun, escapeflag);
f19a0f5b
TZ
1870 }
1871
1872 if (size < real_size)
1db5b1ad 1873 strout (" ...", 4, 4, printcharfun);
f19a0f5b
TZ
1874
1875 PRINTCHAR (')');
1876 PRINTCHAR (')');
1877
7eb03302 1878 }
908b0ae5
RS
1879 else if (BUFFERP (obj))
1880 {
4b4deea2 1881 if (NILP (BVAR (XBUFFER (obj), name)))
1db5b1ad 1882 strout ("#<killed buffer>", -1, -1, printcharfun);
908b0ae5
RS
1883 else if (escapeflag)
1884 {
1db5b1ad 1885 strout ("#<buffer ", -1, -1, printcharfun);
4b4deea2 1886 print_string (BVAR (XBUFFER (obj), name), printcharfun);
908b0ae5
RS
1887 PRINTCHAR ('>');
1888 }
1889 else
4b4deea2 1890 print_string (BVAR (XBUFFER (obj), name), printcharfun);
908b0ae5 1891 }
ca0569ad
RS
1892 else if (WINDOW_CONFIGURATIONP (obj))
1893 {
1db5b1ad 1894 strout ("#<window-configuration>", -1, -1, printcharfun);
ca0569ad 1895 }
ca0569ad
RS
1896 else if (FRAMEP (obj))
1897 {
99027bdd 1898 int len;
e69b0960 1899 Lisp_Object frame_name = XFRAME (obj)->name;
436bc8e0 1900
ca0569ad
RS
1901 strout ((FRAME_LIVE_P (XFRAME (obj))
1902 ? "#<frame " : "#<dead frame "),
1db5b1ad 1903 -1, -1, printcharfun);
436bc8e0
EZ
1904 if (!STRINGP (frame_name))
1905 {
1906 /* A frame could be too young and have no name yet;
1907 don't crash. */
1908 if (SYMBOLP (frame_name))
1909 frame_name = Fsymbol_name (frame_name);
1910 else /* can't happen: name should be either nil or string */
1911 frame_name = build_string ("*INVALID*FRAME*NAME*");
1912 }
1913 print_string (frame_name, printcharfun);
99027bdd
PE
1914 len = sprintf (buf, " %p", XFRAME (obj));
1915 strout (buf, len, len, printcharfun);
ca0569ad
RS
1916 PRINTCHAR ('>');
1917 }
2a7b7982
KH
1918 else if (FONTP (obj))
1919 {
d311d28c 1920 int i;
2a7b7982
KH
1921
1922 if (! FONT_OBJECT_P (obj))
1923 {
1924 if (FONT_SPEC_P (obj))
1db5b1ad 1925 strout ("#<font-spec", -1, -1, printcharfun);
2a7b7982 1926 else
1db5b1ad 1927 strout ("#<font-entity", -1, -1, printcharfun);
2a7b7982
KH
1928 for (i = 0; i < FONT_SPEC_MAX; i++)
1929 {
1930 PRINTCHAR (' ');
1931 if (i < FONT_WEIGHT_INDEX || i > FONT_WIDTH_INDEX)
1932 print_object (AREF (obj, i), printcharfun, escapeflag);
1933 else
1934 print_object (font_style_symbolic (obj, i, 0),
1935 printcharfun, escapeflag);
1936 }
1937 }
1938 else
1939 {
1db5b1ad 1940 strout ("#<font-object ", -1, -1, printcharfun);
2a7b7982
KH
1941 print_object (AREF (obj, FONT_NAME_INDEX), printcharfun,
1942 escapeflag);
1943 }
1944 PRINTCHAR ('>');
1945 }
ca0569ad
RS
1946 else
1947 {
d311d28c 1948 ptrdiff_t size = ASIZE (obj);
ca0569ad
RS
1949 if (COMPILEDP (obj))
1950 {
1951 PRINTCHAR ('#');
1952 size &= PSEUDOVECTOR_SIZE_MASK;
1953 }
8b4b4467 1954 if (CHAR_TABLE_P (obj) || SUB_CHAR_TABLE_P (obj))
ed2c35ef
RS
1955 {
1956 /* We print a char-table as if it were a vector,
1957 lumping the parent and default slots in with the
1958 character slots. But we add #^ as a prefix. */
223509a3
KH
1959
1960 /* Make each lowest sub_char_table start a new line.
1961 Otherwise we'll make a line extremely long, which
1962 results in slow redisplay. */
1963 if (SUB_CHAR_TABLE_P (obj)
1964 && XINT (XSUB_CHAR_TABLE (obj)->depth) == 3)
1965 PRINTCHAR ('\n');
ed2c35ef
RS
1966 PRINTCHAR ('#');
1967 PRINTCHAR ('^');
3701b5de
KH
1968 if (SUB_CHAR_TABLE_P (obj))
1969 PRINTCHAR ('^');
ed2c35ef
RS
1970 size &= PSEUDOVECTOR_SIZE_MASK;
1971 }
00d76abc
KH
1972 if (size & PSEUDOVECTOR_FLAG)
1973 goto badtype;
ca0569ad
RS
1974
1975 PRINTCHAR ('[');
38010d50 1976 {
ca0569ad
RS
1977 register int i;
1978 register Lisp_Object tem;
d311d28c 1979 ptrdiff_t real_size = size;
a40384bc
RS
1980
1981 /* Don't print more elements than the specified maximum. */
42ac1ed4
GM
1982 if (NATNUMP (Vprint_length)
1983 && XFASTINT (Vprint_length) < size)
1984 size = XFASTINT (Vprint_length);
a40384bc 1985
ca0569ad
RS
1986 for (i = 0; i < size; i++)
1987 {
1988 if (i) PRINTCHAR (' ');
28be1ada 1989 tem = AREF (obj, i);
0f25ecc6 1990 print_object (tem, printcharfun, escapeflag);
ca0569ad 1991 }
d6ac884e 1992 if (size < real_size)
1db5b1ad 1993 strout (" ...", 4, 4, printcharfun);
38010d50 1994 }
ca0569ad
RS
1995 PRINTCHAR (']');
1996 }
1997 break;
1998
ca0569ad 1999 case Lisp_Misc:
5db20f08 2000 switch (XMISCTYPE (obj))
38010d50 2001 {
00d76abc 2002 case Lisp_Misc_Marker:
1db5b1ad 2003 strout ("#<marker ", -1, -1, printcharfun);
087e3c46
KH
2004 /* Do you think this is necessary? */
2005 if (XMARKER (obj)->insertion_type != 0)
1db5b1ad 2006 strout ("(moves after insertion) ", -1, -1, printcharfun);
cd3587c1 2007 if (! XMARKER (obj)->buffer)
1db5b1ad 2008 strout ("in no buffer", -1, -1, printcharfun);
ca0569ad
RS
2009 else
2010 {
99027bdd
PE
2011 int len = sprintf (buf, "at %"pD"d", marker_position (obj));
2012 strout (buf, len, len, printcharfun);
1db5b1ad 2013 strout (" in ", -1, -1, printcharfun);
4b4deea2 2014 print_string (BVAR (XMARKER (obj)->buffer, name), printcharfun);
ca0569ad 2015 }
38010d50 2016 PRINTCHAR ('>');
908b0ae5 2017 break;
00d76abc
KH
2018
2019 case Lisp_Misc_Overlay:
1db5b1ad 2020 strout ("#<overlay ", -1, -1, printcharfun);
cd3587c1 2021 if (! XMARKER (OVERLAY_START (obj))->buffer)
1db5b1ad 2022 strout ("in no buffer", -1, -1, printcharfun);
ca0569ad
RS
2023 else
2024 {
99027bdd
PE
2025 int len = sprintf (buf, "from %"pD"d to %"pD"d in ",
2026 marker_position (OVERLAY_START (obj)),
2027 marker_position (OVERLAY_END (obj)));
2028 strout (buf, len, len, printcharfun);
4b4deea2 2029 print_string (BVAR (XMARKER (OVERLAY_START (obj))->buffer, name),
ca0569ad
RS
2030 printcharfun);
2031 }
2032 PRINTCHAR ('>');
908b0ae5 2033 break;
00d76abc
KH
2034
2035 /* Remaining cases shouldn't happen in normal usage, but let's print
2036 them anyway for the benefit of the debugger. */
2037 case Lisp_Misc_Free:
1db5b1ad 2038 strout ("#<misc free cell>", -1, -1, printcharfun);
00d76abc
KH
2039 break;
2040
c069fee4 2041 case Lisp_Misc_Save_Value:
1db5b1ad 2042 strout ("#<save_value ", -1, -1, printcharfun);
99027bdd
PE
2043 {
2044 int len = sprintf (buf, "ptr=%p int=%"pD"d",
2045 XSAVE_VALUE (obj)->pointer,
2046 XSAVE_VALUE (obj)->integer);
2047 strout (buf, len, len, printcharfun);
2048 }
c069fee4
KS
2049 PRINTCHAR ('>');
2050 break;
2051
00d76abc
KH
2052 default:
2053 goto badtype;
e0f93814 2054 }
00d76abc 2055 break;
ca0569ad
RS
2056
2057 default:
00d76abc 2058 badtype:
ca0569ad 2059 {
99027bdd 2060 int len;
ca0569ad
RS
2061 /* We're in trouble if this happens!
2062 Probably should just abort () */
1db5b1ad 2063 strout ("#<EMACS BUG: INVALID DATATYPE ", -1, -1, printcharfun);
00d76abc 2064 if (MISCP (obj))
99027bdd 2065 len = sprintf (buf, "(MISC 0x%04x)", (int) XMISCTYPE (obj));
00d76abc 2066 else if (VECTORLIKEP (obj))
99027bdd 2067 len = sprintf (buf, "(PVEC 0x%08"pD"x)", ASIZE (obj));
00d76abc 2068 else
99027bdd
PE
2069 len = sprintf (buf, "(0x%02x)", (int) XTYPE (obj));
2070 strout (buf, len, len, printcharfun);
ca0569ad 2071 strout (" Save your buffers immediately and please report this bug>",
1db5b1ad 2072 -1, -1, printcharfun);
ca0569ad 2073 }
38010d50
JB
2074 }
2075
2076 print_depth--;
2077}
2078\f
7651e1f5
RS
2079
2080/* Print a description of INTERVAL using PRINTCHARFUN.
2081 This is part of printing a string that has text properties. */
2082
2083void
971de7fb 2084print_interval (INTERVAL interval, Lisp_Object printcharfun)
7651e1f5 2085{
71ea13cb
KH
2086 if (NILP (interval->plist))
2087 return;
30503c0b 2088 PRINTCHAR (' ');
0f25ecc6 2089 print_object (make_number (interval->position), printcharfun, 1);
7651e1f5 2090 PRINTCHAR (' ');
0f25ecc6 2091 print_object (make_number (interval->position + LENGTH (interval)),
cd3587c1 2092 printcharfun, 1);
7651e1f5 2093 PRINTCHAR (' ');
0f25ecc6 2094 print_object (interval->plist, printcharfun, 1);
7651e1f5
RS
2095}
2096
7651e1f5 2097\f
38010d50 2098void
971de7fb 2099syms_of_print (void)
38010d50 2100{
cd3520a4 2101 DEFSYM (Qtemp_buffer_setup_hook, "temp-buffer-setup-hook");
d9c21094 2102
29208e82 2103 DEFVAR_LISP ("standard-output", Vstandard_output,
8c1a1077
PJ
2104 doc: /* Output stream `print' uses by default for outputting a character.
2105This may be any function of one argument.
2106It may also be a buffer (output is inserted before point)
2107or a marker (output is inserted and the marker is advanced)
2108or the symbol t (output appears in the echo area). */);
38010d50 2109 Vstandard_output = Qt;
cd3520a4 2110 DEFSYM (Qstandard_output, "standard-output");
38010d50 2111
29208e82 2112 DEFVAR_LISP ("float-output-format", Vfloat_output_format,
8c1a1077
PJ
2113 doc: /* The format descriptor string used to print floats.
2114This is a %-spec like those accepted by `printf' in C,
2115but with some restrictions. It must start with the two characters `%.'.
2116After that comes an integer precision specification,
2117and then a letter which controls the format.
2118The letters allowed are `e', `f' and `g'.
2119Use `e' for exponential notation \"DIG.DIGITSeEXPT\"
2120Use `f' for decimal point notation \"DIGITS.DIGITS\".
2121Use `g' to choose the shorter of those two formats for the number at hand.
2122The precision in any of these cases is the number of digits following
2123the decimal point. With `f', a precision of 0 means to omit the
2124decimal point. 0 is not allowed with `e' or `g'.
2125
2126A value of nil means to use the shortest notation
2127that represents the number without losing information. */);
38010d50 2128 Vfloat_output_format = Qnil;
cd3520a4 2129 DEFSYM (Qfloat_output_format, "float-output-format");
38010d50 2130
29208e82 2131 DEFVAR_LISP ("print-length", Vprint_length,
8c1a1077
PJ
2132 doc: /* Maximum length of list to print before abbreviating.
2133A value of nil means no limit. See also `eval-expression-print-length'. */);
38010d50
JB
2134 Vprint_length = Qnil;
2135
29208e82 2136 DEFVAR_LISP ("print-level", Vprint_level,
8c1a1077
PJ
2137 doc: /* Maximum depth of list nesting to print before abbreviating.
2138A value of nil means no limit. See also `eval-expression-print-level'. */);
38010d50
JB
2139 Vprint_level = Qnil;
2140
29208e82 2141 DEFVAR_BOOL ("print-escape-newlines", print_escape_newlines,
8c1a1077
PJ
2142 doc: /* Non-nil means print newlines in strings as `\\n'.
2143Also print formfeeds as `\\f'. */);
38010d50
JB
2144 print_escape_newlines = 0;
2145
29208e82 2146 DEFVAR_BOOL ("print-escape-nonascii", print_escape_nonascii,
8c1a1077
PJ
2147 doc: /* Non-nil means print unibyte non-ASCII chars in strings as \\OOO.
2148\(OOO is the octal representation of the character code.)
249c0f71
RS
2149Only single-byte characters are affected, and only in `prin1'.
2150When the output goes in a multibyte buffer, this feature is
2151enabled regardless of the value of the variable. */);
38940e93
RS
2152 print_escape_nonascii = 0;
2153
29208e82 2154 DEFVAR_BOOL ("print-escape-multibyte", print_escape_multibyte,
8c1a1077
PJ
2155 doc: /* Non-nil means print multibyte characters in strings as \\xXXXX.
2156\(XXXX is the hex representation of the character code.)
2157This affects only `prin1'. */);
835d0be6
RS
2158 print_escape_multibyte = 0;
2159
29208e82 2160 DEFVAR_BOOL ("print-quoted", print_quoted,
8c1a1077 2161 doc: /* Non-nil means print quoted forms with reader syntax.
db75cb5f 2162I.e., (quote foo) prints as 'foo, (function foo) as #'foo. */);
2f100b5c
EN
2163 print_quoted = 0;
2164
29208e82 2165 DEFVAR_LISP ("print-gensym", Vprint_gensym,
8c1a1077
PJ
2166 doc: /* Non-nil means print uninterned symbols so they will read as uninterned.
2167I.e., the value of (make-symbol \"foobar\") prints as #:foobar.
2168When the uninterned symbol appears within a recursive data structure,
2169and the symbol appears more than once, in addition use the #N# and #N=
2170constructs as needed, so that multiple references to the same symbol are
2171shared once again when the text is read back. */);
e0f69431
RS
2172 Vprint_gensym = Qnil;
2173
29208e82 2174 DEFVAR_LISP ("print-circle", Vprint_circle,
fb7ada5f 2175 doc: /* Non-nil means print recursive structures using #N= and #N# syntax.
8c1a1077
PJ
2176If nil, printing proceeds recursively and may lead to
2177`max-lisp-eval-depth' being exceeded or an error may occur:
2178\"Apparently circular structure being printed.\" Also see
2179`print-length' and `print-level'.
2180If non-nil, shared substructures anywhere in the structure are printed
2181with `#N=' before the first occurrence (in the order of the print
2182representation) and `#N#' in place of each subsequent occurrence,
2183where N is a positive decimal integer. */);
0f25ecc6
RS
2184 Vprint_circle = Qnil;
2185
29208e82 2186 DEFVAR_LISP ("print-continuous-numbering", Vprint_continuous_numbering,
fb7ada5f 2187 doc: /* Non-nil means number continuously across print calls.
8c1a1077
PJ
2188This affects the numbers printed for #N= labels and #M# references.
2189See also `print-circle', `print-gensym', and `print-number-table'.
2190This variable should not be set with `setq'; bind it with a `let' instead. */);
0f25ecc6
RS
2191 Vprint_continuous_numbering = Qnil;
2192
29208e82 2193 DEFVAR_LISP ("print-number-table", Vprint_number_table,
8c1a1077
PJ
2194 doc: /* A vector used internally to produce `#N=' labels and `#N#' references.
2195The Lisp printer uses this vector to detect Lisp objects referenced more
e6d4cddd
RS
2196than once.
2197
2198When you bind `print-continuous-numbering' to t, you should probably
2199also bind `print-number-table' to nil. This ensures that the value of
2200`print-number-table' can be garbage-collected once the printing is
2201done. If all elements of `print-number-table' are nil, it means that
2202the printing done so far has not found any shared structure or objects
2203that need to be recorded in the table. */);
0f25ecc6 2204 Vprint_number_table = Qnil;
081e0581 2205
29208e82 2206 DEFVAR_LISP ("print-charset-text-property", Vprint_charset_text_property,
71ea13cb
KH
2207 doc: /* A flag to control printing of `charset' text property on printing a string.
2208The value must be nil, t, or `default'.
2209
2210If the value is nil, don't print the text property `charset'.
2211
2212If the value is t, always print the text property `charset'.
2213
2214If the value is `default', print the text property `charset' only when
2215the value is different from what is guessed in the current charset
dedbd91c 2216priorities. */);
71ea13cb
KH
2217 Vprint_charset_text_property = Qdefault;
2218
38010d50
JB
2219 /* prin1_to_string_buffer initialized in init_buffer_once in buffer.c */
2220 staticpro (&Vprin1_to_string_buffer);
2221
2222 defsubr (&Sprin1);
2223 defsubr (&Sprin1_to_string);
113620cc 2224 defsubr (&Serror_message_string);
38010d50
JB
2225 defsubr (&Sprinc);
2226 defsubr (&Sprint);
2227 defsubr (&Sterpri);
2228 defsubr (&Swrite_char);
2229 defsubr (&Sexternal_debugging_output);
6b61353c
KH
2230#ifdef WITH_REDIRECT_DEBUGGING_OUTPUT
2231 defsubr (&Sredirect_debugging_output);
2232#endif
38010d50 2233
cd3520a4
JB
2234 DEFSYM (Qexternal_debugging_output, "external-debugging-output");
2235 DEFSYM (Qprint_escape_newlines, "print-escape-newlines");
2236 DEFSYM (Qprint_escape_multibyte, "print-escape-multibyte");
2237 DEFSYM (Qprint_escape_nonascii, "print-escape-nonascii");
835d0be6 2238
71ea13cb
KH
2239 print_prune_charset_plist = Qnil;
2240 staticpro (&print_prune_charset_plist);
38010d50 2241}