1 /* Lisp object printing and output streams.
2 Copyright (C) 1985, 1986, 1988, 1993, 1994 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
31 #include "dispextern.h"
33 #endif /* not standalone */
35 #ifdef USE_TEXT_PROPERTIES
36 #include "intervals.h"
39 Lisp_Object Vstandard_output
, Qstandard_output
;
41 #ifdef LISP_FLOAT_TYPE
42 Lisp_Object Vfloat_output_format
, Qfloat_output_format
;
43 #endif /* LISP_FLOAT_TYPE */
45 /* Avoid actual stack overflow in print. */
48 /* Detect most circularities to print finite output. */
49 #define PRINT_CIRCLE 200
50 Lisp_Object being_printed
[PRINT_CIRCLE
];
52 /* Maximum length of list to print in full; noninteger means
53 effectively infinity */
55 Lisp_Object Vprint_length
;
57 /* Maximum depth of list to print in full; noninteger means
58 effectively infinity. */
60 Lisp_Object Vprint_level
;
62 /* Nonzero means print newlines in strings as \n. */
64 int print_escape_newlines
;
66 Lisp_Object Qprint_escape_newlines
;
68 /* Nonzero means print newline to stdout before next minibuffer message.
71 extern int noninteractive_need_newline
;
73 #ifdef MAX_PRINT_CHARS
74 static int print_chars
;
76 #endif /* MAX_PRINT_CHARS */
78 void print_interval ();
81 /* Convert between chars and GLYPHs */
85 register GLYPH
*glyphs
;
95 str_to_glyph_cpy (str
, glyphs
)
99 register GLYPH
*gp
= glyphs
;
100 register char *cp
= str
;
107 str_to_glyph_ncpy (str
, glyphs
, n
)
112 register GLYPH
*gp
= glyphs
;
113 register char *cp
= str
;
120 glyph_to_str_cpy (glyphs
, str
)
124 register GLYPH
*gp
= glyphs
;
125 register char *cp
= str
;
128 *str
++ = *gp
++ & 0377;
132 /* Low level output routines for characters and strings */
134 /* Lisp functions to do output using a stream
135 must have the stream in a variable called printcharfun
136 and must start with PRINTPREPARE and end with PRINTFINISH.
137 Use PRINTCHAR to output one character,
138 or call strout to output a block of characters.
139 Also, each one must have the declarations
140 struct buffer *old = current_buffer;
141 int old_point = -1, start_point;
142 Lisp_Object original;
145 #define PRINTPREPARE \
146 original = printcharfun; \
147 if (NILP (printcharfun)) printcharfun = Qt; \
148 if (BUFFERP (printcharfun)) \
149 { if (XBUFFER (printcharfun) != current_buffer) \
150 Fset_buffer (printcharfun); \
151 printcharfun = Qnil;} \
152 if (MARKERP (printcharfun)) \
153 { if (!(XMARKER (original)->buffer)) \
154 error ("Marker does not point anywhere"); \
155 if (XMARKER (original)->buffer != current_buffer) \
156 set_buffer_internal (XMARKER (original)->buffer); \
158 SET_PT (marker_position (printcharfun)); \
159 start_point = point; \
160 printcharfun = Qnil;}
162 #define PRINTFINISH \
163 if (MARKERP (original)) \
164 Fset_marker (original, make_number (point), Qnil); \
165 if (old_point >= 0) \
166 SET_PT (old_point + (old_point >= start_point \
167 ? point - start_point : 0)); \
168 if (old != current_buffer) \
169 set_buffer_internal (old)
171 #define PRINTCHAR(ch) printchar (ch, printcharfun)
173 /* Index of first unused element of FRAME_MESSAGE_BUF(mini_frame). */
174 static int printbufidx
;
183 #ifdef MAX_PRINT_CHARS
186 #endif /* MAX_PRINT_CHARS */
198 = XFRAME (WINDOW_FRAME (XWINDOW (minibuf_window
)));
203 noninteractive_need_newline
= 1;
207 if (echo_area_glyphs
!= FRAME_MESSAGE_BUF (mini_frame
)
208 || !message_buf_print
)
210 message_log_maybe_newline ();
211 echo_area_glyphs
= FRAME_MESSAGE_BUF (mini_frame
);
213 echo_area_glyphs_length
= 0;
214 message_buf_print
= 1;
217 message_dolog (&ch
, 1, 0);
218 if (printbufidx
< FRAME_WIDTH (mini_frame
) - 1)
219 FRAME_MESSAGE_BUF (mini_frame
)[printbufidx
++] = ch
;
220 FRAME_MESSAGE_BUF (mini_frame
)[printbufidx
] = 0;
221 echo_area_glyphs_length
= printbufidx
;
225 #endif /* not standalone */
227 XSETFASTINT (ch1
, ch
);
232 strout (ptr
, size
, printcharfun
)
235 Lisp_Object printcharfun
;
239 if (EQ (printcharfun
, Qnil
))
241 insert (ptr
, size
>= 0 ? size
: strlen (ptr
));
242 #ifdef MAX_PRINT_CHARS
244 print_chars
+= size
>= 0 ? size
: strlen(ptr
);
245 #endif /* MAX_PRINT_CHARS */
248 if (EQ (printcharfun
, Qt
))
251 = XFRAME (WINDOW_FRAME (XWINDOW (minibuf_window
)));
253 i
= size
>= 0 ? size
: strlen (ptr
);
254 #ifdef MAX_PRINT_CHARS
257 #endif /* MAX_PRINT_CHARS */
261 fwrite (ptr
, 1, i
, stdout
);
262 noninteractive_need_newline
= 1;
266 if (echo_area_glyphs
!= FRAME_MESSAGE_BUF (mini_frame
)
267 || !message_buf_print
)
269 message_log_maybe_newline ();
270 echo_area_glyphs
= FRAME_MESSAGE_BUF (mini_frame
);
272 echo_area_glyphs_length
= 0;
273 message_buf_print
= 1;
276 message_dolog (ptr
, i
, 0);
277 if (i
> FRAME_WIDTH (mini_frame
) - printbufidx
- 1)
278 i
= FRAME_WIDTH (mini_frame
) - printbufidx
- 1;
279 bcopy (ptr
, &FRAME_MESSAGE_BUF (mini_frame
) [printbufidx
], i
);
281 echo_area_glyphs_length
= printbufidx
;
282 FRAME_MESSAGE_BUF (mini_frame
) [printbufidx
] = 0;
289 PRINTCHAR (ptr
[i
++]);
292 PRINTCHAR (ptr
[i
++]);
295 /* Print the contents of a string STRING using PRINTCHARFUN.
296 It isn't safe to use strout, because printing one char can relocate. */
298 print_string (string
, printcharfun
)
300 Lisp_Object printcharfun
;
302 if (EQ (printcharfun
, Qnil
) || EQ (printcharfun
, Qt
))
303 /* In predictable cases, strout is safe: output to buffer or frame. */
304 strout (XSTRING (string
)->data
, XSTRING (string
)->size
, printcharfun
);
307 /* Otherwise, fetch the string address for each character. */
309 int size
= XSTRING (string
)->size
;
312 for (i
= 0; i
< size
; i
++)
313 PRINTCHAR (XSTRING (string
)->data
[i
]);
318 DEFUN ("write-char", Fwrite_char
, Swrite_char
, 1, 2, 0,
319 "Output character CHAR to stream PRINTCHARFUN.\n\
320 PRINTCHARFUN defaults to the value of `standard-output' (which see).")
322 Lisp_Object ch
, printcharfun
;
324 struct buffer
*old
= current_buffer
;
327 Lisp_Object original
;
329 if (NILP (printcharfun
))
330 printcharfun
= Vstandard_output
;
331 CHECK_NUMBER (ch
, 0);
333 PRINTCHAR (XINT (ch
));
338 /* Used from outside of print.c to print a block of SIZE chars at DATA
339 on the default output stream.
340 Do not use this on the contents of a Lisp string. */
342 write_string (data
, size
)
346 struct buffer
*old
= current_buffer
;
347 Lisp_Object printcharfun
;
350 Lisp_Object original
;
352 printcharfun
= Vstandard_output
;
355 strout (data
, size
, printcharfun
);
359 /* Used from outside of print.c to print a block of SIZE chars at DATA
360 on a specified stream PRINTCHARFUN.
361 Do not use this on the contents of a Lisp string. */
363 write_string_1 (data
, size
, printcharfun
)
366 Lisp_Object printcharfun
;
368 struct buffer
*old
= current_buffer
;
371 Lisp_Object original
;
374 strout (data
, size
, printcharfun
);
382 temp_output_buffer_setup (bufname
)
385 register struct buffer
*old
= current_buffer
;
386 register Lisp_Object buf
;
388 Fset_buffer (Fget_buffer_create (build_string (bufname
)));
390 current_buffer
->read_only
= Qnil
;
393 XSETBUFFER (buf
, current_buffer
);
394 specbind (Qstandard_output
, buf
);
396 set_buffer_internal (old
);
400 internal_with_output_to_temp_buffer (bufname
, function
, args
)
402 Lisp_Object (*function
) ();
405 int count
= specpdl_ptr
- specpdl
;
406 Lisp_Object buf
, val
;
410 record_unwind_protect (Fset_buffer
, Fcurrent_buffer ());
411 temp_output_buffer_setup (bufname
);
412 buf
= Vstandard_output
;
415 val
= (*function
) (args
);
418 temp_output_buffer_show (buf
);
421 return unbind_to (count
, val
);
424 DEFUN ("with-output-to-temp-buffer", Fwith_output_to_temp_buffer
, Swith_output_to_temp_buffer
,
426 "Bind `standard-output' to buffer BUFNAME, eval BODY, then show that buffer.\n\
427 The buffer is cleared out initially, and marked as unmodified when done.\n\
428 All output done by BODY is inserted in that buffer by default.\n\
429 The buffer is displayed in another window, but not selected.\n\
430 The value of the last form in BODY is returned.\n\
431 If BODY does not finish normally, the buffer BUFNAME is not displayed.\n\n\
432 If variable `temp-buffer-show-function' is non-nil, call it at the end\n\
433 to get the buffer displayed. It gets one argument, the buffer to display.")
439 int count
= specpdl_ptr
- specpdl
;
440 Lisp_Object buf
, val
;
443 name
= Feval (Fcar (args
));
446 CHECK_STRING (name
, 0);
447 temp_output_buffer_setup (XSTRING (name
)->data
);
448 buf
= Vstandard_output
;
450 val
= Fprogn (Fcdr (args
));
452 temp_output_buffer_show (buf
);
454 return unbind_to (count
, val
);
456 #endif /* not standalone */
458 static void print ();
460 DEFUN ("terpri", Fterpri
, Sterpri
, 0, 1, 0,
461 "Output a newline to stream PRINTCHARFUN.\n\
462 If PRINTCHARFUN is omitted or nil, the value of `standard-output' is used.")
464 Lisp_Object printcharfun
;
466 struct buffer
*old
= current_buffer
;
469 Lisp_Object original
;
471 if (NILP (printcharfun
))
472 printcharfun
= Vstandard_output
;
479 DEFUN ("prin1", Fprin1
, Sprin1
, 1, 2, 0,
480 "Output the printed representation of OBJECT, any Lisp object.\n\
481 Quoting characters are printed when needed to make output that `read'\n\
482 can handle, whenever this is possible.\n\
483 Output stream is PRINTCHARFUN, or value of `standard-output' (which see).")
485 Lisp_Object obj
, printcharfun
;
487 struct buffer
*old
= current_buffer
;
490 Lisp_Object original
;
492 #ifdef MAX_PRINT_CHARS
494 #endif /* MAX_PRINT_CHARS */
495 if (NILP (printcharfun
))
496 printcharfun
= Vstandard_output
;
499 print (obj
, printcharfun
, 1);
504 /* a buffer which is used to hold output being built by prin1-to-string */
505 Lisp_Object Vprin1_to_string_buffer
;
507 DEFUN ("prin1-to-string", Fprin1_to_string
, Sprin1_to_string
, 1, 2, 0,
508 "Return a string containing the printed representation of OBJECT,\n\
509 any Lisp object. Quoting characters are used when needed to make output\n\
510 that `read' can handle, whenever this is possible, unless the optional\n\
511 second argument NOESCAPE is non-nil.")
513 Lisp_Object obj
, noescape
;
515 struct buffer
*old
= current_buffer
;
518 Lisp_Object original
, printcharfun
;
521 printcharfun
= Vprin1_to_string_buffer
;
524 print (obj
, printcharfun
, NILP (noescape
));
525 /* Make Vprin1_to_string_buffer be the default buffer after PRINTFINSH */
527 set_buffer_internal (XBUFFER (Vprin1_to_string_buffer
));
528 obj
= Fbuffer_string ();
532 set_buffer_internal (old
);
538 DEFUN ("princ", Fprinc
, Sprinc
, 1, 2, 0,
539 "Output the printed representation of OBJECT, any Lisp object.\n\
540 No quoting characters are used; no delimiters are printed around\n\
541 the contents of strings.\n\
542 Output stream is PRINTCHARFUN, or value of standard-output (which see).")
544 Lisp_Object obj
, printcharfun
;
546 struct buffer
*old
= current_buffer
;
549 Lisp_Object original
;
551 if (NILP (printcharfun
))
552 printcharfun
= Vstandard_output
;
555 print (obj
, printcharfun
, 0);
560 DEFUN ("print", Fprint
, Sprint
, 1, 2, 0,
561 "Output the printed representation of OBJECT, with newlines around it.\n\
562 Quoting characters are printed when needed to make output that `read'\n\
563 can handle, whenever this is possible.\n\
564 Output stream is PRINTCHARFUN, or value of `standard-output' (which see).")
566 Lisp_Object obj
, printcharfun
;
568 struct buffer
*old
= current_buffer
;
571 Lisp_Object original
;
574 #ifdef MAX_PRINT_CHARS
576 max_print
= MAX_PRINT_CHARS
;
577 #endif /* MAX_PRINT_CHARS */
578 if (NILP (printcharfun
))
579 printcharfun
= Vstandard_output
;
584 print (obj
, printcharfun
, 1);
587 #ifdef MAX_PRINT_CHARS
590 #endif /* MAX_PRINT_CHARS */
595 /* The subroutine object for external-debugging-output is kept here
596 for the convenience of the debugger. */
597 Lisp_Object Qexternal_debugging_output
;
599 DEFUN ("external-debugging-output", Fexternal_debugging_output
, Sexternal_debugging_output
, 1, 1, 0,
600 "Write CHARACTER to stderr.\n\
601 You can call print while debugging emacs, and pass it this function\n\
602 to make it write to the debugging output.\n")
604 Lisp_Object character
;
606 CHECK_NUMBER (character
, 0);
607 putc (XINT (character
), stderr
);
612 /* This is the interface for debugging printing. */
618 Fprin1 (arg
, Qexternal_debugging_output
);
621 #ifdef LISP_FLOAT_TYPE
624 * The buffer should be at least as large as the max string size of the
625 * largest float, printed in the biggest notation. This is undoubtably
626 * 20d float_output_format, with the negative of the C-constant "HUGE"
629 * On the vax the worst case is -1e38 in 20d format which takes 61 bytes.
631 * I assume that IEEE-754 format numbers can take 329 bytes for the worst
632 * case of -1e307 in 20d float_output_format. What is one to do (short of
633 * re-writing _doprnt to be more sane)?
638 float_to_string (buf
, data
)
645 if (NILP (Vfloat_output_format
)
646 || !STRINGP (Vfloat_output_format
))
649 sprintf (buf
, "%.17g", data
);
654 /* Check that the spec we have is fully valid.
655 This means not only valid for printf,
656 but meant for floats, and reasonable. */
657 cp
= XSTRING (Vfloat_output_format
)->data
;
666 /* Check the width specification. */
668 if ('0' <= *cp
&& *cp
<= '9')
669 for (width
= 0; (*cp
>= '0' && *cp
<= '9'); cp
++)
670 width
= (width
* 10) + (*cp
- '0');
672 if (*cp
!= 'e' && *cp
!= 'f' && *cp
!= 'g')
675 /* A precision of zero is valid for %f; everything else requires
676 at least one. Width may be omitted anywhere. */
678 && (width
< (*cp
!= 'f')
685 sprintf (buf
, XSTRING (Vfloat_output_format
)->data
, data
);
688 /* Make sure there is a decimal point with digit after, or an
689 exponent, so that the value is readable as a float. But don't do
690 this with "%.0f"; it's valid for that not to produce a decimal
691 point. Note that width can be 0 only for %.0f. */
694 for (cp
= buf
; *cp
; cp
++)
695 if ((*cp
< '0' || *cp
> '9') && *cp
!= '-')
698 if (*cp
== '.' && cp
[1] == 0)
712 #endif /* LISP_FLOAT_TYPE */
715 print (obj
, printcharfun
, escapeflag
)
717 register Lisp_Object printcharfun
;
724 #if 1 /* I'm not sure this is really worth doing. */
725 /* Detect circularities and truncate them.
726 No need to offer any alternative--this is better than an error. */
727 if (CONSP (obj
) || VECTORP (obj
) || COMPILEDP (obj
))
730 for (i
= 0; i
< print_depth
; i
++)
731 if (EQ (obj
, being_printed
[i
]))
733 sprintf (buf
, "#%d", i
);
734 strout (buf
, -1, printcharfun
);
740 being_printed
[print_depth
] = obj
;
743 if (print_depth
> PRINT_CIRCLE
)
744 error ("Apparently circular structure being printed");
745 #ifdef MAX_PRINT_CHARS
746 if (max_print
&& print_chars
> max_print
)
751 #endif /* MAX_PRINT_CHARS */
753 switch (XGCTYPE (obj
))
756 sprintf (buf
, "%d", XINT (obj
));
757 strout (buf
, -1, printcharfun
);
760 #ifdef LISP_FLOAT_TYPE
763 char pigbuf
[350]; /* see comments in float_to_string */
765 float_to_string (pigbuf
, XFLOAT(obj
)->data
);
766 strout (pigbuf
, -1, printcharfun
);
773 print_string (obj
, printcharfun
);
777 register unsigned char c
;
782 #ifdef USE_TEXT_PROPERTIES
783 if (!NULL_INTERVAL_P (XSTRING (obj
)->intervals
))
791 for (i
= 0; i
< XSTRING (obj
)->size
; i
++)
794 c
= XSTRING (obj
)->data
[i
];
795 if (c
== '\n' && print_escape_newlines
)
800 else if (c
== '\f' && print_escape_newlines
)
807 if (c
== '\"' || c
== '\\')
814 #ifdef USE_TEXT_PROPERTIES
815 if (!NULL_INTERVAL_P (XSTRING (obj
)->intervals
))
817 traverse_intervals (XSTRING (obj
)->intervals
,
818 0, 0, print_interval
, printcharfun
);
829 register int confusing
;
830 register unsigned char *p
= XSYMBOL (obj
)->name
->data
;
831 register unsigned char *end
= p
+ XSYMBOL (obj
)->name
->size
;
832 register unsigned char c
;
834 if (p
!= end
&& (*p
== '-' || *p
== '+')) p
++;
839 while (p
!= end
&& *p
>= '0' && *p
<= '9')
841 confusing
= (end
== p
);
844 p
= XSYMBOL (obj
)->name
->data
;
851 if (c
== '\"' || c
== '\\' || c
== '\'' || c
== ';' || c
== '#' ||
852 c
== '(' || c
== ')' || c
== ',' || c
=='.' || c
== '`' ||
853 c
== '[' || c
== ']' || c
== '?' || c
<= 040 || confusing
)
854 PRINTCHAR ('\\'), confusing
= 0;
862 /* If deeper than spec'd depth, print placeholder. */
863 if (INTEGERP (Vprint_level
)
864 && print_depth
> XINT (Vprint_level
))
865 strout ("...", -1, printcharfun
);
871 register int max
= 0;
873 if (INTEGERP (Vprint_length
))
874 max
= XINT (Vprint_length
);
875 /* Could recognize circularities in cdrs here,
876 but that would make printing of long lists quadratic.
877 It's not worth doing. */
884 strout ("...", 3, printcharfun
);
887 print (Fcar (obj
), printcharfun
, escapeflag
);
891 if (!NILP (obj
) && !CONSP (obj
))
893 strout (" . ", 3, printcharfun
);
894 print (obj
, printcharfun
, escapeflag
);
900 case Lisp_Vectorlike
:
905 strout ("#<process ", -1, printcharfun
);
906 print_string (XPROCESS (obj
)->name
, printcharfun
);
910 print_string (XPROCESS (obj
)->name
, printcharfun
);
912 else if (SUBRP (obj
))
914 strout ("#<subr ", -1, printcharfun
);
915 strout (XSUBR (obj
)->symbol_name
, -1, printcharfun
);
919 else if (WINDOWP (obj
))
921 strout ("#<window ", -1, printcharfun
);
922 sprintf (buf
, "%d", XFASTINT (XWINDOW (obj
)->sequence_number
));
923 strout (buf
, -1, printcharfun
);
924 if (!NILP (XWINDOW (obj
)->buffer
))
926 strout (" on ", -1, printcharfun
);
927 print_string (XBUFFER (XWINDOW (obj
)->buffer
)->name
, printcharfun
);
931 else if (BUFFERP (obj
))
933 if (NILP (XBUFFER (obj
)->name
))
934 strout ("#<killed buffer>", -1, printcharfun
);
937 strout ("#<buffer ", -1, printcharfun
);
938 print_string (XBUFFER (obj
)->name
, printcharfun
);
942 print_string (XBUFFER (obj
)->name
, printcharfun
);
944 else if (WINDOW_CONFIGURATIONP (obj
))
946 strout ("#<window-configuration>", -1, printcharfun
);
949 else if (FRAMEP (obj
))
951 strout ((FRAME_LIVE_P (XFRAME (obj
))
952 ? "#<frame " : "#<dead frame "),
954 print_string (XFRAME (obj
)->name
, printcharfun
);
955 sprintf (buf
, " 0x%lx", (unsigned long) (XFRAME (obj
)));
956 strout (buf
, -1, printcharfun
);
960 #endif /* not standalone */
963 int size
= XVECTOR (obj
)->size
;
967 size
&= PSEUDOVECTOR_SIZE_MASK
;
969 if (size
& PSEUDOVECTOR_FLAG
)
975 register Lisp_Object tem
;
976 for (i
= 0; i
< size
; i
++)
978 if (i
) PRINTCHAR (' ');
979 tem
= XVECTOR (obj
)->contents
[i
];
980 print (tem
, printcharfun
, escapeflag
);
989 switch (XMISC (obj
)->type
)
991 case Lisp_Misc_Marker
:
992 strout ("#<marker ", -1, printcharfun
);
993 if (!(XMARKER (obj
)->buffer
))
994 strout ("in no buffer", -1, printcharfun
);
997 sprintf (buf
, "at %d", marker_position (obj
));
998 strout (buf
, -1, printcharfun
);
999 strout (" in ", -1, printcharfun
);
1000 print_string (XMARKER (obj
)->buffer
->name
, printcharfun
);
1005 case Lisp_Misc_Overlay
:
1006 strout ("#<overlay ", -1, printcharfun
);
1007 if (!(XMARKER (OVERLAY_START (obj
))->buffer
))
1008 strout ("in no buffer", -1, printcharfun
);
1011 sprintf (buf
, "from %d to %d in ",
1012 marker_position (OVERLAY_START (obj
)),
1013 marker_position (OVERLAY_END (obj
)));
1014 strout (buf
, -1, printcharfun
);
1015 print_string (XMARKER (OVERLAY_START (obj
))->buffer
->name
,
1021 /* Remaining cases shouldn't happen in normal usage, but let's print
1022 them anyway for the benefit of the debugger. */
1023 case Lisp_Misc_Free
:
1024 strout ("#<misc free cell>", -1, printcharfun
);
1027 case Lisp_Misc_Intfwd
:
1028 sprintf (buf
, "#<intfwd to %d>", *XINTFWD (obj
)->intvar
);
1029 strout (buf
, -1, printcharfun
);
1032 case Lisp_Misc_Boolfwd
:
1033 sprintf (buf
, "#<boolfwd to %s>",
1034 (*XBOOLFWD (obj
)->boolvar
? "t" : "nil"));
1035 strout (buf
, -1, printcharfun
);
1038 case Lisp_Misc_Objfwd
:
1039 strout (buf
, "#<objfwd to ", -1, printcharfun
);
1040 print (*XOBJFWD (obj
)->objvar
, printcharfun
, escapeflag
);
1044 case Lisp_Misc_Buffer_Objfwd
:
1045 strout (buf
, "#<buffer_objfwd to ", -1, printcharfun
);
1046 print (*(Lisp_Object
*)((char *)current_buffer
1047 + XBUFFER_OBJFWD (obj
)->offset
),
1048 printcharfun
, escapeflag
);
1052 case Lisp_Misc_Display_Objfwd
:
1053 strout (buf
, "#<display_objfwd to ", -1, printcharfun
);
1054 print (*(Lisp_Object
*)((char *) get_perdisplay (selected_frame
)
1055 + XDISPLAY_OBJFWD (obj
)->offset
),
1056 printcharfun
, escapeflag
);
1060 case Lisp_Misc_Buffer_Local_Value
:
1061 strout ("#<buffer_local_value ", -1, printcharfun
);
1062 goto do_buffer_local
;
1063 case Lisp_Misc_Some_Buffer_Local_Value
:
1064 strout ("#<some_buffer_local_value ", -1, printcharfun
);
1066 strout ("[realvalue] ", -1, printcharfun
);
1067 print (XBUFFER_LOCAL_VALUE (obj
)->car
, printcharfun
, escapeflag
);
1068 strout ("[buffer] ", -1, printcharfun
);
1069 print (XCONS (XBUFFER_LOCAL_VALUE (obj
)->cdr
)->car
,
1070 printcharfun
, escapeflag
);
1071 strout ("[alist-elt] ", -1, printcharfun
);
1072 print (XCONS (XCONS (XBUFFER_LOCAL_VALUE (obj
)->cdr
)->cdr
)->car
,
1073 printcharfun
, escapeflag
);
1074 strout ("[default-value] ", -1, printcharfun
);
1075 print (XCONS (XCONS (XBUFFER_LOCAL_VALUE (obj
)->cdr
)->cdr
)->cdr
,
1076 printcharfun
, escapeflag
);
1084 #endif /* standalone */
1089 /* We're in trouble if this happens!
1090 Probably should just abort () */
1091 strout ("#<EMACS BUG: INVALID DATATYPE ", -1, printcharfun
);
1093 sprintf (buf
, "(MISC 0x%04x)", (int) XMISC (obj
)->type
);
1094 else if (VECTORLIKEP (obj
))
1095 sprintf (buf
, "(PVEC 0x%08x)", (int) XVECTOR (obj
)->size
);
1097 sprintf (buf
, "(0x%02x)", (int) XTYPE (obj
));
1098 strout (buf
, -1, printcharfun
);
1099 strout (" Save your buffers immediately and please report this bug>",
1107 #ifdef USE_TEXT_PROPERTIES
1109 /* Print a description of INTERVAL using PRINTCHARFUN.
1110 This is part of printing a string that has text properties. */
1113 print_interval (interval
, printcharfun
)
1115 Lisp_Object printcharfun
;
1118 print (make_number (interval
->position
), printcharfun
, 1);
1120 print (make_number (interval
->position
+ LENGTH (interval
)),
1123 print (interval
->plist
, printcharfun
, 1);
1126 #endif /* USE_TEXT_PROPERTIES */
1131 staticpro (&Qprint_escape_newlines
);
1132 Qprint_escape_newlines
= intern ("print-escape-newlines");
1134 DEFVAR_LISP ("standard-output", &Vstandard_output
,
1135 "Output stream `print' uses by default for outputting a character.\n\
1136 This may be any function of one argument.\n\
1137 It may also be a buffer (output is inserted before point)\n\
1138 or a marker (output is inserted and the marker is advanced)\n\
1139 or the symbol t (output appears in the minibuffer line).");
1140 Vstandard_output
= Qt
;
1141 Qstandard_output
= intern ("standard-output");
1142 staticpro (&Qstandard_output
);
1144 #ifdef LISP_FLOAT_TYPE
1145 DEFVAR_LISP ("float-output-format", &Vfloat_output_format
,
1146 "The format descriptor string used to print floats.\n\
1147 This is a %-spec like those accepted by `printf' in C,\n\
1148 but with some restrictions. It must start with the two characters `%.'.\n\
1149 After that comes an integer precision specification,\n\
1150 and then a letter which controls the format.\n\
1151 The letters allowed are `e', `f' and `g'.\n\
1152 Use `e' for exponential notation \"DIG.DIGITSeEXPT\"\n\
1153 Use `f' for decimal point notation \"DIGITS.DIGITS\".\n\
1154 Use `g' to choose the shorter of those two formats for the number at hand.\n\
1155 The precision in any of these cases is the number of digits following\n\
1156 the decimal point. With `f', a precision of 0 means to omit the\n\
1157 decimal point. 0 is not allowed with `e' or `g'.\n\n\
1158 A value of nil means to use `%.17g'.");
1159 Vfloat_output_format
= Qnil
;
1160 Qfloat_output_format
= intern ("float-output-format");
1161 staticpro (&Qfloat_output_format
);
1162 #endif /* LISP_FLOAT_TYPE */
1164 DEFVAR_LISP ("print-length", &Vprint_length
,
1165 "Maximum length of list to print before abbreviating.\n\
1166 A value of nil means no limit.");
1167 Vprint_length
= Qnil
;
1169 DEFVAR_LISP ("print-level", &Vprint_level
,
1170 "Maximum depth of list nesting to print before abbreviating.\n\
1171 A value of nil means no limit.");
1172 Vprint_level
= Qnil
;
1174 DEFVAR_BOOL ("print-escape-newlines", &print_escape_newlines
,
1175 "Non-nil means print newlines in strings as backslash-n.\n\
1176 Also print formfeeds as backslash-f.");
1177 print_escape_newlines
= 0;
1179 /* prin1_to_string_buffer initialized in init_buffer_once in buffer.c */
1180 staticpro (&Vprin1_to_string_buffer
);
1183 defsubr (&Sprin1_to_string
);
1187 defsubr (&Swrite_char
);
1188 defsubr (&Sexternal_debugging_output
);
1190 Qexternal_debugging_output
= intern ("external-debugging-output");
1191 staticpro (&Qexternal_debugging_output
);
1194 defsubr (&Swith_output_to_temp_buffer
);
1195 #endif /* not standalone */