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