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