Fix dedicatedness check in display-buffer
[emacs.git] / src / print.c
blobe42d9867d6f7c7efa775cf68c8210d35bab6ed3b
1 /* Lisp object printing and output streams.
2 Copyright (C) 1985, 1986, 1988, 1993, 1994, 1995, 1997,
3 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
6 This file is part of GNU Emacs.
8 GNU Emacs is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
22 #include <config.h>
23 #include <stdio.h>
24 #include <setjmp.h>
25 #include "lisp.h"
26 #include "buffer.h"
27 #include "character.h"
28 #include "charset.h"
29 #include "keyboard.h"
30 #include "frame.h"
31 #include "window.h"
32 #include "process.h"
33 #include "dispextern.h"
34 #include "termchar.h"
35 #include "intervals.h"
36 #include "blockinput.h"
37 #include "termhooks.h" /* For struct terminal. */
38 #include "font.h"
40 Lisp_Object Vstandard_output, Qstandard_output;
42 Lisp_Object Qtemp_buffer_setup_hook;
44 /* These are used to print like we read. */
46 Lisp_Object Vfloat_output_format, Qfloat_output_format;
48 #include <math.h>
50 #if STDC_HEADERS
51 #include <float.h>
52 #endif
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
64 #ifndef DBL_MIN
65 #define DBL_MIN 2.2250738585072014e-308
66 #endif
68 #ifdef DBL_MIN_REPLACEMENT
69 #undef DBL_MIN
70 #define DBL_MIN DBL_MIN_REPLACEMENT
71 #endif
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
84 /* Avoid actual stack overflow in print. */
85 int print_depth;
87 /* Level of nesting inside outputting backquote in new style. */
88 int new_backquote_output;
90 /* Detect most circularities to print finite output. */
91 #define PRINT_CIRCLE 200
92 Lisp_Object being_printed[PRINT_CIRCLE];
94 /* When printing into a buffer, first we put the text in this
95 block, then insert it all at once. */
96 char *print_buffer;
98 /* Size allocated in print_buffer. */
99 EMACS_INT print_buffer_size;
100 /* Chars stored in print_buffer. */
101 EMACS_INT print_buffer_pos;
102 /* Bytes stored in print_buffer. */
103 EMACS_INT print_buffer_pos_byte;
105 /* Maximum length of list to print in full; noninteger means
106 effectively infinity */
108 Lisp_Object Vprint_length;
110 /* Maximum depth of list to print in full; noninteger means
111 effectively infinity. */
113 Lisp_Object Vprint_level;
115 /* Nonzero means print newlines in strings as \n. */
117 int print_escape_newlines;
119 /* Nonzero means to print single-byte non-ascii characters in strings as
120 octal escapes. */
122 int print_escape_nonascii;
124 /* Nonzero means to print multibyte characters in strings as hex escapes. */
126 int print_escape_multibyte;
128 Lisp_Object Qprint_escape_newlines;
129 Lisp_Object Qprint_escape_multibyte, Qprint_escape_nonascii;
131 /* Nonzero means print (quote foo) forms as 'foo, etc. */
133 int print_quoted;
135 /* Non-nil means print #: before uninterned symbols. */
137 Lisp_Object Vprint_gensym;
139 /* Non-nil means print recursive structures using #n= and #n# syntax. */
141 Lisp_Object Vprint_circle;
143 /* Non-nil means keep continuous number for #n= and #n# syntax
144 between several print functions. */
146 Lisp_Object Vprint_continuous_numbering;
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. */
154 int print_number_index;
155 Lisp_Object Vprint_number_table;
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]
163 void print_interval (INTERVAL interval, Lisp_Object printcharfun);
165 /* GDB resets this to zero on W32 to disable OutputDebugString calls. */
166 int print_output_debug_flag = 1;
169 /* Low level output routines for characters and strings */
171 /* Lisp functions to do output using a stream
172 must have the stream in a variable called printcharfun
173 and must start with PRINTPREPARE, end with PRINTFINISH,
174 and use PRINTDECLARE to declare common variables.
175 Use PRINTCHAR to output one character,
176 or call strout to output a block of characters. */
178 #define PRINTDECLARE \
179 struct buffer *old = current_buffer; \
180 EMACS_INT old_point = -1, start_point = -1; \
181 EMACS_INT old_point_byte = -1, start_point_byte = -1; \
182 int specpdl_count = SPECPDL_INDEX (); \
183 int free_print_buffer = 0; \
184 int multibyte = !NILP (current_buffer->enable_multibyte_characters); \
185 Lisp_Object original
187 #define PRINTPREPARE \
188 original = printcharfun; \
189 if (NILP (printcharfun)) printcharfun = Qt; \
190 if (BUFFERP (printcharfun)) \
192 if (XBUFFER (printcharfun) != current_buffer) \
193 Fset_buffer (printcharfun); \
194 printcharfun = Qnil; \
196 if (MARKERP (printcharfun)) \
198 EMACS_INT marker_pos; \
199 if (! XMARKER (printcharfun)->buffer) \
200 error ("Marker does not point anywhere"); \
201 if (XMARKER (printcharfun)->buffer != current_buffer) \
202 set_buffer_internal (XMARKER (printcharfun)->buffer); \
203 marker_pos = marker_position (printcharfun); \
204 if (marker_pos < BEGV || marker_pos > ZV) \
205 error ("Marker is outside the accessible part of the buffer"); \
206 old_point = PT; \
207 old_point_byte = PT_BYTE; \
208 SET_PT_BOTH (marker_pos, \
209 marker_byte_position (printcharfun)); \
210 start_point = PT; \
211 start_point_byte = PT_BYTE; \
212 printcharfun = Qnil; \
214 if (NILP (printcharfun)) \
216 Lisp_Object string; \
217 if (NILP (current_buffer->enable_multibyte_characters) \
218 && ! print_escape_multibyte) \
219 specbind (Qprint_escape_multibyte, Qt); \
220 if (! NILP (current_buffer->enable_multibyte_characters) \
221 && ! print_escape_nonascii) \
222 specbind (Qprint_escape_nonascii, Qt); \
223 if (print_buffer != 0) \
225 string = make_string_from_bytes (print_buffer, \
226 print_buffer_pos, \
227 print_buffer_pos_byte); \
228 record_unwind_protect (print_unwind, string); \
230 else \
232 print_buffer_size = 1000; \
233 print_buffer = (char *) xmalloc (print_buffer_size); \
234 free_print_buffer = 1; \
236 print_buffer_pos = 0; \
237 print_buffer_pos_byte = 0; \
239 if (EQ (printcharfun, Qt) && ! noninteractive) \
240 setup_echo_area_for_printing (multibyte);
242 #define PRINTFINISH \
243 if (NILP (printcharfun)) \
245 if (print_buffer_pos != print_buffer_pos_byte \
246 && NILP (current_buffer->enable_multibyte_characters)) \
248 unsigned char *temp \
249 = (unsigned char *) alloca (print_buffer_pos + 1); \
250 copy_text (print_buffer, temp, print_buffer_pos_byte, \
251 1, 0); \
252 insert_1_both (temp, print_buffer_pos, \
253 print_buffer_pos, 0, 1, 0); \
255 else \
256 insert_1_both (print_buffer, print_buffer_pos, \
257 print_buffer_pos_byte, 0, 1, 0); \
258 signal_after_change (PT - print_buffer_pos, 0, print_buffer_pos);\
260 if (free_print_buffer) \
262 xfree (print_buffer); \
263 print_buffer = 0; \
265 unbind_to (specpdl_count, Qnil); \
266 if (MARKERP (original)) \
267 set_marker_both (original, Qnil, PT, PT_BYTE); \
268 if (old_point >= 0) \
269 SET_PT_BOTH (old_point + (old_point >= start_point \
270 ? PT - start_point : 0), \
271 old_point_byte + (old_point_byte >= start_point_byte \
272 ? PT_BYTE - start_point_byte : 0)); \
273 if (old != current_buffer) \
274 set_buffer_internal (old);
276 #define PRINTCHAR(ch) printchar (ch, printcharfun)
278 /* This is used to restore the saved contents of print_buffer
279 when there is a recursive call to print. */
281 static Lisp_Object
282 print_unwind (Lisp_Object saved_text)
284 memcpy (print_buffer, SDATA (saved_text), SCHARS (saved_text));
285 return Qnil;
289 /* Print character CH using method FUN. FUN nil means print to
290 print_buffer. FUN t means print to echo area or stdout if
291 non-interactive. If FUN is neither nil nor t, call FUN with CH as
292 argument. */
294 static void
295 printchar (unsigned int ch, Lisp_Object fun)
297 if (!NILP (fun) && !EQ (fun, Qt))
298 call1 (fun, make_number (ch));
299 else
301 unsigned char str[MAX_MULTIBYTE_LENGTH];
302 int len = CHAR_STRING (ch, str);
304 QUIT;
306 if (NILP (fun))
308 if (print_buffer_pos_byte + len >= print_buffer_size)
309 print_buffer = (char *) xrealloc (print_buffer,
310 print_buffer_size *= 2);
311 memcpy (print_buffer + print_buffer_pos_byte, str, len);
312 print_buffer_pos += 1;
313 print_buffer_pos_byte += len;
315 else if (noninteractive)
317 fwrite (str, 1, len, stdout);
318 noninteractive_need_newline = 1;
320 else
322 int multibyte_p
323 = !NILP (current_buffer->enable_multibyte_characters);
325 setup_echo_area_for_printing (multibyte_p);
326 insert_char (ch);
327 message_dolog (str, len, 0, multibyte_p);
333 /* Output SIZE characters, SIZE_BYTE bytes from string PTR using
334 method PRINTCHARFUN. If SIZE < 0, use the string length of PTR for
335 both SIZE and SIZE_BYTE. PRINTCHARFUN nil means output to
336 print_buffer. PRINTCHARFUN t means output to the echo area or to
337 stdout if non-interactive. If neither nil nor t, call Lisp
338 function PRINTCHARFUN for each character printed. MULTIBYTE
339 non-zero means PTR contains multibyte characters.
341 In the case where PRINTCHARFUN is nil, it is safe for PTR to point
342 to data in a Lisp string. Otherwise that is not safe. */
344 static void
345 strout (const char *ptr, EMACS_INT size, EMACS_INT size_byte,
346 Lisp_Object printcharfun, int multibyte)
348 if (size < 0)
349 size_byte = size = strlen (ptr);
351 if (NILP (printcharfun))
353 if (print_buffer_pos_byte + size_byte > print_buffer_size)
355 print_buffer_size = print_buffer_size * 2 + size_byte;
356 print_buffer = (char *) xrealloc (print_buffer,
357 print_buffer_size);
359 memcpy (print_buffer + print_buffer_pos_byte, ptr, size_byte);
360 print_buffer_pos += size;
361 print_buffer_pos_byte += size_byte;
363 else if (noninteractive && EQ (printcharfun, Qt))
365 fwrite (ptr, 1, size_byte, stdout);
366 noninteractive_need_newline = 1;
368 else if (EQ (printcharfun, Qt))
370 /* Output to echo area. We're trying to avoid a little overhead
371 here, that's the reason we don't call printchar to do the
372 job. */
373 int i;
374 int multibyte_p
375 = !NILP (current_buffer->enable_multibyte_characters);
377 setup_echo_area_for_printing (multibyte_p);
378 message_dolog (ptr, size_byte, 0, multibyte_p);
380 if (size == size_byte)
382 for (i = 0; i < size; ++i)
383 insert_char ((unsigned char) *ptr++);
385 else
387 int len;
388 for (i = 0; i < size_byte; i += len)
390 int ch = STRING_CHAR_AND_LENGTH (ptr + i, len);
391 insert_char (ch);
395 else
397 /* PRINTCHARFUN is a Lisp function. */
398 EMACS_INT i = 0;
400 if (size == size_byte)
402 while (i < size_byte)
404 int ch = ptr[i++];
405 PRINTCHAR (ch);
408 else
410 while (i < size_byte)
412 /* Here, we must convert each multi-byte form to the
413 corresponding character code before handing it to
414 PRINTCHAR. */
415 int len;
416 int ch = STRING_CHAR_AND_LENGTH (ptr + i, len);
417 PRINTCHAR (ch);
418 i += len;
424 /* Print the contents of a string STRING using PRINTCHARFUN.
425 It isn't safe to use strout in many cases,
426 because printing one char can relocate. */
428 static void
429 print_string (Lisp_Object string, Lisp_Object printcharfun)
431 if (EQ (printcharfun, Qt) || NILP (printcharfun))
433 EMACS_INT chars;
435 if (print_escape_nonascii)
436 string = string_escape_byte8 (string);
438 if (STRING_MULTIBYTE (string))
439 chars = SCHARS (string);
440 else if (! print_escape_nonascii
441 && (EQ (printcharfun, Qt)
442 ? ! NILP (buffer_defaults.enable_multibyte_characters)
443 : ! NILP (current_buffer->enable_multibyte_characters)))
445 /* If unibyte string STRING contains 8-bit codes, we must
446 convert STRING to a multibyte string containing the same
447 character codes. */
448 Lisp_Object newstr;
449 EMACS_INT bytes;
451 chars = SBYTES (string);
452 bytes = parse_str_to_multibyte (SDATA (string), chars);
453 if (chars < bytes)
455 newstr = make_uninit_multibyte_string (chars, bytes);
456 memcpy (SDATA (newstr), SDATA (string), chars);
457 str_to_multibyte (SDATA (newstr), bytes, chars);
458 string = newstr;
461 else
462 chars = SBYTES (string);
464 if (EQ (printcharfun, Qt))
466 /* Output to echo area. */
467 EMACS_INT nbytes = SBYTES (string);
468 char *buffer;
470 /* Copy the string contents so that relocation of STRING by
471 GC does not cause trouble. */
472 USE_SAFE_ALLOCA;
474 SAFE_ALLOCA (buffer, char *, nbytes);
475 memcpy (buffer, SDATA (string), nbytes);
477 strout (buffer, chars, SBYTES (string),
478 printcharfun, STRING_MULTIBYTE (string));
480 SAFE_FREE ();
482 else
483 /* No need to copy, since output to print_buffer can't GC. */
484 strout (SDATA (string),
485 chars, SBYTES (string),
486 printcharfun, STRING_MULTIBYTE (string));
488 else
490 /* Otherwise, string may be relocated by printing one char.
491 So re-fetch the string address for each character. */
492 EMACS_INT i;
493 EMACS_INT size = SCHARS (string);
494 EMACS_INT size_byte = SBYTES (string);
495 struct gcpro gcpro1;
496 GCPRO1 (string);
497 if (size == size_byte)
498 for (i = 0; i < size; i++)
499 PRINTCHAR (SREF (string, i));
500 else
501 for (i = 0; i < size_byte; )
503 /* Here, we must convert each multi-byte form to the
504 corresponding character code before handing it to PRINTCHAR. */
505 int len;
506 int ch = STRING_CHAR_AND_LENGTH (SDATA (string) + i, len);
507 PRINTCHAR (ch);
508 i += len;
510 UNGCPRO;
514 DEFUN ("write-char", Fwrite_char, Swrite_char, 1, 2, 0,
515 doc: /* Output character CHARACTER to stream PRINTCHARFUN.
516 PRINTCHARFUN defaults to the value of `standard-output' (which see). */)
517 (Lisp_Object character, Lisp_Object printcharfun)
519 PRINTDECLARE;
521 if (NILP (printcharfun))
522 printcharfun = Vstandard_output;
523 CHECK_NUMBER (character);
524 PRINTPREPARE;
525 PRINTCHAR (XINT (character));
526 PRINTFINISH;
527 return character;
530 /* Used from outside of print.c to print a block of SIZE
531 single-byte chars at DATA on the default output stream.
532 Do not use this on the contents of a Lisp string. */
534 void
535 write_string (const char *data, int size)
537 PRINTDECLARE;
538 Lisp_Object printcharfun;
540 printcharfun = Vstandard_output;
542 PRINTPREPARE;
543 strout (data, size, size, printcharfun, 0);
544 PRINTFINISH;
547 /* Used from outside of print.c to print a block of SIZE
548 single-byte chars at DATA on a specified stream PRINTCHARFUN.
549 Do not use this on the contents of a Lisp string. */
551 void
552 write_string_1 (const char *data, int size, Lisp_Object printcharfun)
554 PRINTDECLARE;
556 PRINTPREPARE;
557 strout (data, size, size, printcharfun, 0);
558 PRINTFINISH;
562 void
563 temp_output_buffer_setup (const char *bufname)
565 int count = SPECPDL_INDEX ();
566 register struct buffer *old = current_buffer;
567 register Lisp_Object buf;
569 record_unwind_protect (set_buffer_if_live, Fcurrent_buffer ());
571 Fset_buffer (Fget_buffer_create (build_string (bufname)));
573 Fkill_all_local_variables ();
574 delete_all_overlays (current_buffer);
575 current_buffer->directory = old->directory;
576 current_buffer->read_only = Qnil;
577 current_buffer->filename = Qnil;
578 current_buffer->undo_list = Qt;
579 eassert (current_buffer->overlays_before == NULL);
580 eassert (current_buffer->overlays_after == NULL);
581 current_buffer->enable_multibyte_characters
582 = buffer_defaults.enable_multibyte_characters;
583 specbind (Qinhibit_read_only, Qt);
584 specbind (Qinhibit_modification_hooks, Qt);
585 Ferase_buffer ();
586 XSETBUFFER (buf, current_buffer);
588 Frun_hooks (1, &Qtemp_buffer_setup_hook);
590 unbind_to (count, Qnil);
592 specbind (Qstandard_output, buf);
595 Lisp_Object
596 internal_with_output_to_temp_buffer (const char *bufname, Lisp_Object (*function) (Lisp_Object), Lisp_Object args)
598 int count = SPECPDL_INDEX ();
599 Lisp_Object buf, val;
600 struct gcpro gcpro1;
602 GCPRO1 (args);
603 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
604 temp_output_buffer_setup (bufname);
605 buf = Vstandard_output;
606 UNGCPRO;
608 val = (*function) (args);
610 GCPRO1 (val);
611 temp_output_buffer_show (buf);
612 UNGCPRO;
614 return unbind_to (count, val);
617 DEFUN ("with-output-to-temp-buffer",
618 Fwith_output_to_temp_buffer, Swith_output_to_temp_buffer,
619 1, UNEVALLED, 0,
620 doc: /* Bind `standard-output' to buffer BUFNAME, eval BODY, then show that buffer.
622 This construct makes buffer BUFNAME empty before running BODY.
623 It does not make the buffer current for BODY.
624 Instead it binds `standard-output' to that buffer, so that output
625 generated with `prin1' and similar functions in BODY goes into
626 the buffer.
628 At the end of BODY, this marks buffer BUFNAME unmodifed and displays it
629 in a window, but does not select it. The normal way to do this is by
630 calling `display-buffer', then running `temp-buffer-show-hook'.
631 However, if `temp-buffer-show-function' is non-nil, it calls that
632 function instead (and does not run `temp-buffer-show-hook'). The
633 function gets one argument, the buffer to display. You can tell
634 `display-buffer' where and how to show the buffer by binding the
635 variable `temp-buffer-show-specifiers' to an appropriate value.
637 The return value of `with-output-to-temp-buffer' is the value of the
638 last form in BODY. If BODY does not finish normally, the buffer
639 BUFNAME is not displayed.
641 This runs the hook `temp-buffer-setup-hook' before BODY,
642 with the buffer BUFNAME temporarily current. It runs the hook
643 `temp-buffer-show-hook' after displaying buffer BUFNAME, with that
644 buffer temporarily current, and the window that was used to display it
645 temporarily selected. But it doesn't run `temp-buffer-show-hook'
646 if it uses `temp-buffer-show-function'.
648 usage: (with-output-to-temp-buffer BUFNAME BODY...) */)
649 (Lisp_Object args)
651 struct gcpro gcpro1;
652 Lisp_Object name;
653 int count = SPECPDL_INDEX ();
654 Lisp_Object buf, val;
656 GCPRO1(args);
657 name = Feval (Fcar (args));
658 CHECK_STRING (name);
659 temp_output_buffer_setup (SDATA (name));
660 buf = Vstandard_output;
661 UNGCPRO;
663 val = Fprogn (XCDR (args));
665 GCPRO1 (val);
666 temp_output_buffer_show (buf);
667 UNGCPRO;
669 return unbind_to (count, val);
673 static void print (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag);
674 static void print_preprocess (Lisp_Object obj);
675 static void print_preprocess_string (INTERVAL interval, Lisp_Object arg);
676 static void print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag);
678 DEFUN ("terpri", Fterpri, Sterpri, 0, 1, 0,
679 doc: /* Output a newline to stream PRINTCHARFUN.
680 If PRINTCHARFUN is omitted or nil, the value of `standard-output' is used. */)
681 (Lisp_Object printcharfun)
683 PRINTDECLARE;
685 if (NILP (printcharfun))
686 printcharfun = Vstandard_output;
687 PRINTPREPARE;
688 PRINTCHAR ('\n');
689 PRINTFINISH;
690 return Qt;
693 DEFUN ("prin1", Fprin1, Sprin1, 1, 2, 0,
694 doc: /* Output the printed representation of OBJECT, any Lisp object.
695 Quoting characters are printed when needed to make output that `read'
696 can handle, whenever this is possible. For complex objects, the behavior
697 is controlled by `print-level' and `print-length', which see.
699 OBJECT is any of the Lisp data types: a number, a string, a symbol,
700 a list, a buffer, a window, a frame, etc.
702 A printed representation of an object is text which describes that object.
704 Optional argument PRINTCHARFUN is the output stream, which can be one
705 of these:
707 - a buffer, in which case output is inserted into that buffer at point;
708 - a marker, in which case output is inserted at marker's position;
709 - a function, in which case that function is called once for each
710 character of OBJECT's printed representation;
711 - a symbol, in which case that symbol's function definition is called; or
712 - t, in which case the output is displayed in the echo area.
714 If PRINTCHARFUN is omitted, the value of `standard-output' (which see)
715 is used instead. */)
716 (Lisp_Object object, Lisp_Object printcharfun)
718 PRINTDECLARE;
720 if (NILP (printcharfun))
721 printcharfun = Vstandard_output;
722 PRINTPREPARE;
723 print (object, printcharfun, 1);
724 PRINTFINISH;
725 return object;
728 /* a buffer which is used to hold output being built by prin1-to-string */
729 Lisp_Object Vprin1_to_string_buffer;
731 DEFUN ("prin1-to-string", Fprin1_to_string, Sprin1_to_string, 1, 2, 0,
732 doc: /* Return a string containing the printed representation of OBJECT.
733 OBJECT can be any Lisp object. This function outputs quoting characters
734 when necessary to make output that `read' can handle, whenever possible,
735 unless the optional second argument NOESCAPE is non-nil. For complex objects,
736 the behavior is controlled by `print-level' and `print-length', which see.
738 OBJECT is any of the Lisp data types: a number, a string, a symbol,
739 a list, a buffer, a window, a frame, etc.
741 A printed representation of an object is text which describes that object. */)
742 (Lisp_Object object, Lisp_Object noescape)
744 Lisp_Object printcharfun;
745 /* struct gcpro gcpro1, gcpro2; */
746 Lisp_Object save_deactivate_mark;
747 int count = SPECPDL_INDEX ();
748 struct buffer *previous;
750 specbind (Qinhibit_modification_hooks, Qt);
753 PRINTDECLARE;
755 /* Save and restore this--we are altering a buffer
756 but we don't want to deactivate the mark just for that.
757 No need for specbind, since errors deactivate the mark. */
758 save_deactivate_mark = Vdeactivate_mark;
759 /* GCPRO2 (object, save_deactivate_mark); */
760 abort_on_gc++;
762 printcharfun = Vprin1_to_string_buffer;
763 PRINTPREPARE;
764 print (object, printcharfun, NILP (noescape));
765 /* Make Vprin1_to_string_buffer be the default buffer after PRINTFINSH */
766 PRINTFINISH;
769 previous = current_buffer;
770 set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
771 object = Fbuffer_string ();
772 if (SBYTES (object) == SCHARS (object))
773 STRING_SET_UNIBYTE (object);
775 /* Note that this won't make prepare_to_modify_buffer call
776 ask-user-about-supersession-threat because this buffer
777 does not visit a file. */
778 Ferase_buffer ();
779 set_buffer_internal (previous);
781 Vdeactivate_mark = save_deactivate_mark;
782 /* UNGCPRO; */
784 abort_on_gc--;
785 return unbind_to (count, object);
788 DEFUN ("princ", Fprinc, Sprinc, 1, 2, 0,
789 doc: /* Output the printed representation of OBJECT, any Lisp object.
790 No quoting characters are used; no delimiters are printed around
791 the contents of strings.
793 OBJECT is any of the Lisp data types: a number, a string, a symbol,
794 a list, a buffer, a window, a frame, etc.
796 A printed representation of an object is text which describes that object.
798 Optional argument PRINTCHARFUN is the output stream, which can be one
799 of these:
801 - a buffer, in which case output is inserted into that buffer at point;
802 - a marker, in which case output is inserted at marker's position;
803 - a function, in which case that function is called once for each
804 character of OBJECT's printed representation;
805 - a symbol, in which case that symbol's function definition is called; or
806 - t, in which case the output is displayed in the echo area.
808 If PRINTCHARFUN is omitted, the value of `standard-output' (which see)
809 is used instead. */)
810 (Lisp_Object object, Lisp_Object printcharfun)
812 PRINTDECLARE;
814 if (NILP (printcharfun))
815 printcharfun = Vstandard_output;
816 PRINTPREPARE;
817 print (object, printcharfun, 0);
818 PRINTFINISH;
819 return object;
822 DEFUN ("print", Fprint, Sprint, 1, 2, 0,
823 doc: /* Output the printed representation of OBJECT, with newlines around it.
824 Quoting characters are printed when needed to make output that `read'
825 can handle, whenever this is possible. For complex objects, the behavior
826 is controlled by `print-level' and `print-length', which see.
828 OBJECT is any of the Lisp data types: a number, a string, a symbol,
829 a list, a buffer, a window, a frame, etc.
831 A printed representation of an object is text which describes that object.
833 Optional argument PRINTCHARFUN is the output stream, which can be one
834 of these:
836 - a buffer, in which case output is inserted into that buffer at point;
837 - a marker, in which case output is inserted at marker's position;
838 - a function, in which case that function is called once for each
839 character of OBJECT's printed representation;
840 - a symbol, in which case that symbol's function definition is called; or
841 - t, in which case the output is displayed in the echo area.
843 If PRINTCHARFUN is omitted, the value of `standard-output' (which see)
844 is used instead. */)
845 (Lisp_Object object, Lisp_Object printcharfun)
847 PRINTDECLARE;
848 struct gcpro gcpro1;
850 if (NILP (printcharfun))
851 printcharfun = Vstandard_output;
852 GCPRO1 (object);
853 PRINTPREPARE;
854 PRINTCHAR ('\n');
855 print (object, printcharfun, 1);
856 PRINTCHAR ('\n');
857 PRINTFINISH;
858 UNGCPRO;
859 return object;
862 /* The subroutine object for external-debugging-output is kept here
863 for the convenience of the debugger. */
864 Lisp_Object Qexternal_debugging_output;
866 DEFUN ("external-debugging-output", Fexternal_debugging_output, Sexternal_debugging_output, 1, 1, 0,
867 doc: /* Write CHARACTER to stderr.
868 You can call print while debugging emacs, and pass it this function
869 to make it write to the debugging output. */)
870 (Lisp_Object character)
872 CHECK_NUMBER (character);
873 putc ((int) XINT (character), stderr);
875 #ifdef WINDOWSNT
876 /* Send the output to a debugger (nothing happens if there isn't one). */
877 if (print_output_debug_flag)
879 char buf[2] = {(char) XINT (character), '\0'};
880 OutputDebugString (buf);
882 #endif
884 return character;
887 /* This function is never called. Its purpose is to prevent
888 print_output_debug_flag from being optimized away. */
890 void
891 debug_output_compilation_hack (int x)
893 print_output_debug_flag = x;
896 #if defined (GNU_LINUX)
898 /* This functionality is not vitally important in general, so we rely on
899 non-portable ability to use stderr as lvalue. */
901 #define WITH_REDIRECT_DEBUGGING_OUTPUT 1
903 FILE *initial_stderr_stream = NULL;
905 DEFUN ("redirect-debugging-output", Fredirect_debugging_output, Sredirect_debugging_output,
906 1, 2,
907 "FDebug output file: \nP",
908 doc: /* Redirect debugging output (stderr stream) to file FILE.
909 If FILE is nil, reset target to the initial stderr stream.
910 Optional arg APPEND non-nil (interactively, with prefix arg) means
911 append to existing target file. */)
912 (Lisp_Object file, Lisp_Object append)
914 if (initial_stderr_stream != NULL)
916 BLOCK_INPUT;
917 fclose (stderr);
918 UNBLOCK_INPUT;
920 stderr = initial_stderr_stream;
921 initial_stderr_stream = NULL;
923 if (STRINGP (file))
925 file = Fexpand_file_name (file, Qnil);
926 initial_stderr_stream = stderr;
927 stderr = fopen (SDATA (file), NILP (append) ? "w" : "a");
928 if (stderr == NULL)
930 stderr = initial_stderr_stream;
931 initial_stderr_stream = NULL;
932 report_file_error ("Cannot open debugging output stream",
933 Fcons (file, Qnil));
936 return Qnil;
938 #endif /* GNU_LINUX */
941 /* This is the interface for debugging printing. */
943 void
944 debug_print (Lisp_Object arg)
946 Fprin1 (arg, Qexternal_debugging_output);
947 fprintf (stderr, "\r\n");
950 void
951 safe_debug_print (Lisp_Object arg)
953 int valid = valid_lisp_object_p (arg);
955 if (valid > 0)
956 debug_print (arg);
957 else
958 fprintf (stderr, "#<%s_LISP_OBJECT 0x%08lx>\r\n",
959 !valid ? "INVALID" : "SOME",
960 (unsigned long) XHASH (arg)
965 DEFUN ("error-message-string", Ferror_message_string, Serror_message_string,
966 1, 1, 0,
967 doc: /* Convert an error value (ERROR-SYMBOL . DATA) to an error message.
968 See Info anchor `(elisp)Definition of signal' for some details on how this
969 error message is constructed. */)
970 (Lisp_Object obj)
972 struct buffer *old = current_buffer;
973 Lisp_Object value;
974 struct gcpro gcpro1;
976 /* If OBJ is (error STRING), just return STRING.
977 That is not only faster, it also avoids the need to allocate
978 space here when the error is due to memory full. */
979 if (CONSP (obj) && EQ (XCAR (obj), Qerror)
980 && CONSP (XCDR (obj))
981 && STRINGP (XCAR (XCDR (obj)))
982 && NILP (XCDR (XCDR (obj))))
983 return XCAR (XCDR (obj));
985 print_error_message (obj, Vprin1_to_string_buffer, 0, Qnil);
987 set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
988 value = Fbuffer_string ();
990 GCPRO1 (value);
991 Ferase_buffer ();
992 set_buffer_internal (old);
993 UNGCPRO;
995 return value;
998 /* Print an error message for the error DATA onto Lisp output stream
999 STREAM (suitable for the print functions).
1000 CONTEXT is a C string describing the context of the error.
1001 CALLER is the Lisp function inside which the error was signaled. */
1003 void
1004 print_error_message (Lisp_Object data, Lisp_Object stream, const char *context,
1005 Lisp_Object caller)
1007 Lisp_Object errname, errmsg, file_error, tail;
1008 struct gcpro gcpro1;
1009 int i;
1011 if (context != 0)
1012 write_string_1 (context, -1, stream);
1014 /* If we know from where the error was signaled, show it in
1015 *Messages*. */
1016 if (!NILP (caller) && SYMBOLP (caller))
1018 Lisp_Object cname = SYMBOL_NAME (caller);
1019 char *name = alloca (SBYTES (cname));
1020 memcpy (name, SDATA (cname), SBYTES (cname));
1021 message_dolog (name, SBYTES (cname), 0, 0);
1022 message_dolog (": ", 2, 0, 0);
1025 errname = Fcar (data);
1027 if (EQ (errname, Qerror))
1029 data = Fcdr (data);
1030 if (!CONSP (data))
1031 data = Qnil;
1032 errmsg = Fcar (data);
1033 file_error = Qnil;
1035 else
1037 Lisp_Object error_conditions;
1038 errmsg = Fget (errname, Qerror_message);
1039 error_conditions = Fget (errname, Qerror_conditions);
1040 file_error = Fmemq (Qfile_error, error_conditions);
1043 /* Print an error message including the data items. */
1045 tail = Fcdr_safe (data);
1046 GCPRO1 (tail);
1048 /* For file-error, make error message by concatenating
1049 all the data items. They are all strings. */
1050 if (!NILP (file_error) && CONSP (tail))
1051 errmsg = XCAR (tail), tail = XCDR (tail);
1053 if (STRINGP (errmsg))
1054 Fprinc (errmsg, stream);
1055 else
1056 write_string_1 ("peculiar error", -1, stream);
1058 for (i = 0; CONSP (tail); tail = XCDR (tail), i++)
1060 Lisp_Object obj;
1062 write_string_1 (i ? ", " : ": ", 2, stream);
1063 obj = XCAR (tail);
1064 if (!NILP (file_error) || EQ (errname, Qend_of_file))
1065 Fprinc (obj, stream);
1066 else
1067 Fprin1 (obj, stream);
1070 UNGCPRO;
1076 * The buffer should be at least as large as the max string size of the
1077 * largest float, printed in the biggest notation. This is undoubtedly
1078 * 20d float_output_format, with the negative of the C-constant "HUGE"
1079 * from <math.h>.
1081 * On the vax the worst case is -1e38 in 20d format which takes 61 bytes.
1083 * I assume that IEEE-754 format numbers can take 329 bytes for the worst
1084 * case of -1e307 in 20d float_output_format. What is one to do (short of
1085 * re-writing _doprnt to be more sane)?
1086 * -wsr
1089 void
1090 float_to_string (unsigned char *buf, double data)
1092 unsigned char *cp;
1093 int width;
1095 /* Check for plus infinity in a way that won't lose
1096 if there is no plus infinity. */
1097 if (data == data / 2 && data > 1.0)
1099 strcpy (buf, "1.0e+INF");
1100 return;
1102 /* Likewise for minus infinity. */
1103 if (data == data / 2 && data < -1.0)
1105 strcpy (buf, "-1.0e+INF");
1106 return;
1108 /* Check for NaN in a way that won't fail if there are no NaNs. */
1109 if (! (data * 0.0 >= 0.0))
1111 /* Prepend "-" if the NaN's sign bit is negative.
1112 The sign bit of a double is the bit that is 1 in -0.0. */
1113 int i;
1114 union { double d; char c[sizeof (double)]; } u_data, u_minus_zero;
1115 u_data.d = data;
1116 u_minus_zero.d = - 0.0;
1117 for (i = 0; i < sizeof (double); i++)
1118 if (u_data.c[i] & u_minus_zero.c[i])
1120 *buf++ = '-';
1121 break;
1124 strcpy (buf, "0.0e+NaN");
1125 return;
1128 if (NILP (Vfloat_output_format)
1129 || !STRINGP (Vfloat_output_format))
1130 lose:
1132 /* Generate the fewest number of digits that represent the
1133 floating point value without losing information.
1134 The following method is simple but a bit slow.
1135 For ideas about speeding things up, please see:
1137 Guy L Steele Jr & Jon L White, How to print floating-point numbers
1138 accurately. SIGPLAN notices 25, 6 (June 1990), 112-126.
1140 Robert G Burger & R Kent Dybvig, Printing floating point numbers
1141 quickly and accurately, SIGPLAN notices 31, 5 (May 1996), 108-116. */
1143 width = fabs (data) < DBL_MIN ? 1 : DBL_DIG;
1145 sprintf (buf, "%.*g", width, data);
1146 while (width++ < DOUBLE_DIGITS_BOUND && atof (buf) != data);
1148 else /* oink oink */
1150 /* Check that the spec we have is fully valid.
1151 This means not only valid for printf,
1152 but meant for floats, and reasonable. */
1153 cp = SDATA (Vfloat_output_format);
1155 if (cp[0] != '%')
1156 goto lose;
1157 if (cp[1] != '.')
1158 goto lose;
1160 cp += 2;
1162 /* Check the width specification. */
1163 width = -1;
1164 if ('0' <= *cp && *cp <= '9')
1166 width = 0;
1168 width = (width * 10) + (*cp++ - '0');
1169 while (*cp >= '0' && *cp <= '9');
1171 /* A precision of zero is valid only for %f. */
1172 if (width > DBL_DIG
1173 || (width == 0 && *cp != 'f'))
1174 goto lose;
1177 if (*cp != 'e' && *cp != 'f' && *cp != 'g')
1178 goto lose;
1180 if (cp[1] != 0)
1181 goto lose;
1183 sprintf (buf, SDATA (Vfloat_output_format), data);
1186 /* Make sure there is a decimal point with digit after, or an
1187 exponent, so that the value is readable as a float. But don't do
1188 this with "%.0f"; it's valid for that not to produce a decimal
1189 point. Note that width can be 0 only for %.0f. */
1190 if (width != 0)
1192 for (cp = buf; *cp; cp++)
1193 if ((*cp < '0' || *cp > '9') && *cp != '-')
1194 break;
1196 if (*cp == '.' && cp[1] == 0)
1198 cp[1] = '0';
1199 cp[2] = 0;
1202 if (*cp == 0)
1204 *cp++ = '.';
1205 *cp++ = '0';
1206 *cp++ = 0;
1212 static void
1213 print (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag)
1215 new_backquote_output = 0;
1217 /* Reset print_number_index and Vprint_number_table only when
1218 the variable Vprint_continuous_numbering is nil. Otherwise,
1219 the values of these variables will be kept between several
1220 print functions. */
1221 if (NILP (Vprint_continuous_numbering)
1222 || NILP (Vprint_number_table))
1224 print_number_index = 0;
1225 Vprint_number_table = Qnil;
1228 /* Construct Vprint_number_table for print-gensym and print-circle. */
1229 if (!NILP (Vprint_gensym) || !NILP (Vprint_circle))
1231 int i, start, index;
1232 start = index = print_number_index;
1233 /* Construct Vprint_number_table.
1234 This increments print_number_index for the objects added. */
1235 print_depth = 0;
1236 print_preprocess (obj);
1238 /* Remove unnecessary objects, which appear only once in OBJ;
1239 that is, whose status is Qnil. Compactify the necessary objects. */
1240 for (i = start; i < print_number_index; i++)
1241 if (!NILP (PRINT_NUMBER_STATUS (Vprint_number_table, i)))
1243 PRINT_NUMBER_OBJECT (Vprint_number_table, index)
1244 = PRINT_NUMBER_OBJECT (Vprint_number_table, i);
1245 index++;
1248 /* Clear out objects outside the active part of the table. */
1249 for (i = index; i < print_number_index; i++)
1250 PRINT_NUMBER_OBJECT (Vprint_number_table, i) = Qnil;
1252 /* Reset the status field for the next print step. Now this
1253 field means whether the object has already been printed. */
1254 for (i = start; i < print_number_index; i++)
1255 PRINT_NUMBER_STATUS (Vprint_number_table, i) = Qnil;
1257 print_number_index = index;
1260 print_depth = 0;
1261 print_object (obj, printcharfun, escapeflag);
1264 /* Construct Vprint_number_table according to the structure of OBJ.
1265 OBJ itself and all its elements will be added to Vprint_number_table
1266 recursively if it is a list, vector, compiled function, char-table,
1267 string (its text properties will be traced), or a symbol that has
1268 no obarray (this is for the print-gensym feature).
1269 The status fields of Vprint_number_table mean whether each object appears
1270 more than once in OBJ: Qnil at the first time, and Qt after that . */
1271 static void
1272 print_preprocess (Lisp_Object obj)
1274 int i;
1275 EMACS_INT size;
1276 int loop_count = 0;
1277 Lisp_Object halftail;
1279 /* Give up if we go so deep that print_object will get an error. */
1280 /* See similar code in print_object. */
1281 if (print_depth >= PRINT_CIRCLE)
1282 error ("Apparently circular structure being printed");
1284 /* Avoid infinite recursion for circular nested structure
1285 in the case where Vprint_circle is nil. */
1286 if (NILP (Vprint_circle))
1288 for (i = 0; i < print_depth; i++)
1289 if (EQ (obj, being_printed[i]))
1290 return;
1291 being_printed[print_depth] = obj;
1294 print_depth++;
1295 halftail = obj;
1297 loop:
1298 if (STRINGP (obj) || CONSP (obj) || VECTORP (obj)
1299 || COMPILEDP (obj) || CHAR_TABLE_P (obj) || SUB_CHAR_TABLE_P (obj)
1300 || HASH_TABLE_P (obj)
1301 || (! NILP (Vprint_gensym)
1302 && SYMBOLP (obj)
1303 && !SYMBOL_INTERNED_P (obj)))
1305 /* In case print-circle is nil and print-gensym is t,
1306 add OBJ to Vprint_number_table only when OBJ is a symbol. */
1307 if (! NILP (Vprint_circle) || SYMBOLP (obj))
1309 for (i = 0; i < print_number_index; i++)
1310 if (EQ (PRINT_NUMBER_OBJECT (Vprint_number_table, i), obj))
1312 /* OBJ appears more than once. Let's remember that. */
1313 PRINT_NUMBER_STATUS (Vprint_number_table, i) = Qt;
1314 print_depth--;
1315 return;
1318 /* OBJ is not yet recorded. Let's add to the table. */
1319 if (print_number_index == 0)
1321 /* Initialize the table. */
1322 Vprint_number_table = Fmake_vector (make_number (40), Qnil);
1324 else if (XVECTOR (Vprint_number_table)->size == print_number_index * 2)
1326 /* Reallocate the table. */
1327 int i = print_number_index * 4;
1328 Lisp_Object old_table = Vprint_number_table;
1329 Vprint_number_table = Fmake_vector (make_number (i), Qnil);
1330 for (i = 0; i < print_number_index; i++)
1332 PRINT_NUMBER_OBJECT (Vprint_number_table, i)
1333 = PRINT_NUMBER_OBJECT (old_table, i);
1334 PRINT_NUMBER_STATUS (Vprint_number_table, i)
1335 = PRINT_NUMBER_STATUS (old_table, i);
1338 PRINT_NUMBER_OBJECT (Vprint_number_table, print_number_index) = obj;
1339 /* If Vprint_continuous_numbering is non-nil and OBJ is a gensym,
1340 always print the gensym with a number. This is a special for
1341 the lisp function byte-compile-output-docform. */
1342 if (!NILP (Vprint_continuous_numbering)
1343 && SYMBOLP (obj)
1344 && !SYMBOL_INTERNED_P (obj))
1345 PRINT_NUMBER_STATUS (Vprint_number_table, print_number_index) = Qt;
1346 print_number_index++;
1349 switch (XTYPE (obj))
1351 case Lisp_String:
1352 /* A string may have text properties, which can be circular. */
1353 traverse_intervals_noorder (STRING_INTERVALS (obj),
1354 print_preprocess_string, Qnil);
1355 break;
1357 case Lisp_Cons:
1358 /* Use HALFTAIL and LOOP_COUNT to detect circular lists,
1359 just as in print_object. */
1360 if (loop_count && EQ (obj, halftail))
1361 break;
1362 print_preprocess (XCAR (obj));
1363 obj = XCDR (obj);
1364 loop_count++;
1365 if (!(loop_count & 1))
1366 halftail = XCDR (halftail);
1367 goto loop;
1369 case Lisp_Vectorlike:
1370 size = XVECTOR (obj)->size;
1371 if (size & PSEUDOVECTOR_FLAG)
1372 size &= PSEUDOVECTOR_SIZE_MASK;
1373 for (i = 0; i < size; i++)
1374 print_preprocess (XVECTOR (obj)->contents[i]);
1375 if (HASH_TABLE_P (obj))
1376 { /* For hash tables, the key_and_value slot is past
1377 `size' because it needs to be marked specially in case
1378 the table is weak. */
1379 struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
1380 print_preprocess (h->key_and_value);
1382 break;
1384 default:
1385 break;
1388 print_depth--;
1391 static void
1392 print_preprocess_string (INTERVAL interval, Lisp_Object arg)
1394 print_preprocess (interval->plist);
1397 /* A flag to control printing of `charset' text property.
1398 The default value is Qdefault. */
1399 Lisp_Object Vprint_charset_text_property;
1401 static void print_check_string_charset_prop (INTERVAL interval, Lisp_Object string);
1403 #define PRINT_STRING_NON_CHARSET_FOUND 1
1404 #define PRINT_STRING_UNSAFE_CHARSET_FOUND 2
1406 /* Bitwise or of the above macros. */
1407 static int print_check_string_result;
1409 static void
1410 print_check_string_charset_prop (INTERVAL interval, Lisp_Object string)
1412 Lisp_Object val;
1414 if (NILP (interval->plist)
1415 || (print_check_string_result == (PRINT_STRING_NON_CHARSET_FOUND
1416 | PRINT_STRING_UNSAFE_CHARSET_FOUND)))
1417 return;
1418 for (val = interval->plist; CONSP (val) && ! EQ (XCAR (val), Qcharset);
1419 val = XCDR (XCDR (val)));
1420 if (! CONSP (val))
1422 print_check_string_result |= PRINT_STRING_NON_CHARSET_FOUND;
1423 return;
1425 if (! (print_check_string_result & PRINT_STRING_NON_CHARSET_FOUND))
1427 if (! EQ (val, interval->plist)
1428 || CONSP (XCDR (XCDR (val))))
1429 print_check_string_result |= PRINT_STRING_NON_CHARSET_FOUND;
1431 if (NILP (Vprint_charset_text_property)
1432 || ! (print_check_string_result & PRINT_STRING_UNSAFE_CHARSET_FOUND))
1434 int i, c;
1435 EMACS_INT charpos = interval->position;
1436 EMACS_INT bytepos = string_char_to_byte (string, charpos);
1437 Lisp_Object charset;
1439 charset = XCAR (XCDR (val));
1440 for (i = 0; i < LENGTH (interval); i++)
1442 FETCH_STRING_CHAR_ADVANCE (c, string, charpos, bytepos);
1443 if (! ASCII_CHAR_P (c)
1444 && ! EQ (CHARSET_NAME (CHAR_CHARSET (c)), charset))
1446 print_check_string_result |= PRINT_STRING_UNSAFE_CHARSET_FOUND;
1447 break;
1453 /* The value is (charset . nil). */
1454 static Lisp_Object print_prune_charset_plist;
1456 static Lisp_Object
1457 print_prune_string_charset (Lisp_Object string)
1459 print_check_string_result = 0;
1460 traverse_intervals (STRING_INTERVALS (string), 0,
1461 print_check_string_charset_prop, string);
1462 if (! (print_check_string_result & PRINT_STRING_UNSAFE_CHARSET_FOUND))
1464 string = Fcopy_sequence (string);
1465 if (print_check_string_result & PRINT_STRING_NON_CHARSET_FOUND)
1467 if (NILP (print_prune_charset_plist))
1468 print_prune_charset_plist = Fcons (Qcharset, Qnil);
1469 Fremove_text_properties (make_number (0),
1470 make_number (SCHARS (string)),
1471 print_prune_charset_plist, string);
1473 else
1474 Fset_text_properties (make_number (0), make_number (SCHARS (string)),
1475 Qnil, string);
1477 return string;
1480 static void
1481 print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag)
1483 char buf[40];
1485 QUIT;
1487 /* See similar code in print_preprocess. */
1488 if (print_depth >= PRINT_CIRCLE)
1489 error ("Apparently circular structure being printed");
1491 /* Detect circularities and truncate them. */
1492 if (STRINGP (obj) || CONSP (obj) || VECTORP (obj)
1493 || COMPILEDP (obj) || CHAR_TABLE_P (obj) || SUB_CHAR_TABLE_P (obj)
1494 || HASH_TABLE_P (obj)
1495 || (! NILP (Vprint_gensym)
1496 && SYMBOLP (obj)
1497 && !SYMBOL_INTERNED_P (obj)))
1499 if (NILP (Vprint_circle) && NILP (Vprint_gensym))
1501 /* Simple but incomplete way. */
1502 int i;
1503 for (i = 0; i < print_depth; i++)
1504 if (EQ (obj, being_printed[i]))
1506 sprintf (buf, "#%d", i);
1507 strout (buf, -1, -1, printcharfun, 0);
1508 return;
1510 being_printed[print_depth] = obj;
1512 else
1514 /* With the print-circle feature. */
1515 int i;
1516 for (i = 0; i < print_number_index; i++)
1517 if (EQ (PRINT_NUMBER_OBJECT (Vprint_number_table, i), obj))
1519 if (NILP (PRINT_NUMBER_STATUS (Vprint_number_table, i)))
1521 /* Add a prefix #n= if OBJ has not yet been printed;
1522 that is, its status field is nil. */
1523 sprintf (buf, "#%d=", i + 1);
1524 strout (buf, -1, -1, printcharfun, 0);
1525 /* OBJ is going to be printed. Set the status to t. */
1526 PRINT_NUMBER_STATUS (Vprint_number_table, i) = Qt;
1527 break;
1529 else
1531 /* Just print #n# if OBJ has already been printed. */
1532 sprintf (buf, "#%d#", i + 1);
1533 strout (buf, -1, -1, printcharfun, 0);
1534 return;
1540 print_depth++;
1542 switch (XTYPE (obj))
1544 case_Lisp_Int:
1545 if (sizeof (int) == sizeof (EMACS_INT))
1546 sprintf (buf, "%d", (int) XINT (obj));
1547 else if (sizeof (long) == sizeof (EMACS_INT))
1548 sprintf (buf, "%ld", (long) XINT (obj));
1549 else
1550 abort ();
1551 strout (buf, -1, -1, printcharfun, 0);
1552 break;
1554 case Lisp_Float:
1556 char pigbuf[350]; /* see comments in float_to_string */
1558 float_to_string (pigbuf, XFLOAT_DATA (obj));
1559 strout (pigbuf, -1, -1, printcharfun, 0);
1561 break;
1563 case Lisp_String:
1564 if (!escapeflag)
1565 print_string (obj, printcharfun);
1566 else
1568 register EMACS_INT i, i_byte;
1569 struct gcpro gcpro1;
1570 unsigned char *str;
1571 EMACS_INT size_byte;
1572 /* 1 means we must ensure that the next character we output
1573 cannot be taken as part of a hex character escape. */
1574 int need_nonhex = 0;
1575 int multibyte = STRING_MULTIBYTE (obj);
1577 GCPRO1 (obj);
1579 if (! EQ (Vprint_charset_text_property, Qt))
1580 obj = print_prune_string_charset (obj);
1582 if (!NULL_INTERVAL_P (STRING_INTERVALS (obj)))
1584 PRINTCHAR ('#');
1585 PRINTCHAR ('(');
1588 PRINTCHAR ('\"');
1589 str = SDATA (obj);
1590 size_byte = SBYTES (obj);
1592 for (i = 0, i_byte = 0; i_byte < size_byte;)
1594 /* Here, we must convert each multi-byte form to the
1595 corresponding character code before handing it to PRINTCHAR. */
1596 int len;
1597 int c;
1599 if (multibyte)
1601 c = STRING_CHAR_AND_LENGTH (str + i_byte, len);
1602 i_byte += len;
1604 else
1605 c = str[i_byte++];
1607 QUIT;
1609 if (c == '\n' && print_escape_newlines)
1611 PRINTCHAR ('\\');
1612 PRINTCHAR ('n');
1614 else if (c == '\f' && print_escape_newlines)
1616 PRINTCHAR ('\\');
1617 PRINTCHAR ('f');
1619 else if (multibyte
1620 && (CHAR_BYTE8_P (c)
1621 || (! ASCII_CHAR_P (c) && print_escape_multibyte)))
1623 /* When multibyte is disabled,
1624 print multibyte string chars using hex escapes.
1625 For a char code that could be in a unibyte string,
1626 when found in a multibyte string, always use a hex escape
1627 so it reads back as multibyte. */
1628 unsigned char outbuf[50];
1630 if (CHAR_BYTE8_P (c))
1631 sprintf (outbuf, "\\%03o", CHAR_TO_BYTE8 (c));
1632 else
1634 sprintf (outbuf, "\\x%04x", c);
1635 need_nonhex = 1;
1637 strout (outbuf, -1, -1, printcharfun, 0);
1639 else if (! multibyte
1640 && SINGLE_BYTE_CHAR_P (c) && ! ASCII_BYTE_P (c)
1641 && print_escape_nonascii)
1643 /* When printing in a multibyte buffer
1644 or when explicitly requested,
1645 print single-byte non-ASCII string chars
1646 using octal escapes. */
1647 unsigned char outbuf[5];
1648 sprintf (outbuf, "\\%03o", c);
1649 strout (outbuf, -1, -1, printcharfun, 0);
1651 else
1653 /* If we just had a hex escape, and this character
1654 could be taken as part of it,
1655 output `\ ' to prevent that. */
1656 if (need_nonhex)
1658 need_nonhex = 0;
1659 if ((c >= 'a' && c <= 'f')
1660 || (c >= 'A' && c <= 'F')
1661 || (c >= '0' && c <= '9'))
1662 strout ("\\ ", -1, -1, printcharfun, 0);
1665 if (c == '\"' || c == '\\')
1666 PRINTCHAR ('\\');
1667 PRINTCHAR (c);
1670 PRINTCHAR ('\"');
1672 if (!NULL_INTERVAL_P (STRING_INTERVALS (obj)))
1674 traverse_intervals (STRING_INTERVALS (obj),
1675 0, print_interval, printcharfun);
1676 PRINTCHAR (')');
1679 UNGCPRO;
1681 break;
1683 case Lisp_Symbol:
1685 register int confusing;
1686 register unsigned char *p = SDATA (SYMBOL_NAME (obj));
1687 register unsigned char *end = p + SBYTES (SYMBOL_NAME (obj));
1688 register int c;
1689 int i, i_byte;
1690 EMACS_INT size_byte;
1691 Lisp_Object name;
1693 name = SYMBOL_NAME (obj);
1695 if (p != end && (*p == '-' || *p == '+')) p++;
1696 if (p == end)
1697 confusing = 0;
1698 /* If symbol name begins with a digit, and ends with a digit,
1699 and contains nothing but digits and `e', it could be treated
1700 as a number. So set CONFUSING.
1702 Symbols that contain periods could also be taken as numbers,
1703 but periods are always escaped, so we don't have to worry
1704 about them here. */
1705 else if (*p >= '0' && *p <= '9'
1706 && end[-1] >= '0' && end[-1] <= '9')
1708 while (p != end && ((*p >= '0' && *p <= '9')
1709 /* Needed for \2e10. */
1710 || *p == 'e' || *p == 'E'))
1711 p++;
1712 confusing = (end == p);
1714 else
1715 confusing = 0;
1717 if (! NILP (Vprint_gensym) && !SYMBOL_INTERNED_P (obj))
1719 PRINTCHAR ('#');
1720 PRINTCHAR (':');
1723 size_byte = SBYTES (name);
1725 for (i = 0, i_byte = 0; i_byte < size_byte;)
1727 /* Here, we must convert each multi-byte form to the
1728 corresponding character code before handing it to PRINTCHAR. */
1729 FETCH_STRING_CHAR_ADVANCE (c, name, i, i_byte);
1730 QUIT;
1732 if (escapeflag)
1734 if (c == '\"' || c == '\\' || c == '\''
1735 || c == ';' || c == '#' || c == '(' || c == ')'
1736 || c == ',' || c =='.' || c == '`'
1737 || c == '[' || c == ']' || c == '?' || c <= 040
1738 || confusing)
1739 PRINTCHAR ('\\'), confusing = 0;
1741 PRINTCHAR (c);
1744 break;
1746 case Lisp_Cons:
1747 /* If deeper than spec'd depth, print placeholder. */
1748 if (INTEGERP (Vprint_level)
1749 && print_depth > XINT (Vprint_level))
1750 strout ("...", -1, -1, printcharfun, 0);
1751 else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
1752 && (EQ (XCAR (obj), Qquote)))
1754 PRINTCHAR ('\'');
1755 print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
1757 else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
1758 && (EQ (XCAR (obj), Qfunction)))
1760 PRINTCHAR ('#');
1761 PRINTCHAR ('\'');
1762 print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
1764 else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
1765 && ((EQ (XCAR (obj), Qbackquote))))
1767 print_object (XCAR (obj), printcharfun, 0);
1768 new_backquote_output++;
1769 print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
1770 new_backquote_output--;
1772 else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
1773 && new_backquote_output
1774 && ((EQ (XCAR (obj), Qbackquote)
1775 || EQ (XCAR (obj), Qcomma)
1776 || EQ (XCAR (obj), Qcomma_at)
1777 || EQ (XCAR (obj), Qcomma_dot))))
1779 print_object (XCAR (obj), printcharfun, 0);
1780 new_backquote_output--;
1781 print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
1782 new_backquote_output++;
1784 else
1786 PRINTCHAR ('(');
1788 /* If the first element is a backquote form,
1789 print it old-style so it won't be misunderstood. */
1790 if (print_quoted && CONSP (XCAR (obj))
1791 && CONSP (XCDR (XCAR (obj)))
1792 && NILP (XCDR (XCDR (XCAR (obj))))
1793 && EQ (XCAR (XCAR (obj)), Qbackquote))
1795 Lisp_Object tem;
1796 tem = XCAR (obj);
1797 PRINTCHAR ('(');
1799 print_object (Qbackquote, printcharfun, 0);
1800 PRINTCHAR (' ');
1802 print_object (XCAR (XCDR (tem)), printcharfun, 0);
1803 PRINTCHAR (')');
1805 obj = XCDR (obj);
1809 EMACS_INT print_length;
1810 int i;
1811 Lisp_Object halftail = obj;
1813 /* Negative values of print-length are invalid in CL.
1814 Treat them like nil, as CMUCL does. */
1815 if (NATNUMP (Vprint_length))
1816 print_length = XFASTINT (Vprint_length);
1817 else
1818 print_length = 0;
1820 i = 0;
1821 while (CONSP (obj))
1823 /* Detect circular list. */
1824 if (NILP (Vprint_circle))
1826 /* Simple but imcomplete way. */
1827 if (i != 0 && EQ (obj, halftail))
1829 sprintf (buf, " . #%d", i / 2);
1830 strout (buf, -1, -1, printcharfun, 0);
1831 goto end_of_list;
1834 else
1836 /* With the print-circle feature. */
1837 if (i != 0)
1839 int i;
1840 for (i = 0; i < print_number_index; i++)
1841 if (EQ (PRINT_NUMBER_OBJECT (Vprint_number_table, i),
1842 obj))
1844 if (NILP (PRINT_NUMBER_STATUS (Vprint_number_table, i)))
1846 strout (" . ", 3, 3, printcharfun, 0);
1847 print_object (obj, printcharfun, escapeflag);
1849 else
1851 sprintf (buf, " . #%d#", i + 1);
1852 strout (buf, -1, -1, printcharfun, 0);
1854 goto end_of_list;
1859 if (i++)
1860 PRINTCHAR (' ');
1862 if (print_length && i > print_length)
1864 strout ("...", 3, 3, printcharfun, 0);
1865 goto end_of_list;
1868 print_object (XCAR (obj), printcharfun, escapeflag);
1870 obj = XCDR (obj);
1871 if (!(i & 1))
1872 halftail = XCDR (halftail);
1876 /* OBJ non-nil here means it's the end of a dotted list. */
1877 if (!NILP (obj))
1879 strout (" . ", 3, 3, printcharfun, 0);
1880 print_object (obj, printcharfun, escapeflag);
1883 end_of_list:
1884 PRINTCHAR (')');
1886 break;
1888 case Lisp_Vectorlike:
1889 if (PROCESSP (obj))
1891 if (escapeflag)
1893 strout ("#<process ", -1, -1, printcharfun, 0);
1894 print_string (XPROCESS (obj)->name, printcharfun);
1895 PRINTCHAR ('>');
1897 else
1898 print_string (XPROCESS (obj)->name, printcharfun);
1900 else if (BOOL_VECTOR_P (obj))
1902 register int i;
1903 register unsigned char c;
1904 struct gcpro gcpro1;
1905 EMACS_INT size_in_chars
1906 = ((XBOOL_VECTOR (obj)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
1907 / BOOL_VECTOR_BITS_PER_CHAR);
1909 GCPRO1 (obj);
1911 PRINTCHAR ('#');
1912 PRINTCHAR ('&');
1913 sprintf (buf, "%ld", (long) XBOOL_VECTOR (obj)->size);
1914 strout (buf, -1, -1, printcharfun, 0);
1915 PRINTCHAR ('\"');
1917 /* Don't print more characters than the specified maximum.
1918 Negative values of print-length are invalid. Treat them
1919 like a print-length of nil. */
1920 if (NATNUMP (Vprint_length)
1921 && XFASTINT (Vprint_length) < size_in_chars)
1922 size_in_chars = XFASTINT (Vprint_length);
1924 for (i = 0; i < size_in_chars; i++)
1926 QUIT;
1927 c = XBOOL_VECTOR (obj)->data[i];
1928 if (c == '\n' && print_escape_newlines)
1930 PRINTCHAR ('\\');
1931 PRINTCHAR ('n');
1933 else if (c == '\f' && print_escape_newlines)
1935 PRINTCHAR ('\\');
1936 PRINTCHAR ('f');
1938 else if (c > '\177')
1940 /* Use octal escapes to avoid encoding issues. */
1941 PRINTCHAR ('\\');
1942 PRINTCHAR ('0' + ((c >> 6) & 3));
1943 PRINTCHAR ('0' + ((c >> 3) & 7));
1944 PRINTCHAR ('0' + (c & 7));
1946 else
1948 if (c == '\"' || c == '\\')
1949 PRINTCHAR ('\\');
1950 PRINTCHAR (c);
1953 PRINTCHAR ('\"');
1955 UNGCPRO;
1957 else if (SUBRP (obj))
1959 strout ("#<subr ", -1, -1, printcharfun, 0);
1960 strout (XSUBR (obj)->symbol_name, -1, -1, printcharfun, 0);
1961 PRINTCHAR ('>');
1963 else if (WINDOWP (obj))
1965 strout ("#<window ", -1, -1, printcharfun, 0);
1966 sprintf (buf, "%ld", (long) XFASTINT (XWINDOW (obj)->sequence_number));
1967 strout (buf, -1, -1, printcharfun, 0);
1968 if (!NILP (XWINDOW (obj)->buffer))
1970 strout (" on ", -1, -1, printcharfun, 0);
1971 print_string (XBUFFER (XWINDOW (obj)->buffer)->name, printcharfun);
1973 PRINTCHAR ('>');
1975 else if (TERMINALP (obj))
1977 struct terminal *t = XTERMINAL (obj);
1978 strout ("#<terminal ", -1, -1, printcharfun, 0);
1979 sprintf (buf, "%d", t->id);
1980 strout (buf, -1, -1, printcharfun, 0);
1981 if (t->name)
1983 strout (" on ", -1, -1, printcharfun, 0);
1984 strout (t->name, -1, -1, printcharfun, 0);
1986 PRINTCHAR ('>');
1988 else if (HASH_TABLE_P (obj))
1990 struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
1991 int i;
1992 EMACS_INT real_size, size;
1993 #if 0
1994 strout ("#<hash-table", -1, -1, printcharfun, 0);
1995 if (SYMBOLP (h->test))
1997 PRINTCHAR (' ');
1998 PRINTCHAR ('\'');
1999 strout (SDATA (SYMBOL_NAME (h->test)), -1, -1, printcharfun, 0);
2000 PRINTCHAR (' ');
2001 strout (SDATA (SYMBOL_NAME (h->weak)), -1, -1, printcharfun, 0);
2002 PRINTCHAR (' ');
2003 sprintf (buf, "%ld/%ld", (long) h->count,
2004 (long) XVECTOR (h->next)->size);
2005 strout (buf, -1, -1, printcharfun, 0);
2007 sprintf (buf, " 0x%lx", (unsigned long) h);
2008 strout (buf, -1, -1, printcharfun, 0);
2009 PRINTCHAR ('>');
2010 #endif
2011 /* Implement a readable output, e.g.:
2012 #s(hash-table size 2 test equal data (k1 v1 k2 v2)) */
2013 /* Always print the size. */
2014 sprintf (buf, "#s(hash-table size %ld",
2015 (long) XVECTOR (h->next)->size);
2016 strout (buf, -1, -1, printcharfun, 0);
2018 if (!NILP (h->test))
2020 strout (" test ", -1, -1, printcharfun, 0);
2021 print_object (h->test, printcharfun, 0);
2024 if (!NILP (h->weak))
2026 strout (" weakness ", -1, -1, printcharfun, 0);
2027 print_object (h->weak, printcharfun, 0);
2030 if (!NILP (h->rehash_size))
2032 strout (" rehash-size ", -1, -1, printcharfun, 0);
2033 print_object (h->rehash_size, printcharfun, 0);
2036 if (!NILP (h->rehash_threshold))
2038 strout (" rehash-threshold ", -1, -1, printcharfun, 0);
2039 print_object (h->rehash_threshold, printcharfun, 0);
2042 strout (" data ", -1, -1, printcharfun, 0);
2044 /* Print the data here as a plist. */
2045 real_size = HASH_TABLE_SIZE (h);
2046 size = real_size;
2048 /* Don't print more elements than the specified maximum. */
2049 if (NATNUMP (Vprint_length)
2050 && XFASTINT (Vprint_length) < size)
2051 size = XFASTINT (Vprint_length);
2053 PRINTCHAR ('(');
2054 for (i = 0; i < size; i++)
2055 if (!NILP (HASH_HASH (h, i)))
2057 if (i) PRINTCHAR (' ');
2058 print_object (HASH_KEY (h, i), printcharfun, 1);
2059 PRINTCHAR (' ');
2060 print_object (HASH_VALUE (h, i), printcharfun, 1);
2063 if (size < real_size)
2064 strout (" ...", 4, 4, printcharfun, 0);
2066 PRINTCHAR (')');
2067 PRINTCHAR (')');
2070 else if (BUFFERP (obj))
2072 if (NILP (XBUFFER (obj)->name))
2073 strout ("#<killed buffer>", -1, -1, printcharfun, 0);
2074 else if (escapeflag)
2076 strout ("#<buffer ", -1, -1, printcharfun, 0);
2077 print_string (XBUFFER (obj)->name, printcharfun);
2078 PRINTCHAR ('>');
2080 else
2081 print_string (XBUFFER (obj)->name, printcharfun);
2083 else if (WINDOW_CONFIGURATIONP (obj))
2085 strout ("#<window-configuration>", -1, -1, printcharfun, 0);
2087 else if (FRAMEP (obj))
2089 strout ((FRAME_LIVE_P (XFRAME (obj))
2090 ? "#<frame " : "#<dead frame "),
2091 -1, -1, printcharfun, 0);
2092 print_string (XFRAME (obj)->name, printcharfun);
2093 sprintf (buf, " 0x%lx", (unsigned long) (XFRAME (obj)));
2094 strout (buf, -1, -1, printcharfun, 0);
2095 PRINTCHAR ('>');
2097 else if (FONTP (obj))
2099 EMACS_INT i;
2101 if (! FONT_OBJECT_P (obj))
2103 if (FONT_SPEC_P (obj))
2104 strout ("#<font-spec", -1, -1, printcharfun, 0);
2105 else
2106 strout ("#<font-entity", -1, -1, printcharfun, 0);
2107 for (i = 0; i < FONT_SPEC_MAX; i++)
2109 PRINTCHAR (' ');
2110 if (i < FONT_WEIGHT_INDEX || i > FONT_WIDTH_INDEX)
2111 print_object (AREF (obj, i), printcharfun, escapeflag);
2112 else
2113 print_object (font_style_symbolic (obj, i, 0),
2114 printcharfun, escapeflag);
2117 else
2119 strout ("#<font-object ", -1, -1, printcharfun, 0);
2120 print_object (AREF (obj, FONT_NAME_INDEX), printcharfun,
2121 escapeflag);
2123 PRINTCHAR ('>');
2125 else
2127 EMACS_INT size = XVECTOR (obj)->size;
2128 if (COMPILEDP (obj))
2130 PRINTCHAR ('#');
2131 size &= PSEUDOVECTOR_SIZE_MASK;
2133 if (CHAR_TABLE_P (obj) || SUB_CHAR_TABLE_P (obj))
2135 /* We print a char-table as if it were a vector,
2136 lumping the parent and default slots in with the
2137 character slots. But we add #^ as a prefix. */
2139 /* Make each lowest sub_char_table start a new line.
2140 Otherwise we'll make a line extremely long, which
2141 results in slow redisplay. */
2142 if (SUB_CHAR_TABLE_P (obj)
2143 && XINT (XSUB_CHAR_TABLE (obj)->depth) == 3)
2144 PRINTCHAR ('\n');
2145 PRINTCHAR ('#');
2146 PRINTCHAR ('^');
2147 if (SUB_CHAR_TABLE_P (obj))
2148 PRINTCHAR ('^');
2149 size &= PSEUDOVECTOR_SIZE_MASK;
2151 if (size & PSEUDOVECTOR_FLAG)
2152 goto badtype;
2154 PRINTCHAR ('[');
2156 register int i;
2157 register Lisp_Object tem;
2158 EMACS_INT real_size = size;
2160 /* Don't print more elements than the specified maximum. */
2161 if (NATNUMP (Vprint_length)
2162 && XFASTINT (Vprint_length) < size)
2163 size = XFASTINT (Vprint_length);
2165 for (i = 0; i < size; i++)
2167 if (i) PRINTCHAR (' ');
2168 tem = XVECTOR (obj)->contents[i];
2169 print_object (tem, printcharfun, escapeflag);
2171 if (size < real_size)
2172 strout (" ...", 4, 4, printcharfun, 0);
2174 PRINTCHAR (']');
2176 break;
2178 case Lisp_Misc:
2179 switch (XMISCTYPE (obj))
2181 case Lisp_Misc_Marker:
2182 strout ("#<marker ", -1, -1, printcharfun, 0);
2183 /* Do you think this is necessary? */
2184 if (XMARKER (obj)->insertion_type != 0)
2185 strout ("(moves after insertion) ", -1, -1, printcharfun, 0);
2186 if (! XMARKER (obj)->buffer)
2187 strout ("in no buffer", -1, -1, printcharfun, 0);
2188 else
2190 sprintf (buf, "at %ld", (long)marker_position (obj));
2191 strout (buf, -1, -1, printcharfun, 0);
2192 strout (" in ", -1, -1, printcharfun, 0);
2193 print_string (XMARKER (obj)->buffer->name, printcharfun);
2195 PRINTCHAR ('>');
2196 break;
2198 case Lisp_Misc_Overlay:
2199 strout ("#<overlay ", -1, -1, printcharfun, 0);
2200 if (! XMARKER (OVERLAY_START (obj))->buffer)
2201 strout ("in no buffer", -1, -1, printcharfun, 0);
2202 else
2204 sprintf (buf, "from %ld to %ld in ",
2205 (long)marker_position (OVERLAY_START (obj)),
2206 (long)marker_position (OVERLAY_END (obj)));
2207 strout (buf, -1, -1, printcharfun, 0);
2208 print_string (XMARKER (OVERLAY_START (obj))->buffer->name,
2209 printcharfun);
2211 PRINTCHAR ('>');
2212 break;
2214 /* Remaining cases shouldn't happen in normal usage, but let's print
2215 them anyway for the benefit of the debugger. */
2216 case Lisp_Misc_Free:
2217 strout ("#<misc free cell>", -1, -1, printcharfun, 0);
2218 break;
2220 case Lisp_Misc_Save_Value:
2221 strout ("#<save_value ", -1, -1, printcharfun, 0);
2222 sprintf(buf, "ptr=0x%08lx int=%d",
2223 (unsigned long) XSAVE_VALUE (obj)->pointer,
2224 XSAVE_VALUE (obj)->integer);
2225 strout (buf, -1, -1, printcharfun, 0);
2226 PRINTCHAR ('>');
2227 break;
2229 default:
2230 goto badtype;
2232 break;
2234 default:
2235 badtype:
2237 /* We're in trouble if this happens!
2238 Probably should just abort () */
2239 strout ("#<EMACS BUG: INVALID DATATYPE ", -1, -1, printcharfun, 0);
2240 if (MISCP (obj))
2241 sprintf (buf, "(MISC 0x%04x)", (int) XMISCTYPE (obj));
2242 else if (VECTORLIKEP (obj))
2243 sprintf (buf, "(PVEC 0x%08x)", (int) XVECTOR (obj)->size);
2244 else
2245 sprintf (buf, "(0x%02x)", (int) XTYPE (obj));
2246 strout (buf, -1, -1, printcharfun, 0);
2247 strout (" Save your buffers immediately and please report this bug>",
2248 -1, -1, printcharfun, 0);
2252 print_depth--;
2256 /* Print a description of INTERVAL using PRINTCHARFUN.
2257 This is part of printing a string that has text properties. */
2259 void
2260 print_interval (INTERVAL interval, Lisp_Object printcharfun)
2262 if (NILP (interval->plist))
2263 return;
2264 PRINTCHAR (' ');
2265 print_object (make_number (interval->position), printcharfun, 1);
2266 PRINTCHAR (' ');
2267 print_object (make_number (interval->position + LENGTH (interval)),
2268 printcharfun, 1);
2269 PRINTCHAR (' ');
2270 print_object (interval->plist, printcharfun, 1);
2274 void
2275 syms_of_print (void)
2277 Qtemp_buffer_setup_hook = intern_c_string ("temp-buffer-setup-hook");
2278 staticpro (&Qtemp_buffer_setup_hook);
2280 DEFVAR_LISP ("standard-output", &Vstandard_output,
2281 doc: /* Output stream `print' uses by default for outputting a character.
2282 This may be any function of one argument.
2283 It may also be a buffer (output is inserted before point)
2284 or a marker (output is inserted and the marker is advanced)
2285 or the symbol t (output appears in the echo area). */);
2286 Vstandard_output = Qt;
2287 Qstandard_output = intern_c_string ("standard-output");
2288 staticpro (&Qstandard_output);
2290 DEFVAR_LISP ("float-output-format", &Vfloat_output_format,
2291 doc: /* The format descriptor string used to print floats.
2292 This is a %-spec like those accepted by `printf' in C,
2293 but with some restrictions. It must start with the two characters `%.'.
2294 After that comes an integer precision specification,
2295 and then a letter which controls the format.
2296 The letters allowed are `e', `f' and `g'.
2297 Use `e' for exponential notation \"DIG.DIGITSeEXPT\"
2298 Use `f' for decimal point notation \"DIGITS.DIGITS\".
2299 Use `g' to choose the shorter of those two formats for the number at hand.
2300 The precision in any of these cases is the number of digits following
2301 the decimal point. With `f', a precision of 0 means to omit the
2302 decimal point. 0 is not allowed with `e' or `g'.
2304 A value of nil means to use the shortest notation
2305 that represents the number without losing information. */);
2306 Vfloat_output_format = Qnil;
2307 Qfloat_output_format = intern_c_string ("float-output-format");
2308 staticpro (&Qfloat_output_format);
2310 DEFVAR_LISP ("print-length", &Vprint_length,
2311 doc: /* Maximum length of list to print before abbreviating.
2312 A value of nil means no limit. See also `eval-expression-print-length'. */);
2313 Vprint_length = Qnil;
2315 DEFVAR_LISP ("print-level", &Vprint_level,
2316 doc: /* Maximum depth of list nesting to print before abbreviating.
2317 A value of nil means no limit. See also `eval-expression-print-level'. */);
2318 Vprint_level = Qnil;
2320 DEFVAR_BOOL ("print-escape-newlines", &print_escape_newlines,
2321 doc: /* Non-nil means print newlines in strings as `\\n'.
2322 Also print formfeeds as `\\f'. */);
2323 print_escape_newlines = 0;
2325 DEFVAR_BOOL ("print-escape-nonascii", &print_escape_nonascii,
2326 doc: /* Non-nil means print unibyte non-ASCII chars in strings as \\OOO.
2327 \(OOO is the octal representation of the character code.)
2328 Only single-byte characters are affected, and only in `prin1'.
2329 When the output goes in a multibyte buffer, this feature is
2330 enabled regardless of the value of the variable. */);
2331 print_escape_nonascii = 0;
2333 DEFVAR_BOOL ("print-escape-multibyte", &print_escape_multibyte,
2334 doc: /* Non-nil means print multibyte characters in strings as \\xXXXX.
2335 \(XXXX is the hex representation of the character code.)
2336 This affects only `prin1'. */);
2337 print_escape_multibyte = 0;
2339 DEFVAR_BOOL ("print-quoted", &print_quoted,
2340 doc: /* Non-nil means print quoted forms with reader syntax.
2341 I.e., (quote foo) prints as 'foo, (function foo) as #'foo. */);
2342 print_quoted = 0;
2344 DEFVAR_LISP ("print-gensym", &Vprint_gensym,
2345 doc: /* Non-nil means print uninterned symbols so they will read as uninterned.
2346 I.e., the value of (make-symbol \"foobar\") prints as #:foobar.
2347 When the uninterned symbol appears within a recursive data structure,
2348 and the symbol appears more than once, in addition use the #N# and #N=
2349 constructs as needed, so that multiple references to the same symbol are
2350 shared once again when the text is read back. */);
2351 Vprint_gensym = Qnil;
2353 DEFVAR_LISP ("print-circle", &Vprint_circle,
2354 doc: /* *Non-nil means print recursive structures using #N= and #N# syntax.
2355 If nil, printing proceeds recursively and may lead to
2356 `max-lisp-eval-depth' being exceeded or an error may occur:
2357 \"Apparently circular structure being printed.\" Also see
2358 `print-length' and `print-level'.
2359 If non-nil, shared substructures anywhere in the structure are printed
2360 with `#N=' before the first occurrence (in the order of the print
2361 representation) and `#N#' in place of each subsequent occurrence,
2362 where N is a positive decimal integer. */);
2363 Vprint_circle = Qnil;
2365 DEFVAR_LISP ("print-continuous-numbering", &Vprint_continuous_numbering,
2366 doc: /* *Non-nil means number continuously across print calls.
2367 This affects the numbers printed for #N= labels and #M# references.
2368 See also `print-circle', `print-gensym', and `print-number-table'.
2369 This variable should not be set with `setq'; bind it with a `let' instead. */);
2370 Vprint_continuous_numbering = Qnil;
2372 DEFVAR_LISP ("print-number-table", &Vprint_number_table,
2373 doc: /* A vector used internally to produce `#N=' labels and `#N#' references.
2374 The Lisp printer uses this vector to detect Lisp objects referenced more
2375 than once.
2377 When you bind `print-continuous-numbering' to t, you should probably
2378 also bind `print-number-table' to nil. This ensures that the value of
2379 `print-number-table' can be garbage-collected once the printing is
2380 done. If all elements of `print-number-table' are nil, it means that
2381 the printing done so far has not found any shared structure or objects
2382 that need to be recorded in the table. */);
2383 Vprint_number_table = Qnil;
2385 DEFVAR_LISP ("print-charset-text-property", &Vprint_charset_text_property,
2386 doc: /* A flag to control printing of `charset' text property on printing a string.
2387 The value must be nil, t, or `default'.
2389 If the value is nil, don't print the text property `charset'.
2391 If the value is t, always print the text property `charset'.
2393 If the value is `default', print the text property `charset' only when
2394 the value is different from what is guessed in the current charset
2395 priorities. */);
2396 Vprint_charset_text_property = Qdefault;
2398 /* prin1_to_string_buffer initialized in init_buffer_once in buffer.c */
2399 staticpro (&Vprin1_to_string_buffer);
2401 defsubr (&Sprin1);
2402 defsubr (&Sprin1_to_string);
2403 defsubr (&Serror_message_string);
2404 defsubr (&Sprinc);
2405 defsubr (&Sprint);
2406 defsubr (&Sterpri);
2407 defsubr (&Swrite_char);
2408 defsubr (&Sexternal_debugging_output);
2409 #ifdef WITH_REDIRECT_DEBUGGING_OUTPUT
2410 defsubr (&Sredirect_debugging_output);
2411 #endif
2413 Qexternal_debugging_output = intern_c_string ("external-debugging-output");
2414 staticpro (&Qexternal_debugging_output);
2416 Qprint_escape_newlines = intern_c_string ("print-escape-newlines");
2417 staticpro (&Qprint_escape_newlines);
2419 Qprint_escape_multibyte = intern_c_string ("print-escape-multibyte");
2420 staticpro (&Qprint_escape_multibyte);
2422 Qprint_escape_nonascii = intern_c_string ("print-escape-nonascii");
2423 staticpro (&Qprint_escape_nonascii);
2425 print_prune_charset_plist = Qnil;
2426 staticpro (&print_prune_charset_plist);
2428 defsubr (&Swith_output_to_temp_buffer);
2431 /* arch-tag: bc797170-94ae-41de-86e3-75e20f8f7a39
2432 (do not change this comment) */