* lisp.h (DEFINE_FUNC): Make sname 'static'.
[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
d9c21094
RS
42Lisp_Object Qtemp_buffer_setup_hook;
43
2f100b5c 44/* These are used to print like we read. */
2f100b5c 45
29208e82 46Lisp_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
JB
60/* Avoid actual stack overflow in print. */
61int print_depth;
62
a22dec27
SM
63/* Level of nesting inside outputting backquote in new style. */
64int new_backquote_output;
0330bb60 65
ec838c39
RS
66/* Detect most circularities to print finite output. */
67#define PRINT_CIRCLE 200
68Lisp_Object being_printed[PRINT_CIRCLE];
69
6fec5601
RS
70/* When printing into a buffer, first we put the text in this
71 block, then insert it all at once. */
72char *print_buffer;
73
74/* Size allocated in print_buffer. */
db063399 75EMACS_INT print_buffer_size;
dc2a0b79 76/* Chars stored in print_buffer. */
db063399 77EMACS_INT print_buffer_pos;
dc2a0b79 78/* Bytes stored in print_buffer. */
db063399 79EMACS_INT print_buffer_pos_byte;
6fec5601 80
835d0be6
RS
81Lisp_Object Qprint_escape_newlines;
82Lisp_Object Qprint_escape_multibyte, Qprint_escape_nonascii;
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. */
0f25ecc6 92int print_number_index;
971de7fb 93void 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
KR
383 chars = SBYTES (string);
384 bytes = parse_str_to_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
16a97296 529DEFUE ("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
16a97296 544DEFUE ("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
16a97296 582DEFUE ("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
16a97296 639DEFUE ("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
16a97296 673DEFUE ("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
dae581bf 741void
971de7fb 742debug_output_compilation_hack (int x)
c33f8948
RS
743{
744 print_output_debug_flag = x;
745}
6b61353c 746
cd3587c1 747#if defined (GNU_LINUX)
6b61353c
KH
748
749/* This functionality is not vitally important in general, so we rely on
750 non-portable ability to use stderr as lvalue. */
751
752#define WITH_REDIRECT_DEBUGGING_OUTPUT 1
753
754FILE *initial_stderr_stream = NULL;
755
756DEFUN ("redirect-debugging-output", Fredirect_debugging_output, Sredirect_debugging_output,
757 1, 2,
758 "FDebug output file: \nP",
759 doc: /* Redirect debugging output (stderr stream) to file FILE.
760If FILE is nil, reset target to the initial stderr stream.
761Optional arg APPEND non-nil (interactively, with prefix arg) means
28b8f740 762append to existing target file. */)
5842a27b 763 (Lisp_Object file, Lisp_Object append)
6b61353c
KH
764{
765 if (initial_stderr_stream != NULL)
f9467be3
YM
766 {
767 BLOCK_INPUT;
768 fclose (stderr);
769 UNBLOCK_INPUT;
770 }
6b61353c
KH
771 stderr = initial_stderr_stream;
772 initial_stderr_stream = NULL;
773
774 if (STRINGP (file))
775 {
776 file = Fexpand_file_name (file, Qnil);
777 initial_stderr_stream = stderr;
d4d7173a 778 stderr = fopen (SSDATA (file), NILP (append) ? "w" : "a");
6b61353c
KH
779 if (stderr == NULL)
780 {
781 stderr = initial_stderr_stream;
782 initial_stderr_stream = NULL;
783 report_file_error ("Cannot open debugging output stream",
784 Fcons (file, Qnil));
785 }
786 }
787 return Qnil;
788}
789#endif /* GNU_LINUX */
790
791
cf1bb91b
RS
792/* This is the interface for debugging printing. */
793
794void
971de7fb 795debug_print (Lisp_Object arg)
cf1bb91b
RS
796{
797 Fprin1 (arg, Qexternal_debugging_output);
3684eb78 798 fprintf (stderr, "\r\n");
cf1bb91b 799}
bd90dcd0
KS
800
801void
971de7fb 802safe_debug_print (Lisp_Object arg)
bd90dcd0
KS
803{
804 int valid = valid_lisp_object_p (arg);
805
806 if (valid > 0)
807 debug_print (arg);
808 else
809 fprintf (stderr, "#<%s_LISP_OBJECT 0x%08lx>\r\n",
810 !valid ? "INVALID" : "SOME",
4c37a414 811 (unsigned long) XHASH (arg)
bd90dcd0
KS
812 );
813}
814
38010d50 815\f
16a97296 816DEFUE ("error-message-string", Ferror_message_string, Serror_message_string,
113620cc 817 1, 1, 0,
6b61353c
KH
818 doc: /* Convert an error value (ERROR-SYMBOL . DATA) to an error message.
819See Info anchor `(elisp)Definition of signal' for some details on how this
820error message is constructed. */)
5842a27b 821 (Lisp_Object obj)
113620cc
KH
822{
823 struct buffer *old = current_buffer;
63fbf4ff 824 Lisp_Object value;
113620cc
KH
825 struct gcpro gcpro1;
826
0872e11f
RS
827 /* If OBJ is (error STRING), just return STRING.
828 That is not only faster, it also avoids the need to allocate
829 space here when the error is due to memory full. */
94b342ce
KR
830 if (CONSP (obj) && EQ (XCAR (obj), Qerror)
831 && CONSP (XCDR (obj))
832 && STRINGP (XCAR (XCDR (obj)))
833 && NILP (XCDR (XCDR (obj))))
834 return XCAR (XCDR (obj));
0872e11f 835
240e806c 836 print_error_message (obj, Vprin1_to_string_buffer, 0, Qnil);
113620cc
KH
837
838 set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
839 value = Fbuffer_string ();
840
841 GCPRO1 (value);
842 Ferase_buffer ();
843 set_buffer_internal (old);
844 UNGCPRO;
845
846 return value;
847}
848
c02279de 849/* Print an error message for the error DATA onto Lisp output stream
7ab56fea
RS
850 STREAM (suitable for the print functions).
851 CONTEXT is a C string describing the context of the error.
852 CALLER is the Lisp function inside which the error was signaled. */
113620cc 853
dc22f25e 854void
a8fe7202
AS
855print_error_message (Lisp_Object data, Lisp_Object stream, const char *context,
856 Lisp_Object caller)
113620cc
KH
857{
858 Lisp_Object errname, errmsg, file_error, tail;
859 struct gcpro gcpro1;
860 int i;
861
240e806c
RS
862 if (context != 0)
863 write_string_1 (context, -1, stream);
864
865 /* If we know from where the error was signaled, show it in
866 *Messages*. */
867 if (!NILP (caller) && SYMBOLP (caller))
868 {
11fb15d5
KS
869 Lisp_Object cname = SYMBOL_NAME (caller);
870 char *name = alloca (SBYTES (cname));
72af86bd 871 memcpy (name, SDATA (cname), SBYTES (cname));
826256dd 872 message_dolog (name, SBYTES (cname), 0, 0);
240e806c
RS
873 message_dolog (": ", 2, 0, 0);
874 }
875
113620cc
KH
876 errname = Fcar (data);
877
878 if (EQ (errname, Qerror))
879 {
880 data = Fcdr (data);
c02279de
GM
881 if (!CONSP (data))
882 data = Qnil;
113620cc
KH
883 errmsg = Fcar (data);
884 file_error = Qnil;
885 }
886 else
887 {
c02279de 888 Lisp_Object error_conditions;
113620cc 889 errmsg = Fget (errname, Qerror_message);
c02279de
GM
890 error_conditions = Fget (errname, Qerror_conditions);
891 file_error = Fmemq (Qfile_error, error_conditions);
113620cc
KH
892 }
893
894 /* Print an error message including the data items. */
895
896 tail = Fcdr_safe (data);
897 GCPRO1 (tail);
898
899 /* For file-error, make error message by concatenating
900 all the data items. They are all strings. */
8c29413d 901 if (!NILP (file_error) && CONSP (tail))
94b342ce 902 errmsg = XCAR (tail), tail = XCDR (tail);
113620cc
KH
903
904 if (STRINGP (errmsg))
905 Fprinc (errmsg, stream);
906 else
907 write_string_1 ("peculiar error", -1, stream);
908
e7b9e80f 909 for (i = 0; CONSP (tail); tail = XCDR (tail), i = 1)
113620cc 910 {
c02279de
GM
911 Lisp_Object obj;
912
113620cc 913 write_string_1 (i ? ", " : ": ", 2, stream);
c02279de
GM
914 obj = XCAR (tail);
915 if (!NILP (file_error) || EQ (errname, Qend_of_file))
916 Fprinc (obj, stream);
113620cc 917 else
c02279de 918 Fprin1 (obj, stream);
113620cc 919 }
177c0ea7 920
113620cc
KH
921 UNGCPRO;
922}
38010d50 923
c02279de
GM
924
925\f
38010d50 926/*
edb2a707 927 * The buffer should be at least as large as the max string size of the
8e6208c5 928 * largest float, printed in the biggest notation. This is undoubtedly
38010d50
JB
929 * 20d float_output_format, with the negative of the C-constant "HUGE"
930 * from <math.h>.
177c0ea7 931 *
38010d50 932 * On the vax the worst case is -1e38 in 20d format which takes 61 bytes.
177c0ea7 933 *
38010d50
JB
934 * I assume that IEEE-754 format numbers can take 329 bytes for the worst
935 * case of -1e307 in 20d float_output_format. What is one to do (short of
936 * re-writing _doprnt to be more sane)?
937 * -wsr
6e8e6bf2 938 * Given the above, the buffer must be least FLOAT_TO_STRING_BUFSIZE bytes.
38010d50 939 */
edb2a707
RS
940
941void
57ace6d0 942float_to_string (char *buf, double data)
38010d50 943{
57ace6d0 944 char *cp;
322890c4 945 int width;
177c0ea7 946
7f45de2d
RS
947 /* Check for plus infinity in a way that won't lose
948 if there is no plus infinity. */
949 if (data == data / 2 && data > 1.0)
950 {
951 strcpy (buf, "1.0e+INF");
952 return;
953 }
954 /* Likewise for minus infinity. */
955 if (data == data / 2 && data < -1.0)
956 {
957 strcpy (buf, "-1.0e+INF");
958 return;
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. */
965 int i;
966 union { double d; char c[sizeof (double)]; } u_data, u_minus_zero;
967 u_data.d = data;
968 u_minus_zero.d = - 0.0;
969 for (i = 0; i < sizeof (double); i++)
970 if (u_data.c[i] & u_minus_zero.c[i])
971 {
972 *buf++ = '-';
973 break;
974 }
177c0ea7 975
7f45de2d
RS
976 strcpy (buf, "0.0e+NaN");
977 return;
978 }
979
10eebdbb 980 if (NILP (Vfloat_output_format)
d4ae1f7e 981 || !STRINGP (Vfloat_output_format))
38010d50 982 lose:
322890c4 983 {
f356c3fb 984 /* Generate the fewest number of digits that represent the
6e8e6bf2 985 floating point value without losing information. */
75b43359
MWD
986 dtoastr (buf, FLOAT_TO_STRING_BUFSIZE - 2, 0, 0, data);
987 /* The decimal point must be printed, or the byte compiler can
988 get confused (Bug#8033). */
989 width = 1;
322890c4 990 }
38010d50
JB
991 else /* oink oink */
992 {
993 /* Check that the spec we have is fully valid.
994 This means not only valid for printf,
995 but meant for floats, and reasonable. */
57ace6d0 996 cp = SSDATA (Vfloat_output_format);
38010d50
JB
997
998 if (cp[0] != '%')
999 goto lose;
1000 if (cp[1] != '.')
1001 goto lose;
1002
1003 cp += 2;
c7b14277
JB
1004
1005 /* Check the width specification. */
322890c4 1006 width = -1;
c7b14277 1007 if ('0' <= *cp && *cp <= '9')
381cd4bb
KH
1008 {
1009 width = 0;
1010 do
1011 width = (width * 10) + (*cp++ - '0');
1012 while (*cp >= '0' && *cp <= '9');
1013
1014 /* A precision of zero is valid only for %f. */
1015 if (width > DBL_DIG
1016 || (width == 0 && *cp != 'f'))
1017 goto lose;
1018 }
38010d50
JB
1019
1020 if (*cp != 'e' && *cp != 'f' && *cp != 'g')
1021 goto lose;
1022
38010d50
JB
1023 if (cp[1] != 0)
1024 goto lose;
1025
42a5b22f 1026 sprintf (buf, SSDATA (Vfloat_output_format), data);
38010d50 1027 }
edb2a707 1028
c7b14277
JB
1029 /* Make sure there is a decimal point with digit after, or an
1030 exponent, so that the value is readable as a float. But don't do
322890c4
RS
1031 this with "%.0f"; it's valid for that not to produce a decimal
1032 point. Note that width can be 0 only for %.0f. */
1033 if (width != 0)
0601fd3d 1034 {
c7b14277
JB
1035 for (cp = buf; *cp; cp++)
1036 if ((*cp < '0' || *cp > '9') && *cp != '-')
1037 break;
0601fd3d 1038
c7b14277
JB
1039 if (*cp == '.' && cp[1] == 0)
1040 {
1041 cp[1] = '0';
1042 cp[2] = 0;
1043 }
75b43359 1044 else if (*cp == 0)
c7b14277
JB
1045 {
1046 *cp++ = '.';
1047 *cp++ = '0';
1048 *cp++ = 0;
1049 }
edb2a707 1050 }
38010d50 1051}
cc94f3b2 1052
38010d50
JB
1053\f
1054static void
971de7fb 1055print (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag)
38010d50 1056{
a22dec27 1057 new_backquote_output = 0;
38010d50 1058
0f25ecc6
RS
1059 /* Reset print_number_index and Vprint_number_table only when
1060 the variable Vprint_continuous_numbering is nil. Otherwise,
1061 the values of these variables will be kept between several
1062 print functions. */
e026eb89
KS
1063 if (NILP (Vprint_continuous_numbering)
1064 || NILP (Vprint_number_table))
0f25ecc6
RS
1065 {
1066 print_number_index = 0;
1067 Vprint_number_table = Qnil;
1068 }
38010d50 1069
0f25ecc6
RS
1070 /* Construct Vprint_number_table for print-gensym and print-circle. */
1071 if (!NILP (Vprint_gensym) || !NILP (Vprint_circle))
ec838c39 1072 {
e6d4cddd
RS
1073 /* Construct Vprint_number_table.
1074 This increments print_number_index for the objects added. */
9a6a4c40 1075 print_depth = 0;
0f25ecc6 1076 print_preprocess (obj);
e6d4cddd 1077
a65b85b5
SM
1078 if (HASH_TABLE_P (Vprint_number_table))
1079 { /* Remove unnecessary objects, which appear only once in OBJ;
1080 that is, whose status is Qt.
1081 Maybe a better way to do that is to copy elements to
1082 a new hash table. */
1083 struct Lisp_Hash_Table *h = XHASH_TABLE (Vprint_number_table);
1084 int i;
e6d4cddd 1085
a65b85b5
SM
1086 for (i = 0; i < HASH_TABLE_SIZE (h); ++i)
1087 if (!NILP (HASH_HASH (h, i))
1088 && EQ (HASH_VALUE (h, i), Qt))
1089 Fremhash (HASH_KEY (h, i), Vprint_number_table);
1090 }
0f25ecc6
RS
1091 }
1092
9a6a4c40 1093 print_depth = 0;
0f25ecc6
RS
1094 print_object (obj, printcharfun, escapeflag);
1095}
1096
fb103ca9
SM
1097#define PRINT_CIRCLE_CANDIDATE_P(obj) \
1098 (STRINGP (obj) || CONSP (obj) \
1099 || (VECTORLIKEP (obj) \
1100 && (VECTORP (obj) || COMPILEDP (obj) \
1101 || CHAR_TABLE_P (obj) || SUB_CHAR_TABLE_P (obj) \
1102 || HASH_TABLE_P (obj) || FONTP (obj))) \
1103 || (! NILP (Vprint_gensym) \
1104 && SYMBOLP (obj) \
1105 && !SYMBOL_INTERNED_P (obj)))
1106
0f25ecc6
RS
1107/* Construct Vprint_number_table according to the structure of OBJ.
1108 OBJ itself and all its elements will be added to Vprint_number_table
1109 recursively if it is a list, vector, compiled function, char-table,
1110 string (its text properties will be traced), or a symbol that has
1111 no obarray (this is for the print-gensym feature).
1112 The status fields of Vprint_number_table mean whether each object appears
1113 more than once in OBJ: Qnil at the first time, and Qt after that . */
1114static void
971de7fb 1115print_preprocess (Lisp_Object obj)
0f25ecc6 1116{
6b61353c
KH
1117 int i;
1118 EMACS_INT size;
c1132671
RS
1119 int loop_count = 0;
1120 Lisp_Object halftail;
1121
15479e8b
RS
1122 /* Give up if we go so deep that print_object will get an error. */
1123 /* See similar code in print_object. */
1124 if (print_depth >= PRINT_CIRCLE)
6b8dfbf7 1125 error ("Apparently circular structure being printed");
15479e8b 1126
c1132671
RS
1127 /* Avoid infinite recursion for circular nested structure
1128 in the case where Vprint_circle is nil. */
1129 if (NILP (Vprint_circle))
1130 {
1131 for (i = 0; i < print_depth; i++)
1132 if (EQ (obj, being_printed[i]))
1133 return;
1134 being_printed[print_depth] = obj;
1135 }
1136
c1132671
RS
1137 print_depth++;
1138 halftail = obj;
0f25ecc6
RS
1139
1140 loop:
fb103ca9 1141 if (PRINT_CIRCLE_CANDIDATE_P (obj))
0f25ecc6 1142 {
a65b85b5
SM
1143 if (!HASH_TABLE_P (Vprint_number_table))
1144 {
1145 Lisp_Object args[2];
1146 args[0] = QCtest;
1147 args[1] = Qeq;
1148 Vprint_number_table = Fmake_hash_table (2, args);
1149 }
1150
aca2020b
KH
1151 /* In case print-circle is nil and print-gensym is t,
1152 add OBJ to Vprint_number_table only when OBJ is a symbol. */
1153 if (! NILP (Vprint_circle) || SYMBOLP (obj))
0f25ecc6 1154 {
a65b85b5
SM
1155 Lisp_Object num = Fgethash (obj, Vprint_number_table, Qnil);
1156 if (!NILP (num)
1157 /* If Vprint_continuous_numbering is non-nil and OBJ is a gensym,
1158 always print the gensym with a number. This is a special for
1159 the lisp function byte-compile-output-docform. */
1160 || (!NILP (Vprint_continuous_numbering)
1161 && SYMBOLP (obj)
1162 && !SYMBOL_INTERNED_P (obj)))
1163 { /* OBJ appears more than once. Let's remember that. */
17870c01 1164 if (!INTEGERP (num))
aca2020b 1165 {
a65b85b5
SM
1166 print_number_index++;
1167 /* Negative number indicates it hasn't been printed yet. */
1168 Fputhash (obj, make_number (- print_number_index),
1169 Vprint_number_table);
aca2020b 1170 }
a65b85b5
SM
1171 print_depth--;
1172 return;
0f25ecc6 1173 }
a65b85b5
SM
1174 else
1175 /* OBJ is not yet recorded. Let's add to the table. */
1176 Fputhash (obj, Qt, Vprint_number_table);
0f25ecc6 1177 }
0f25ecc6 1178
8e50cc2d 1179 switch (XTYPE (obj))
0f25ecc6
RS
1180 {
1181 case Lisp_String:
0f25ecc6 1182 /* A string may have text properties, which can be circular. */
d5db4077 1183 traverse_intervals_noorder (STRING_INTERVALS (obj),
8bbfc258 1184 print_preprocess_string, Qnil);
0f25ecc6
RS
1185 break;
1186
1187 case Lisp_Cons:
c1132671
RS
1188 /* Use HALFTAIL and LOOP_COUNT to detect circular lists,
1189 just as in print_object. */
1190 if (loop_count && EQ (obj, halftail))
1191 break;
0f25ecc6
RS
1192 print_preprocess (XCAR (obj));
1193 obj = XCDR (obj);
c1132671
RS
1194 loop_count++;
1195 if (!(loop_count & 1))
1196 halftail = XCDR (halftail);
0f25ecc6
RS
1197 goto loop;
1198
1199 case Lisp_Vectorlike:
6b61353c
KH
1200 size = XVECTOR (obj)->size;
1201 if (size & PSEUDOVECTOR_FLAG)
1202 size &= PSEUDOVECTOR_SIZE_MASK;
0f25ecc6
RS
1203 for (i = 0; i < size; i++)
1204 print_preprocess (XVECTOR (obj)->contents[i]);
3e0de07f
SM
1205 if (HASH_TABLE_P (obj))
1206 { /* For hash tables, the key_and_value slot is past
a65b85b5
SM
1207 `size' because it needs to be marked specially in case
1208 the table is weak. */
3e0de07f
SM
1209 struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
1210 print_preprocess (h->key_and_value);
1211 }
ee5263af
GM
1212 break;
1213
1214 default:
1215 break;
0f25ecc6
RS
1216 }
1217 }
c1132671 1218 print_depth--;
0f25ecc6
RS
1219}
1220
0f25ecc6 1221static void
971de7fb 1222print_preprocess_string (INTERVAL interval, Lisp_Object arg)
0f25ecc6
RS
1223{
1224 print_preprocess (interval->plist);
1225}
0f25ecc6 1226
971de7fb 1227static void print_check_string_charset_prop (INTERVAL interval, Lisp_Object string);
71ea13cb
KH
1228
1229#define PRINT_STRING_NON_CHARSET_FOUND 1
1230#define PRINT_STRING_UNSAFE_CHARSET_FOUND 2
1231
51e4f4a8 1232/* Bitwise or of the above macros. */
71ea13cb
KH
1233static int print_check_string_result;
1234
1235static void
971de7fb 1236print_check_string_charset_prop (INTERVAL interval, Lisp_Object string)
71ea13cb
KH
1237{
1238 Lisp_Object val;
1239
1240 if (NILP (interval->plist)
1241 || (print_check_string_result == (PRINT_STRING_NON_CHARSET_FOUND
1242 | PRINT_STRING_UNSAFE_CHARSET_FOUND)))
1243 return;
1244 for (val = interval->plist; CONSP (val) && ! EQ (XCAR (val), Qcharset);
1245 val = XCDR (XCDR (val)));
1246 if (! CONSP (val))
1247 {
1248 print_check_string_result |= PRINT_STRING_NON_CHARSET_FOUND;
1249 return;
1250 }
1251 if (! (print_check_string_result & PRINT_STRING_NON_CHARSET_FOUND))
1252 {
1253 if (! EQ (val, interval->plist)
1254 || CONSP (XCDR (XCDR (val))))
1255 print_check_string_result |= PRINT_STRING_NON_CHARSET_FOUND;
1256 }
1257 if (NILP (Vprint_charset_text_property)
1258 || ! (print_check_string_result & PRINT_STRING_UNSAFE_CHARSET_FOUND))
1259 {
1260 int i, c;
db063399
LMI
1261 EMACS_INT charpos = interval->position;
1262 EMACS_INT bytepos = string_char_to_byte (string, charpos);
71ea13cb
KH
1263 Lisp_Object charset;
1264
1265 charset = XCAR (XCDR (val));
1266 for (i = 0; i < LENGTH (interval); i++)
1267 {
1268 FETCH_STRING_CHAR_ADVANCE (c, string, charpos, bytepos);
c80bcdbc
KH
1269 if (! ASCII_CHAR_P (c)
1270 && ! EQ (CHARSET_NAME (CHAR_CHARSET (c)), charset))
71ea13cb
KH
1271 {
1272 print_check_string_result |= PRINT_STRING_UNSAFE_CHARSET_FOUND;
1273 break;
1274 }
1275 }
1276 }
1277}
1278
1279/* The value is (charset . nil). */
1280static Lisp_Object print_prune_charset_plist;
1281
1282static Lisp_Object
971de7fb 1283print_prune_string_charset (Lisp_Object string)
71ea13cb
KH
1284{
1285 print_check_string_result = 0;
1286 traverse_intervals (STRING_INTERVALS (string), 0,
1287 print_check_string_charset_prop, string);
1288 if (! (print_check_string_result & PRINT_STRING_UNSAFE_CHARSET_FOUND))
1289 {
1290 string = Fcopy_sequence (string);
1291 if (print_check_string_result & PRINT_STRING_NON_CHARSET_FOUND)
1292 {
1293 if (NILP (print_prune_charset_plist))
1294 print_prune_charset_plist = Fcons (Qcharset, Qnil);
eabe04c0
KH
1295 Fremove_text_properties (make_number (0),
1296 make_number (SCHARS (string)),
71ea13cb
KH
1297 print_prune_charset_plist, string);
1298 }
1299 else
eabe04c0
KH
1300 Fset_text_properties (make_number (0), make_number (SCHARS (string)),
1301 Qnil, string);
71ea13cb
KH
1302 }
1303 return string;
1304}
1305
0f25ecc6 1306static void
971de7fb 1307print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag)
0f25ecc6 1308{
28b8f740 1309 char buf[40];
0f25ecc6
RS
1310
1311 QUIT;
1312
76afdf7e 1313 /* See similar code in print_preprocess. */
51dc79f8 1314 if (print_depth >= PRINT_CIRCLE)
76afdf7e
CY
1315 error ("Apparently circular structure being printed");
1316
0f25ecc6 1317 /* Detect circularities and truncate them. */
fb103ca9 1318 if (PRINT_CIRCLE_CANDIDATE_P (obj))
0f25ecc6
RS
1319 {
1320 if (NILP (Vprint_circle) && NILP (Vprint_gensym))
1321 {
1322 /* Simple but incomplete way. */
1323 int i;
1324 for (i = 0; i < print_depth; i++)
1325 if (EQ (obj, being_printed[i]))
1326 {
1327 sprintf (buf, "#%d", i);
1db5b1ad 1328 strout (buf, -1, -1, printcharfun);
0f25ecc6
RS
1329 return;
1330 }
1331 being_printed[print_depth] = obj;
1332 }
1333 else
1334 {
1335 /* With the print-circle feature. */
a65b85b5
SM
1336 Lisp_Object num = Fgethash (obj, Vprint_number_table, Qnil);
1337 if (INTEGERP (num))
1338 {
1339 int n = XINT (num);
1340 if (n < 0)
1341 { /* Add a prefix #n= if OBJ has not yet been printed;
1342 that is, its status field is nil. */
1343 sprintf (buf, "#%d=", -n);
1db5b1ad 1344 strout (buf, -1, -1, printcharfun);
a65b85b5
SM
1345 /* OBJ is going to be printed. Remember that fact. */
1346 Fputhash (obj, make_number (- n), Vprint_number_table);
1347 }
1348 else
1349 {
1350 /* Just print #n# if OBJ has already been printed. */
1351 sprintf (buf, "#%d#", n);
1db5b1ad 1352 strout (buf, -1, -1, printcharfun);
a65b85b5
SM
1353 return;
1354 }
1355 }
0f25ecc6 1356 }
ec838c39 1357 }
ec838c39 1358
38010d50
JB
1359 print_depth++;
1360
8e50cc2d 1361 switch (XTYPE (obj))
38010d50 1362 {
2de9f71c 1363 case_Lisp_Int:
b8180922 1364 if (sizeof (int) == sizeof (EMACS_INT))
6af1696d 1365 sprintf (buf, "%d", (int) XINT (obj));
b8180922 1366 else if (sizeof (long) == sizeof (EMACS_INT))
63fbf4ff 1367 sprintf (buf, "%ld", (long) XINT (obj));
b8180922
RS
1368 else
1369 abort ();
1db5b1ad 1370 strout (buf, -1, -1, printcharfun);
ca0569ad
RS
1371 break;
1372
ca0569ad
RS
1373 case Lisp_Float:
1374 {
6e8e6bf2 1375 char pigbuf[FLOAT_TO_STRING_BUFSIZE];
38010d50 1376
94b342ce 1377 float_to_string (pigbuf, XFLOAT_DATA (obj));
1db5b1ad 1378 strout (pigbuf, -1, -1, printcharfun);
ca0569ad
RS
1379 }
1380 break;
ca0569ad
RS
1381
1382 case Lisp_String:
38010d50
JB
1383 if (!escapeflag)
1384 print_string (obj, printcharfun);
1385 else
1386 {
47553fa8 1387 register EMACS_INT i_byte;
38010d50 1388 struct gcpro gcpro1;
872a36d2 1389 unsigned char *str;
db063399 1390 EMACS_INT size_byte;
453fa987
RS
1391 /* 1 means we must ensure that the next character we output
1392 cannot be taken as part of a hex character escape. */
1393 int need_nonhex = 0;
db300f59 1394 int multibyte = STRING_MULTIBYTE (obj);
38010d50 1395
7651e1f5
RS
1396 GCPRO1 (obj);
1397
71ea13cb
KH
1398 if (! EQ (Vprint_charset_text_property, Qt))
1399 obj = print_prune_string_charset (obj);
1400
d5db4077 1401 if (!NULL_INTERVAL_P (STRING_INTERVALS (obj)))
7651e1f5
RS
1402 {
1403 PRINTCHAR ('#');
1404 PRINTCHAR ('(');
1405 }
38010d50
JB
1406
1407 PRINTCHAR ('\"');
d5db4077
KR
1408 str = SDATA (obj);
1409 size_byte = SBYTES (obj);
dc2a0b79 1410
47553fa8 1411 for (i_byte = 0; i_byte < size_byte;)
38010d50 1412 {
6ddd6eee
RS
1413 /* Here, we must convert each multi-byte form to the
1414 corresponding character code before handing it to PRINTCHAR. */
1415 int len;
dc2a0b79
RS
1416 int c;
1417
db300f59 1418 if (multibyte)
872a36d2 1419 {
62a6e103 1420 c = STRING_CHAR_AND_LENGTH (str + i_byte, len);
8b4b4467 1421 i_byte += len;
872a36d2 1422 }
dc2a0b79 1423 else
872a36d2 1424 c = str[i_byte++];
dc2a0b79 1425
38010d50 1426 QUIT;
6ddd6eee 1427
38010d50
JB
1428 if (c == '\n' && print_escape_newlines)
1429 {
1430 PRINTCHAR ('\\');
1431 PRINTCHAR ('n');
1432 }
c6f7982f
RM
1433 else if (c == '\f' && print_escape_newlines)
1434 {
1435 PRINTCHAR ('\\');
1436 PRINTCHAR ('f');
1437 }
ae7367d3 1438 else if (multibyte
42a5b22f 1439 && (CHAR_BYTE8_P (c)
73af357a 1440 || (! ASCII_CHAR_P (c) && print_escape_multibyte)))
dc2a0b79
RS
1441 {
1442 /* When multibyte is disabled,
ae7367d3
RS
1443 print multibyte string chars using hex escapes.
1444 For a char code that could be in a unibyte string,
1445 when found in a multibyte string, always use a hex escape
1446 so it reads back as multibyte. */
09125ef8 1447 char outbuf[50];
8b4b4467
KH
1448
1449 if (CHAR_BYTE8_P (c))
1450 sprintf (outbuf, "\\%03o", CHAR_TO_BYTE8 (c));
1451 else
8f924df7
KH
1452 {
1453 sprintf (outbuf, "\\x%04x", c);
1454 need_nonhex = 1;
1455 }
1db5b1ad 1456 strout (outbuf, -1, -1, printcharfun);
dc2a0b79 1457 }
db300f59
RS
1458 else if (! multibyte
1459 && SINGLE_BYTE_CHAR_P (c) && ! ASCII_BYTE_P (c)
835d0be6 1460 && print_escape_nonascii)
974a6ff5 1461 {
835d0be6
RS
1462 /* When printing in a multibyte buffer
1463 or when explicitly requested,
974a6ff5
KH
1464 print single-byte non-ASCII string chars
1465 using octal escapes. */
09125ef8 1466 char outbuf[5];
974a6ff5 1467 sprintf (outbuf, "\\%03o", c);
1db5b1ad 1468 strout (outbuf, -1, -1, printcharfun);
974a6ff5 1469 }
38010d50
JB
1470 else
1471 {
453fa987
RS
1472 /* If we just had a hex escape, and this character
1473 could be taken as part of it,
1474 output `\ ' to prevent that. */
1b62edd6
KH
1475 if (need_nonhex)
1476 {
1477 need_nonhex = 0;
1478 if ((c >= 'a' && c <= 'f')
453fa987 1479 || (c >= 'A' && c <= 'F')
1b62edd6 1480 || (c >= '0' && c <= '9'))
1db5b1ad 1481 strout ("\\ ", -1, -1, printcharfun);
1b62edd6 1482 }
453fa987 1483
38010d50
JB
1484 if (c == '\"' || c == '\\')
1485 PRINTCHAR ('\\');
1486 PRINTCHAR (c);
1487 }
1488 }
1489 PRINTCHAR ('\"');
7651e1f5 1490
d5db4077 1491 if (!NULL_INTERVAL_P (STRING_INTERVALS (obj)))
7651e1f5 1492 {
d5db4077 1493 traverse_intervals (STRING_INTERVALS (obj),
8bbfc258 1494 0, print_interval, printcharfun);
7651e1f5
RS
1495 PRINTCHAR (')');
1496 }
7651e1f5 1497
38010d50
JB
1498 UNGCPRO;
1499 }
ca0569ad 1500 break;
38010d50 1501
ca0569ad
RS
1502 case Lisp_Symbol:
1503 {
1504 register int confusing;
d5db4077
KR
1505 register unsigned char *p = SDATA (SYMBOL_NAME (obj));
1506 register unsigned char *end = p + SBYTES (SYMBOL_NAME (obj));
2190a05e 1507 register int c;
db063399
LMI
1508 int i, i_byte;
1509 EMACS_INT size_byte;
dc2a0b79
RS
1510 Lisp_Object name;
1511
76d0b3ae 1512 name = SYMBOL_NAME (obj);
ca0569ad
RS
1513
1514 if (p != end && (*p == '-' || *p == '+')) p++;
1515 if (p == end)
1516 confusing = 0;
d27497e3
RS
1517 /* If symbol name begins with a digit, and ends with a digit,
1518 and contains nothing but digits and `e', it could be treated
1519 as a number. So set CONFUSING.
1520
1521 Symbols that contain periods could also be taken as numbers,
1522 but periods are always escaped, so we don't have to worry
1523 about them here. */
1524 else if (*p >= '0' && *p <= '9'
1525 && end[-1] >= '0' && end[-1] <= '9')
ca0569ad 1526 {
e837058b
RS
1527 while (p != end && ((*p >= '0' && *p <= '9')
1528 /* Needed for \2e10. */
01a8d3fa 1529 || *p == 'e' || *p == 'E'))
ca0569ad
RS
1530 p++;
1531 confusing = (end == p);
1532 }
d27497e3
RS
1533 else
1534 confusing = 0;
ca0569ad 1535
bf9f2aab 1536 if (! NILP (Vprint_gensym) && !SYMBOL_INTERNED_P (obj))
081e0581 1537 {
081e0581
EN
1538 PRINTCHAR ('#');
1539 PRINTCHAR (':');
1540 }
1541
d5db4077 1542 size_byte = SBYTES (name);
dc2a0b79
RS
1543
1544 for (i = 0, i_byte = 0; i_byte < size_byte;)
ca0569ad 1545 {
6ddd6eee
RS
1546 /* Here, we must convert each multi-byte form to the
1547 corresponding character code before handing it to PRINTCHAR. */
eba90784 1548 FETCH_STRING_CHAR_ADVANCE (c, name, i, i_byte);
ca0569ad 1549 QUIT;
09eddb56 1550
ca0569ad
RS
1551 if (escapeflag)
1552 {
09eddb56
RS
1553 if (c == '\"' || c == '\\' || c == '\''
1554 || c == ';' || c == '#' || c == '(' || c == ')'
1555 || c == ',' || c =='.' || c == '`'
1556 || c == '[' || c == ']' || c == '?' || c <= 040
1557 || confusing)
ca0569ad
RS
1558 PRINTCHAR ('\\'), confusing = 0;
1559 }
1560 PRINTCHAR (c);
1561 }
1562 }
1563 break;
1564
1565 case Lisp_Cons:
38010d50 1566 /* If deeper than spec'd depth, print placeholder. */
d4ae1f7e 1567 if (INTEGERP (Vprint_level)
38010d50 1568 && print_depth > XINT (Vprint_level))
1db5b1ad 1569 strout ("...", -1, -1, printcharfun);
2f100b5c
EN
1570 else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
1571 && (EQ (XCAR (obj), Qquote)))
1572 {
1573 PRINTCHAR ('\'');
0f25ecc6 1574 print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
2f100b5c
EN
1575 }
1576 else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
1577 && (EQ (XCAR (obj), Qfunction)))
1578 {
1579 PRINTCHAR ('#');
1580 PRINTCHAR ('\'');
0f25ecc6 1581 print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
2f100b5c
EN
1582 }
1583 else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
a22dec27
SM
1584 && ((EQ (XCAR (obj), Qbackquote))))
1585 {
1586 print_object (XCAR (obj), printcharfun, 0);
1587 new_backquote_output++;
1588 print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
1589 new_backquote_output--;
1590 }
1591 else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
1592 && new_backquote_output
2f100b5c
EN
1593 && ((EQ (XCAR (obj), Qbackquote)
1594 || EQ (XCAR (obj), Qcomma)
1595 || EQ (XCAR (obj), Qcomma_at)
1596 || EQ (XCAR (obj), Qcomma_dot))))
1597 {
0f25ecc6 1598 print_object (XCAR (obj), printcharfun, 0);
a22dec27 1599 new_backquote_output--;
0f25ecc6 1600 print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
a22dec27 1601 new_backquote_output++;
2f100b5c 1602 }
e0f93814 1603 else
38010d50 1604 {
e0f93814 1605 PRINTCHAR ('(');
177c0ea7 1606
38010d50 1607 {
db063399
LMI
1608 EMACS_INT print_length;
1609 int i;
1eab22b5 1610 Lisp_Object halftail = obj;
e0f93814 1611
9ab8560d 1612 /* Negative values of print-length are invalid in CL.
42ac1ed4
GM
1613 Treat them like nil, as CMUCL does. */
1614 if (NATNUMP (Vprint_length))
1615 print_length = XFASTINT (Vprint_length);
1616 else
1617 print_length = 0;
1618
1619 i = 0;
e0f93814 1620 while (CONSP (obj))
38010d50 1621 {
1eab22b5 1622 /* Detect circular list. */
0f25ecc6 1623 if (NILP (Vprint_circle))
1eab22b5 1624 {
0f25ecc6
RS
1625 /* Simple but imcomplete way. */
1626 if (i != 0 && EQ (obj, halftail))
1627 {
1628 sprintf (buf, " . #%d", i / 2);
1db5b1ad 1629 strout (buf, -1, -1, printcharfun);
0f25ecc6
RS
1630 goto end_of_list;
1631 }
1632 }
1633 else
1634 {
1635 /* With the print-circle feature. */
1636 if (i != 0)
1637 {
a65b85b5
SM
1638 Lisp_Object num = Fgethash (obj, Vprint_number_table, Qnil);
1639 if (INTEGERP (num))
36de6a04 1640 {
1db5b1ad 1641 strout (" . ", 3, 3, printcharfun);
36de6a04
AS
1642 print_object (obj, printcharfun, escapeflag);
1643 goto end_of_list;
1644 }
0f25ecc6 1645 }
1eab22b5 1646 }
177c0ea7 1647
e0f93814
KH
1648 if (i++)
1649 PRINTCHAR (' ');
177c0ea7 1650
f4fe72d5 1651 if (print_length && i > print_length)
e0f93814 1652 {
1db5b1ad 1653 strout ("...", 3, 3, printcharfun);
0f25ecc6 1654 goto end_of_list;
e0f93814 1655 }
177c0ea7 1656
0f25ecc6 1657 print_object (XCAR (obj), printcharfun, escapeflag);
177c0ea7 1658
2f100b5c 1659 obj = XCDR (obj);
1eab22b5
RS
1660 if (!(i & 1))
1661 halftail = XCDR (halftail);
38010d50 1662 }
38010d50 1663 }
42ac1ed4
GM
1664
1665 /* OBJ non-nil here means it's the end of a dotted list. */
2f100b5c 1666 if (!NILP (obj))
e0f93814 1667 {
1db5b1ad 1668 strout (" . ", 3, 3, printcharfun);
0f25ecc6 1669 print_object (obj, printcharfun, escapeflag);
e0f93814 1670 }
177c0ea7 1671
0f25ecc6 1672 end_of_list:
e0f93814 1673 PRINTCHAR (')');
38010d50 1674 }
ca0569ad
RS
1675 break;
1676
1677 case Lisp_Vectorlike:
1678 if (PROCESSP (obj))
1679 {
1680 if (escapeflag)
1681 {
1db5b1ad 1682 strout ("#<process ", -1, -1, printcharfun);
ca0569ad
RS
1683 print_string (XPROCESS (obj)->name, printcharfun);
1684 PRINTCHAR ('>');
1685 }
1686 else
1687 print_string (XPROCESS (obj)->name, printcharfun);
1688 }
ed2c35ef
RS
1689 else if (BOOL_VECTOR_P (obj))
1690 {
1691 register int i;
1692 register unsigned char c;
1693 struct gcpro gcpro1;
db063399 1694 EMACS_INT size_in_chars
4b5af5e4
AS
1695 = ((XBOOL_VECTOR (obj)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
1696 / BOOL_VECTOR_BITS_PER_CHAR);
ed2c35ef
RS
1697
1698 GCPRO1 (obj);
1699
1700 PRINTCHAR ('#');
1701 PRINTCHAR ('&');
474f84d9 1702 sprintf (buf, "%ld", (long) XBOOL_VECTOR (obj)->size);
1db5b1ad 1703 strout (buf, -1, -1, printcharfun);
ed2c35ef 1704 PRINTCHAR ('\"');
a40384bc 1705
42ac1ed4 1706 /* Don't print more characters than the specified maximum.
9ab8560d 1707 Negative values of print-length are invalid. Treat them
42ac1ed4
GM
1708 like a print-length of nil. */
1709 if (NATNUMP (Vprint_length)
1710 && XFASTINT (Vprint_length) < size_in_chars)
1711 size_in_chars = XFASTINT (Vprint_length);
a40384bc 1712
ed2c35ef
RS
1713 for (i = 0; i < size_in_chars; i++)
1714 {
1715 QUIT;
1716 c = XBOOL_VECTOR (obj)->data[i];
f10fdbfd 1717 if (c == '\n' && print_escape_newlines)
ed2c35ef
RS
1718 {
1719 PRINTCHAR ('\\');
1720 PRINTCHAR ('n');
1721 }
1722 else if (c == '\f' && print_escape_newlines)
1723 {
1724 PRINTCHAR ('\\');
1725 PRINTCHAR ('f');
1726 }
4b5af5e4
AS
1727 else if (c > '\177')
1728 {
1729 /* Use octal escapes to avoid encoding issues. */
1730 PRINTCHAR ('\\');
1731 PRINTCHAR ('0' + ((c >> 6) & 3));
1732 PRINTCHAR ('0' + ((c >> 3) & 7));
1733 PRINTCHAR ('0' + (c & 7));
1734 }
ed2c35ef
RS
1735 else
1736 {
1737 if (c == '\"' || c == '\\')
1738 PRINTCHAR ('\\');
1739 PRINTCHAR (c);
1740 }
1741 }
1742 PRINTCHAR ('\"');
1743
1744 UNGCPRO;
1745 }
ca0569ad
RS
1746 else if (SUBRP (obj))
1747 {
1db5b1ad
JB
1748 strout ("#<subr ", -1, -1, printcharfun);
1749 strout (XSUBR (obj)->symbol_name, -1, -1, printcharfun);
ca0569ad
RS
1750 PRINTCHAR ('>');
1751 }
ca0569ad
RS
1752 else if (WINDOWP (obj))
1753 {
1db5b1ad 1754 strout ("#<window ", -1, -1, printcharfun);
474f84d9 1755 sprintf (buf, "%ld", (long) XFASTINT (XWINDOW (obj)->sequence_number));
1db5b1ad 1756 strout (buf, -1, -1, printcharfun);
ca0569ad
RS
1757 if (!NILP (XWINDOW (obj)->buffer))
1758 {
1db5b1ad 1759 strout (" on ", -1, -1, printcharfun);
4b4deea2 1760 print_string (BVAR (XBUFFER (XWINDOW (obj)->buffer), name), printcharfun);
ca0569ad
RS
1761 }
1762 PRINTCHAR ('>');
1763 }
f76c8b1e
SM
1764 else if (TERMINALP (obj))
1765 {
1766 struct terminal *t = XTERMINAL (obj);
1db5b1ad 1767 strout ("#<terminal ", -1, -1, printcharfun);
f76c8b1e 1768 sprintf (buf, "%d", t->id);
1db5b1ad 1769 strout (buf, -1, -1, printcharfun);
f76c8b1e
SM
1770 if (t->name)
1771 {
1db5b1ad
JB
1772 strout (" on ", -1, -1, printcharfun);
1773 strout (t->name, -1, -1, printcharfun);
f76c8b1e
SM
1774 }
1775 PRINTCHAR ('>');
1776 }
7eb03302
GM
1777 else if (HASH_TABLE_P (obj))
1778 {
1779 struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
db063399
LMI
1780 int i;
1781 EMACS_INT real_size, size;
f19a0f5b 1782#if 0
1db5b1ad 1783 strout ("#<hash-table", -1, -1, printcharfun);
7eb03302
GM
1784 if (SYMBOLP (h->test))
1785 {
1786 PRINTCHAR (' ');
1787 PRINTCHAR ('\'');
1db5b1ad 1788 strout (SDATA (SYMBOL_NAME (h->test)), -1, -1, printcharfun);
7eb03302 1789 PRINTCHAR (' ');
1db5b1ad 1790 strout (SDATA (SYMBOL_NAME (h->weak)), -1, -1, printcharfun);
7eb03302 1791 PRINTCHAR (' ');
878f97ff 1792 sprintf (buf, "%ld/%ld", (long) h->count,
474f84d9 1793 (long) XVECTOR (h->next)->size);
1db5b1ad 1794 strout (buf, -1, -1, printcharfun);
7eb03302
GM
1795 }
1796 sprintf (buf, " 0x%lx", (unsigned long) h);
1db5b1ad 1797 strout (buf, -1, -1, printcharfun);
7eb03302 1798 PRINTCHAR ('>');
f19a0f5b
TZ
1799#endif
1800 /* Implement a readable output, e.g.:
1801 #s(hash-table size 2 test equal data (k1 v1 k2 v2)) */
1802 /* Always print the size. */
1803 sprintf (buf, "#s(hash-table size %ld",
1804 (long) XVECTOR (h->next)->size);
1db5b1ad 1805 strout (buf, -1, -1, printcharfun);
f19a0f5b
TZ
1806
1807 if (!NILP (h->test))
1808 {
1db5b1ad 1809 strout (" test ", -1, -1, printcharfun);
617a0e83 1810 print_object (h->test, printcharfun, escapeflag);
f19a0f5b
TZ
1811 }
1812
1813 if (!NILP (h->weak))
1814 {
1db5b1ad 1815 strout (" weakness ", -1, -1, printcharfun);
617a0e83 1816 print_object (h->weak, printcharfun, escapeflag);
f19a0f5b
TZ
1817 }
1818
1819 if (!NILP (h->rehash_size))
1820 {
1db5b1ad 1821 strout (" rehash-size ", -1, -1, printcharfun);
617a0e83 1822 print_object (h->rehash_size, printcharfun, escapeflag);
f19a0f5b
TZ
1823 }
1824
1825 if (!NILP (h->rehash_threshold))
1826 {
1db5b1ad 1827 strout (" rehash-threshold ", -1, -1, printcharfun);
617a0e83 1828 print_object (h->rehash_threshold, printcharfun, escapeflag);
f19a0f5b
TZ
1829 }
1830
1db5b1ad 1831 strout (" data ", -1, -1, printcharfun);
f19a0f5b
TZ
1832
1833 /* Print the data here as a plist. */
b0ca0f33
DN
1834 real_size = HASH_TABLE_SIZE (h);
1835 size = real_size;
f19a0f5b
TZ
1836
1837 /* Don't print more elements than the specified maximum. */
1838 if (NATNUMP (Vprint_length)
1839 && XFASTINT (Vprint_length) < size)
1840 size = XFASTINT (Vprint_length);
42a5b22f 1841
f19a0f5b
TZ
1842 PRINTCHAR ('(');
1843 for (i = 0; i < size; i++)
1844 if (!NILP (HASH_HASH (h, i)))
1845 {
1846 if (i) PRINTCHAR (' ');
617a0e83 1847 print_object (HASH_KEY (h, i), printcharfun, escapeflag);
f19a0f5b 1848 PRINTCHAR (' ');
617a0e83 1849 print_object (HASH_VALUE (h, i), printcharfun, escapeflag);
f19a0f5b
TZ
1850 }
1851
1852 if (size < real_size)
1db5b1ad 1853 strout (" ...", 4, 4, printcharfun);
f19a0f5b
TZ
1854
1855 PRINTCHAR (')');
1856 PRINTCHAR (')');
1857
7eb03302 1858 }
908b0ae5
RS
1859 else if (BUFFERP (obj))
1860 {
4b4deea2 1861 if (NILP (BVAR (XBUFFER (obj), name)))
1db5b1ad 1862 strout ("#<killed buffer>", -1, -1, printcharfun);
908b0ae5
RS
1863 else if (escapeflag)
1864 {
1db5b1ad 1865 strout ("#<buffer ", -1, -1, printcharfun);
4b4deea2 1866 print_string (BVAR (XBUFFER (obj), name), printcharfun);
908b0ae5
RS
1867 PRINTCHAR ('>');
1868 }
1869 else
4b4deea2 1870 print_string (BVAR (XBUFFER (obj), name), printcharfun);
908b0ae5 1871 }
ca0569ad
RS
1872 else if (WINDOW_CONFIGURATIONP (obj))
1873 {
1db5b1ad 1874 strout ("#<window-configuration>", -1, -1, printcharfun);
ca0569ad 1875 }
ca0569ad
RS
1876 else if (FRAMEP (obj))
1877 {
1878 strout ((FRAME_LIVE_P (XFRAME (obj))
1879 ? "#<frame " : "#<dead frame "),
1db5b1ad 1880 -1, -1, printcharfun);
ca0569ad 1881 print_string (XFRAME (obj)->name, printcharfun);
aab3aa14 1882 sprintf (buf, " 0x%lx", (unsigned long) (XFRAME (obj)));
1db5b1ad 1883 strout (buf, -1, -1, printcharfun);
ca0569ad
RS
1884 PRINTCHAR ('>');
1885 }
2a7b7982
KH
1886 else if (FONTP (obj))
1887 {
1888 EMACS_INT i;
1889
1890 if (! FONT_OBJECT_P (obj))
1891 {
1892 if (FONT_SPEC_P (obj))
1db5b1ad 1893 strout ("#<font-spec", -1, -1, printcharfun);
2a7b7982 1894 else
1db5b1ad 1895 strout ("#<font-entity", -1, -1, printcharfun);
2a7b7982
KH
1896 for (i = 0; i < FONT_SPEC_MAX; i++)
1897 {
1898 PRINTCHAR (' ');
1899 if (i < FONT_WEIGHT_INDEX || i > FONT_WIDTH_INDEX)
1900 print_object (AREF (obj, i), printcharfun, escapeflag);
1901 else
1902 print_object (font_style_symbolic (obj, i, 0),
1903 printcharfun, escapeflag);
1904 }
1905 }
1906 else
1907 {
1db5b1ad 1908 strout ("#<font-object ", -1, -1, printcharfun);
2a7b7982
KH
1909 print_object (AREF (obj, FONT_NAME_INDEX), printcharfun,
1910 escapeflag);
1911 }
1912 PRINTCHAR ('>');
1913 }
ca0569ad
RS
1914 else
1915 {
6b61353c 1916 EMACS_INT size = XVECTOR (obj)->size;
ca0569ad
RS
1917 if (COMPILEDP (obj))
1918 {
1919 PRINTCHAR ('#');
1920 size &= PSEUDOVECTOR_SIZE_MASK;
1921 }
8b4b4467 1922 if (CHAR_TABLE_P (obj) || SUB_CHAR_TABLE_P (obj))
ed2c35ef
RS
1923 {
1924 /* We print a char-table as if it were a vector,
1925 lumping the parent and default slots in with the
1926 character slots. But we add #^ as a prefix. */
223509a3
KH
1927
1928 /* Make each lowest sub_char_table start a new line.
1929 Otherwise we'll make a line extremely long, which
1930 results in slow redisplay. */
1931 if (SUB_CHAR_TABLE_P (obj)
1932 && XINT (XSUB_CHAR_TABLE (obj)->depth) == 3)
1933 PRINTCHAR ('\n');
ed2c35ef
RS
1934 PRINTCHAR ('#');
1935 PRINTCHAR ('^');
3701b5de
KH
1936 if (SUB_CHAR_TABLE_P (obj))
1937 PRINTCHAR ('^');
ed2c35ef
RS
1938 size &= PSEUDOVECTOR_SIZE_MASK;
1939 }
00d76abc
KH
1940 if (size & PSEUDOVECTOR_FLAG)
1941 goto badtype;
ca0569ad
RS
1942
1943 PRINTCHAR ('[');
38010d50 1944 {
ca0569ad
RS
1945 register int i;
1946 register Lisp_Object tem;
db063399 1947 EMACS_INT real_size = size;
a40384bc
RS
1948
1949 /* Don't print more elements than the specified maximum. */
42ac1ed4
GM
1950 if (NATNUMP (Vprint_length)
1951 && XFASTINT (Vprint_length) < size)
1952 size = XFASTINT (Vprint_length);
a40384bc 1953
ca0569ad
RS
1954 for (i = 0; i < size; i++)
1955 {
1956 if (i) PRINTCHAR (' ');
1957 tem = XVECTOR (obj)->contents[i];
0f25ecc6 1958 print_object (tem, printcharfun, escapeflag);
ca0569ad 1959 }
d6ac884e 1960 if (size < real_size)
1db5b1ad 1961 strout (" ...", 4, 4, printcharfun);
38010d50 1962 }
ca0569ad
RS
1963 PRINTCHAR (']');
1964 }
1965 break;
1966
ca0569ad 1967 case Lisp_Misc:
5db20f08 1968 switch (XMISCTYPE (obj))
38010d50 1969 {
00d76abc 1970 case Lisp_Misc_Marker:
1db5b1ad 1971 strout ("#<marker ", -1, -1, printcharfun);
087e3c46
KH
1972 /* Do you think this is necessary? */
1973 if (XMARKER (obj)->insertion_type != 0)
1db5b1ad 1974 strout ("(moves after insertion) ", -1, -1, printcharfun);
cd3587c1 1975 if (! XMARKER (obj)->buffer)
1db5b1ad 1976 strout ("in no buffer", -1, -1, printcharfun);
ca0569ad
RS
1977 else
1978 {
d585695f 1979 sprintf (buf, "at %ld", (long)marker_position (obj));
1db5b1ad
JB
1980 strout (buf, -1, -1, printcharfun);
1981 strout (" in ", -1, -1, printcharfun);
4b4deea2 1982 print_string (BVAR (XMARKER (obj)->buffer, name), printcharfun);
ca0569ad 1983 }
38010d50 1984 PRINTCHAR ('>');
908b0ae5 1985 break;
00d76abc
KH
1986
1987 case Lisp_Misc_Overlay:
1db5b1ad 1988 strout ("#<overlay ", -1, -1, printcharfun);
cd3587c1 1989 if (! XMARKER (OVERLAY_START (obj))->buffer)
1db5b1ad 1990 strout ("in no buffer", -1, -1, printcharfun);
ca0569ad
RS
1991 else
1992 {
d585695f
EZ
1993 sprintf (buf, "from %ld to %ld in ",
1994 (long)marker_position (OVERLAY_START (obj)),
1995 (long)marker_position (OVERLAY_END (obj)));
1db5b1ad 1996 strout (buf, -1, -1, printcharfun);
4b4deea2 1997 print_string (BVAR (XMARKER (OVERLAY_START (obj))->buffer, name),
ca0569ad
RS
1998 printcharfun);
1999 }
2000 PRINTCHAR ('>');
908b0ae5 2001 break;
00d76abc
KH
2002
2003 /* Remaining cases shouldn't happen in normal usage, but let's print
2004 them anyway for the benefit of the debugger. */
2005 case Lisp_Misc_Free:
1db5b1ad 2006 strout ("#<misc free cell>", -1, -1, printcharfun);
00d76abc
KH
2007 break;
2008
c069fee4 2009 case Lisp_Misc_Save_Value:
1db5b1ad 2010 strout ("#<save_value ", -1, -1, printcharfun);
44455197 2011 sprintf(buf, "ptr=0x%08lx int=%d",
c069fee4
KS
2012 (unsigned long) XSAVE_VALUE (obj)->pointer,
2013 XSAVE_VALUE (obj)->integer);
1db5b1ad 2014 strout (buf, -1, -1, printcharfun);
c069fee4
KS
2015 PRINTCHAR ('>');
2016 break;
2017
00d76abc
KH
2018 default:
2019 goto badtype;
e0f93814 2020 }
00d76abc 2021 break;
ca0569ad
RS
2022
2023 default:
00d76abc 2024 badtype:
ca0569ad
RS
2025 {
2026 /* We're in trouble if this happens!
2027 Probably should just abort () */
1db5b1ad 2028 strout ("#<EMACS BUG: INVALID DATATYPE ", -1, -1, printcharfun);
00d76abc 2029 if (MISCP (obj))
5db20f08 2030 sprintf (buf, "(MISC 0x%04x)", (int) XMISCTYPE (obj));
00d76abc
KH
2031 else if (VECTORLIKEP (obj))
2032 sprintf (buf, "(PVEC 0x%08x)", (int) XVECTOR (obj)->size);
2033 else
2034 sprintf (buf, "(0x%02x)", (int) XTYPE (obj));
1db5b1ad 2035 strout (buf, -1, -1, printcharfun);
ca0569ad 2036 strout (" Save your buffers immediately and please report this bug>",
1db5b1ad 2037 -1, -1, printcharfun);
ca0569ad 2038 }
38010d50
JB
2039 }
2040
2041 print_depth--;
2042}
2043\f
7651e1f5
RS
2044
2045/* Print a description of INTERVAL using PRINTCHARFUN.
2046 This is part of printing a string that has text properties. */
2047
2048void
971de7fb 2049print_interval (INTERVAL interval, Lisp_Object printcharfun)
7651e1f5 2050{
71ea13cb
KH
2051 if (NILP (interval->plist))
2052 return;
30503c0b 2053 PRINTCHAR (' ');
0f25ecc6 2054 print_object (make_number (interval->position), printcharfun, 1);
7651e1f5 2055 PRINTCHAR (' ');
0f25ecc6 2056 print_object (make_number (interval->position + LENGTH (interval)),
cd3587c1 2057 printcharfun, 1);
7651e1f5 2058 PRINTCHAR (' ');
0f25ecc6 2059 print_object (interval->plist, printcharfun, 1);
7651e1f5
RS
2060}
2061
7651e1f5 2062\f
38010d50 2063void
971de7fb 2064syms_of_print (void)
38010d50 2065{
d67b4f80 2066 Qtemp_buffer_setup_hook = intern_c_string ("temp-buffer-setup-hook");
d9c21094
RS
2067 staticpro (&Qtemp_buffer_setup_hook);
2068
29208e82 2069 DEFVAR_LISP ("standard-output", Vstandard_output,
8c1a1077
PJ
2070 doc: /* Output stream `print' uses by default for outputting a character.
2071This may be any function of one argument.
2072It may also be a buffer (output is inserted before point)
2073or a marker (output is inserted and the marker is advanced)
2074or the symbol t (output appears in the echo area). */);
38010d50 2075 Vstandard_output = Qt;
d67b4f80 2076 Qstandard_output = intern_c_string ("standard-output");
38010d50
JB
2077 staticpro (&Qstandard_output);
2078
29208e82 2079 DEFVAR_LISP ("float-output-format", Vfloat_output_format,
8c1a1077
PJ
2080 doc: /* The format descriptor string used to print floats.
2081This is a %-spec like those accepted by `printf' in C,
2082but with some restrictions. It must start with the two characters `%.'.
2083After that comes an integer precision specification,
2084and then a letter which controls the format.
2085The letters allowed are `e', `f' and `g'.
2086Use `e' for exponential notation \"DIG.DIGITSeEXPT\"
2087Use `f' for decimal point notation \"DIGITS.DIGITS\".
2088Use `g' to choose the shorter of those two formats for the number at hand.
2089The precision in any of these cases is the number of digits following
2090the decimal point. With `f', a precision of 0 means to omit the
2091decimal point. 0 is not allowed with `e' or `g'.
2092
2093A value of nil means to use the shortest notation
2094that represents the number without losing information. */);
38010d50 2095 Vfloat_output_format = Qnil;
d67b4f80 2096 Qfloat_output_format = intern_c_string ("float-output-format");
38010d50 2097 staticpro (&Qfloat_output_format);
38010d50 2098
29208e82 2099 DEFVAR_LISP ("print-length", Vprint_length,
8c1a1077
PJ
2100 doc: /* Maximum length of list to print before abbreviating.
2101A value of nil means no limit. See also `eval-expression-print-length'. */);
38010d50
JB
2102 Vprint_length = Qnil;
2103
29208e82 2104 DEFVAR_LISP ("print-level", Vprint_level,
8c1a1077
PJ
2105 doc: /* Maximum depth of list nesting to print before abbreviating.
2106A value of nil means no limit. See also `eval-expression-print-level'. */);
38010d50
JB
2107 Vprint_level = Qnil;
2108
29208e82 2109 DEFVAR_BOOL ("print-escape-newlines", print_escape_newlines,
8c1a1077
PJ
2110 doc: /* Non-nil means print newlines in strings as `\\n'.
2111Also print formfeeds as `\\f'. */);
38010d50
JB
2112 print_escape_newlines = 0;
2113
29208e82 2114 DEFVAR_BOOL ("print-escape-nonascii", print_escape_nonascii,
8c1a1077
PJ
2115 doc: /* Non-nil means print unibyte non-ASCII chars in strings as \\OOO.
2116\(OOO is the octal representation of the character code.)
249c0f71
RS
2117Only single-byte characters are affected, and only in `prin1'.
2118When the output goes in a multibyte buffer, this feature is
2119enabled regardless of the value of the variable. */);
38940e93
RS
2120 print_escape_nonascii = 0;
2121
29208e82 2122 DEFVAR_BOOL ("print-escape-multibyte", print_escape_multibyte,
8c1a1077
PJ
2123 doc: /* Non-nil means print multibyte characters in strings as \\xXXXX.
2124\(XXXX is the hex representation of the character code.)
2125This affects only `prin1'. */);
835d0be6
RS
2126 print_escape_multibyte = 0;
2127
29208e82 2128 DEFVAR_BOOL ("print-quoted", print_quoted,
8c1a1077 2129 doc: /* Non-nil means print quoted forms with reader syntax.
db75cb5f 2130I.e., (quote foo) prints as 'foo, (function foo) as #'foo. */);
2f100b5c
EN
2131 print_quoted = 0;
2132
29208e82 2133 DEFVAR_LISP ("print-gensym", Vprint_gensym,
8c1a1077
PJ
2134 doc: /* Non-nil means print uninterned symbols so they will read as uninterned.
2135I.e., the value of (make-symbol \"foobar\") prints as #:foobar.
2136When the uninterned symbol appears within a recursive data structure,
2137and the symbol appears more than once, in addition use the #N# and #N=
2138constructs as needed, so that multiple references to the same symbol are
2139shared once again when the text is read back. */);
e0f69431
RS
2140 Vprint_gensym = Qnil;
2141
29208e82 2142 DEFVAR_LISP ("print-circle", Vprint_circle,
8c1a1077
PJ
2143 doc: /* *Non-nil means print recursive structures using #N= and #N# syntax.
2144If nil, printing proceeds recursively and may lead to
2145`max-lisp-eval-depth' being exceeded or an error may occur:
2146\"Apparently circular structure being printed.\" Also see
2147`print-length' and `print-level'.
2148If non-nil, shared substructures anywhere in the structure are printed
2149with `#N=' before the first occurrence (in the order of the print
2150representation) and `#N#' in place of each subsequent occurrence,
2151where N is a positive decimal integer. */);
0f25ecc6
RS
2152 Vprint_circle = Qnil;
2153
29208e82 2154 DEFVAR_LISP ("print-continuous-numbering", Vprint_continuous_numbering,
8c1a1077
PJ
2155 doc: /* *Non-nil means number continuously across print calls.
2156This affects the numbers printed for #N= labels and #M# references.
2157See also `print-circle', `print-gensym', and `print-number-table'.
2158This variable should not be set with `setq'; bind it with a `let' instead. */);
0f25ecc6
RS
2159 Vprint_continuous_numbering = Qnil;
2160
29208e82 2161 DEFVAR_LISP ("print-number-table", Vprint_number_table,
8c1a1077
PJ
2162 doc: /* A vector used internally to produce `#N=' labels and `#N#' references.
2163The Lisp printer uses this vector to detect Lisp objects referenced more
e6d4cddd
RS
2164than once.
2165
2166When you bind `print-continuous-numbering' to t, you should probably
2167also bind `print-number-table' to nil. This ensures that the value of
2168`print-number-table' can be garbage-collected once the printing is
2169done. If all elements of `print-number-table' are nil, it means that
2170the printing done so far has not found any shared structure or objects
2171that need to be recorded in the table. */);
0f25ecc6 2172 Vprint_number_table = Qnil;
081e0581 2173
29208e82 2174 DEFVAR_LISP ("print-charset-text-property", Vprint_charset_text_property,
71ea13cb
KH
2175 doc: /* A flag to control printing of `charset' text property on printing a string.
2176The value must be nil, t, or `default'.
2177
2178If the value is nil, don't print the text property `charset'.
2179
2180If the value is t, always print the text property `charset'.
2181
2182If the value is `default', print the text property `charset' only when
2183the value is different from what is guessed in the current charset
dedbd91c 2184priorities. */);
71ea13cb
KH
2185 Vprint_charset_text_property = Qdefault;
2186
38010d50
JB
2187 /* prin1_to_string_buffer initialized in init_buffer_once in buffer.c */
2188 staticpro (&Vprin1_to_string_buffer);
2189
2190 defsubr (&Sprin1);
2191 defsubr (&Sprin1_to_string);
113620cc 2192 defsubr (&Serror_message_string);
38010d50
JB
2193 defsubr (&Sprinc);
2194 defsubr (&Sprint);
2195 defsubr (&Sterpri);
2196 defsubr (&Swrite_char);
2197 defsubr (&Sexternal_debugging_output);
6b61353c
KH
2198#ifdef WITH_REDIRECT_DEBUGGING_OUTPUT
2199 defsubr (&Sredirect_debugging_output);
2200#endif
38010d50 2201
d67b4f80 2202 Qexternal_debugging_output = intern_c_string ("external-debugging-output");
38010d50
JB
2203 staticpro (&Qexternal_debugging_output);
2204
d67b4f80 2205 Qprint_escape_newlines = intern_c_string ("print-escape-newlines");
2f100b5c
EN
2206 staticpro (&Qprint_escape_newlines);
2207
d67b4f80 2208 Qprint_escape_multibyte = intern_c_string ("print-escape-multibyte");
835d0be6
RS
2209 staticpro (&Qprint_escape_multibyte);
2210
d67b4f80 2211 Qprint_escape_nonascii = intern_c_string ("print-escape-nonascii");
835d0be6
RS
2212 staticpro (&Qprint_escape_nonascii);
2213
71ea13cb
KH
2214 print_prune_charset_plist = Qnil;
2215 staticpro (&print_prune_charset_plist);
38010d50 2216}