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