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