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