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