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