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