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