*** empty log message ***
[bpt/emacs.git] / src / print.c
CommitLineData
38010d50
JB
1/* Lisp object printing and output streams.
2 Copyright (C) 1985, 1986, 1988 Free Software Foundation, Inc.
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 1, or (at your option)
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21#include "config.h"
22#include <stdio.h>
23#undef NULL
24#include "lisp.h"
25
26#ifndef standalone
27#include "buffer.h"
28#include "screen.h"
29#include "window.h"
30#include "process.h"
31#include "dispextern.h"
32#include "termchar.h"
33#endif /* not standalone */
34
35Lisp_Object Vstandard_output, Qstandard_output;
36
37#ifdef LISP_FLOAT_TYPE
38Lisp_Object Vfloat_output_format, Qfloat_output_format;
39#endif /* LISP_FLOAT_TYPE */
40
41/* Avoid actual stack overflow in print. */
42int print_depth;
43
44/* Maximum length of list to print in full; noninteger means
45 effectively infinity */
46
47Lisp_Object Vprint_length;
48
49/* Maximum depth of list to print in full; noninteger means
50 effectively infinity. */
51
52Lisp_Object Vprint_level;
53
54/* Nonzero means print newlines in strings as \n. */
55
56int print_escape_newlines;
57
58Lisp_Object Qprint_escape_newlines;
59
60/* Nonzero means print newline before next minibuffer message.
61 Defined in xdisp.c */
62
63extern int noninteractive_need_newline;
64#ifdef MAX_PRINT_CHARS
65static int print_chars;
66static int max_print;
67#endif /* MAX_PRINT_CHARS */
68\f
69#if 0
70/* Convert between chars and GLYPHs */
71
72int
73glyphlen (glyphs)
74 register GLYPH *glyphs;
75{
76 register int i = 0;
77
78 while (glyphs[i])
79 i++;
80 return i;
81}
82
83void
84str_to_glyph_cpy (str, glyphs)
85 char *str;
86 GLYPH *glyphs;
87{
88 register GLYPH *gp = glyphs;
89 register char *cp = str;
90
91 while (*cp)
92 *gp++ = *cp++;
93}
94
95void
96str_to_glyph_ncpy (str, glyphs, n)
97 char *str;
98 GLYPH *glyphs;
99 register int n;
100{
101 register GLYPH *gp = glyphs;
102 register char *cp = str;
103
104 while (n-- > 0)
105 *gp++ = *cp++;
106}
107
108void
109glyph_to_str_cpy (glyphs, str)
110 GLYPH *glyphs;
111 char *str;
112{
113 register GLYPH *gp = glyphs;
114 register char *cp = str;
115
116 while (*gp)
117 *str++ = *gp++ & 0377;
118}
119#endif
120\f
121/* Low level output routines for charaters and strings */
122
123/* Lisp functions to do output using a stream
124 must have the stream in a variable called printcharfun
125 and must start with PRINTPREPARE and end with PRINTFINISH.
126 Use PRINTCHAR to output one character,
127 or call strout to output a block of characters.
128 Also, each one must have the declarations
129 struct buffer *old = current_buffer;
130 int old_point = -1, start_point;
131 Lisp_Object original;
132*/
133
134#define PRINTPREPARE \
135 original = printcharfun; \
136 if (NULL (printcharfun)) printcharfun = Qt; \
137 if (XTYPE (printcharfun) == Lisp_Buffer) \
138 { if (XBUFFER (printcharfun) != current_buffer) Fset_buffer (printcharfun); \
139 printcharfun = Qnil;}\
140 if (XTYPE (printcharfun) == Lisp_Marker) \
141 { if (XMARKER (original)->buffer != current_buffer) \
142 set_buffer_internal (XMARKER (original)->buffer); \
143 old_point = point; \
144 SET_PT (marker_position (printcharfun)); \
145 start_point = point; \
146 printcharfun = Qnil;}
147
148#define PRINTFINISH \
149 if (XTYPE (original) == Lisp_Marker) \
150 Fset_marker (original, make_number (point), Qnil); \
151 if (old_point >= 0) \
152 SET_PT ((old_point >= start_point ? point - start_point : 0) + old_point); \
153 if (old != current_buffer) \
154 set_buffer_internal (old)
155
156#define PRINTCHAR(ch) printchar (ch, printcharfun)
157
158/* Index of first unused element of message_buf */
159static int printbufidx;
160
161static void
162printchar (ch, fun)
163 unsigned char ch;
164 Lisp_Object fun;
165{
166 Lisp_Object ch1;
167
168#ifdef MAX_PRINT_CHARS
169 if (max_print)
170 print_chars++;
171#endif /* MAX_PRINT_CHARS */
172#ifndef standalone
173 if (EQ (fun, Qnil))
174 {
175 QUIT;
176 insert (&ch, 1);
177 return;
178 }
179
180 if (EQ (fun, Qt))
181 {
182 if (noninteractive)
183 {
184 putchar (ch);
185 noninteractive_need_newline = 1;
186 return;
187 }
188
189 if (echo_area_glyphs != SCREEN_MESSAGE_BUF (selected_screen)
190 || !message_buf_print)
191 {
192 echo_area_glyphs = SCREEN_MESSAGE_BUF (selected_screen);
193 printbufidx = 0;
194 message_buf_print = 1;
195 }
196
197 if (printbufidx < SCREEN_WIDTH (selected_screen) - 1)
198 SCREEN_MESSAGE_BUF (selected_screen)[printbufidx++] = ch;
199 SCREEN_MESSAGE_BUF (selected_screen)[printbufidx] = 0;
200
201 return;
202 }
203#endif /* not standalone */
204
205 XFASTINT (ch1) = ch;
206 call1 (fun, ch1);
207}
208
209static void
210strout (ptr, size, printcharfun)
211 char *ptr;
212 int size;
213 Lisp_Object printcharfun;
214{
215 int i = 0;
216
217 if (EQ (printcharfun, Qnil))
218 {
219 insert (ptr, size >= 0 ? size : strlen (ptr));
220#ifdef MAX_PRINT_CHARS
221 if (max_print)
222 print_chars += size >= 0 ? size : strlen(ptr);
223#endif /* MAX_PRINT_CHARS */
224 return;
225 }
226 if (EQ (printcharfun, Qt))
227 {
228 i = size >= 0 ? size : strlen (ptr);
229#ifdef MAX_PRINT_CHARS
230 if (max_print)
231 print_chars += i;
232#endif /* MAX_PRINT_CHARS */
233
234 if (noninteractive)
235 {
236 fwrite (ptr, 1, i, stdout);
237 noninteractive_need_newline = 1;
238 return;
239 }
240
241 if (echo_area_glyphs != SCREEN_MESSAGE_BUF (selected_screen)
242 || !message_buf_print)
243 {
244 echo_area_glyphs = SCREEN_MESSAGE_BUF (selected_screen);
245 printbufidx = 0;
246 message_buf_print = 1;
247 }
248
249 if (i > SCREEN_WIDTH (selected_screen) - printbufidx - 1)
250 i = SCREEN_WIDTH (selected_screen) - printbufidx - 1;
251 bcopy (ptr, &SCREEN_MESSAGE_BUF (selected_screen) [printbufidx], i);
252 printbufidx += i;
253 SCREEN_MESSAGE_BUF (selected_screen) [printbufidx] = 0;
254
255 return;
256 }
257
258 if (size >= 0)
259 while (i < size)
260 PRINTCHAR (ptr[i++]);
261 else
262 while (ptr[i])
263 PRINTCHAR (ptr[i++]);
264}
265
266/* Print the contents of a string STRING using PRINTCHARFUN.
267 It isn't safe to use strout, because printing one char can relocate. */
268
269print_string (string, printcharfun)
270 Lisp_Object string;
271 Lisp_Object printcharfun;
272{
273 if (EQ (printcharfun, Qnil) || EQ (printcharfun, Qt))
274 /* In predictable cases, strout is safe: output to buffer or screen. */
275 strout (XSTRING (string)->data, XSTRING (string)->size, printcharfun);
276 else
277 {
278 /* Otherwise, fetch the string address for each character. */
279 int i;
280 int size = XSTRING (string)->size;
281 struct gcpro gcpro1;
282 GCPRO1 (string);
283 for (i = 0; i < size; i++)
284 PRINTCHAR (XSTRING (string)->data[i]);
285 UNGCPRO;
286 }
287}
288\f
289DEFUN ("write-char", Fwrite_char, Swrite_char, 1, 2, 0,
290 "Output character CHAR to stream STREAM.\n\
291STREAM defaults to the value of `standard-output' (which see).")
292 (ch, printcharfun)
293 Lisp_Object ch, printcharfun;
294{
295 struct buffer *old = current_buffer;
296 int old_point = -1;
297 int start_point;
298 Lisp_Object original;
299
300 if (NULL (printcharfun))
301 printcharfun = Vstandard_output;
302 CHECK_NUMBER (ch, 0);
303 PRINTPREPARE;
304 PRINTCHAR (XINT (ch));
305 PRINTFINISH;
306 return ch;
307}
308
309/* Used from outside of print.c to print a block of SIZE chars at DATA
310 on the default output stream.
311 Do not use this on the contents of a Lisp string. */
312
313write_string (data, size)
314 char *data;
315 int size;
316{
317 struct buffer *old = current_buffer;
318 Lisp_Object printcharfun;
319 int old_point = -1;
320 int start_point;
321 Lisp_Object original;
322
323 printcharfun = Vstandard_output;
324
325 PRINTPREPARE;
326 strout (data, size, printcharfun);
327 PRINTFINISH;
328}
329
330/* Used from outside of print.c to print a block of SIZE chars at DATA
331 on a specified stream PRINTCHARFUN.
332 Do not use this on the contents of a Lisp string. */
333
334write_string_1 (data, size, printcharfun)
335 char *data;
336 int size;
337 Lisp_Object printcharfun;
338{
339 struct buffer *old = current_buffer;
340 int old_point = -1;
341 int start_point;
342 Lisp_Object original;
343
344 PRINTPREPARE;
345 strout (data, size, printcharfun);
346 PRINTFINISH;
347}
348
349
350#ifndef standalone
351
352void
353temp_output_buffer_setup (bufname)
354 char *bufname;
355{
356 register struct buffer *old = current_buffer;
357 register Lisp_Object buf;
358
359 Fset_buffer (Fget_buffer_create (build_string (bufname)));
360
361 current_buffer->read_only = Qnil;
362 Ferase_buffer ();
363
364 XSET (buf, Lisp_Buffer, current_buffer);
365 specbind (Qstandard_output, buf);
366
367 set_buffer_internal (old);
368}
369
370Lisp_Object
371internal_with_output_to_temp_buffer (bufname, function, args)
372 char *bufname;
373 Lisp_Object (*function) ();
374 Lisp_Object args;
375{
376 int count = specpdl_ptr - specpdl;
377 Lisp_Object buf, val;
378
379 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
380 temp_output_buffer_setup (bufname);
381 buf = Vstandard_output;
382
383 val = (*function) (args);
384
385 temp_output_buffer_show (buf);
386
387 return unbind_to (count, val);
388}
389
390DEFUN ("with-output-to-temp-buffer", Fwith_output_to_temp_buffer, Swith_output_to_temp_buffer,
391 1, UNEVALLED, 0,
392 "Bind `standard-output' to buffer BUFNAME, eval BODY, then show that buffer.\n\
393The buffer is cleared out initially, and marked as unmodified when done.\n\
394All output done by BODY is inserted in that buffer by default.\n\
395The buffer is displayed in another window, but not selected.\n\
396The value of the last form in BODY is returned.\n\
397If BODY does not finish normally, the buffer BUFNAME is not displayed.\n\n\
398If variable `temp-buffer-show-hook' is non-nil, call it at the end\n\
399to get the buffer displayed. It gets one argument, the buffer to display.")
400 (args)
401 Lisp_Object args;
402{
403 struct gcpro gcpro1;
404 Lisp_Object name;
405 int count = specpdl_ptr - specpdl;
406 Lisp_Object buf, val;
407
408 GCPRO1(args);
409 name = Feval (Fcar (args));
410 UNGCPRO;
411
412 CHECK_STRING (name, 0);
413 temp_output_buffer_setup (XSTRING (name)->data);
414 buf = Vstandard_output;
415
416 val = Fprogn (Fcdr (args));
417
418 temp_output_buffer_show (buf);
419
420 return unbind_to (count, val);
421}
422#endif /* not standalone */
423\f
424static void print ();
425
426DEFUN ("terpri", Fterpri, Sterpri, 0, 1, 0,
427 "Output a newline to STREAM.\n\
428If STREAM is omitted or nil, the value of `standard-output' is used.")
429 (printcharfun)
430 Lisp_Object printcharfun;
431{
432 struct buffer *old = current_buffer;
433 int old_point = -1;
434 int start_point;
435 Lisp_Object original;
436
437 if (NULL (printcharfun))
438 printcharfun = Vstandard_output;
439 PRINTPREPARE;
440 PRINTCHAR ('\n');
441 PRINTFINISH;
442 return Qt;
443}
444
445DEFUN ("prin1", Fprin1, Sprin1, 1, 2, 0,
446 "Output the printed representation of OBJECT, any Lisp object.\n\
447Quoting characters are printed when needed to make output that `read'\n\
448can handle, whenever this is possible.\n\
449Output stream is STREAM, or value of `standard-output' (which see).")
450 (obj, printcharfun)
451 Lisp_Object obj, printcharfun;
452{
453 struct buffer *old = current_buffer;
454 int old_point = -1;
455 int start_point;
456 Lisp_Object original;
457
458#ifdef MAX_PRINT_CHARS
459 max_print = 0;
460#endif /* MAX_PRINT_CHARS */
461 if (NULL (printcharfun))
462 printcharfun = Vstandard_output;
463 PRINTPREPARE;
464 print_depth = 0;
465 print (obj, printcharfun, 1);
466 PRINTFINISH;
467 return obj;
468}
469
470/* a buffer which is used to hold output being built by prin1-to-string */
471Lisp_Object Vprin1_to_string_buffer;
472
473DEFUN ("prin1-to-string", Fprin1_to_string, Sprin1_to_string, 1, 2, 0,
474 "Return a string containing the printed representation of OBJECT,\n\
475any Lisp object. Quoting characters are used when needed to make output\n\
476that `read' can handle, whenever this is possible, unless the optional\n\
477second argument NOESCAPE is non-nil.")
478 (obj, noescape)
479 Lisp_Object obj, noescape;
480{
481 struct buffer *old = current_buffer;
482 int old_point = -1;
483 int start_point;
484 Lisp_Object original, printcharfun;
485 struct gcpro gcpro1;
486
487 printcharfun = Vprin1_to_string_buffer;
488 PRINTPREPARE;
489 print_depth = 0;
490 print (obj, printcharfun, NULL (noescape));
491 /* Make Vprin1_to_string_buffer be the default buffer after PRINTFINSH */
492 PRINTFINISH;
493 set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
494 obj = Fbuffer_string ();
495
496 GCPRO1 (obj);
497 Ferase_buffer ();
498 set_buffer_internal (old);
499 UNGCPRO;
500
501 return obj;
502}
503
504DEFUN ("princ", Fprinc, Sprinc, 1, 2, 0,
505 "Output the printed representation of OBJECT, any Lisp object.\n\
506No quoting characters are used; no delimiters are printed around\n\
507the contents of strings.\n\
508Output stream is STREAM, or value of standard-output (which see).")
509 (obj, printcharfun)
510 Lisp_Object obj, printcharfun;
511{
512 struct buffer *old = current_buffer;
513 int old_point = -1;
514 int start_point;
515 Lisp_Object original;
516
517 if (NULL (printcharfun))
518 printcharfun = Vstandard_output;
519 PRINTPREPARE;
520 print_depth = 0;
521 print (obj, printcharfun, 0);
522 PRINTFINISH;
523 return obj;
524}
525
526DEFUN ("print", Fprint, Sprint, 1, 2, 0,
527 "Output the printed representation of OBJECT, with newlines around it.\n\
528Quoting characters are printed when needed to make output that `read'\n\
529can handle, whenever this is possible.\n\
530Output stream is STREAM, or value of `standard-output' (which see).")
531 (obj, printcharfun)
532 Lisp_Object obj, printcharfun;
533{
534 struct buffer *old = current_buffer;
535 int old_point = -1;
536 int start_point;
537 Lisp_Object original;
538 struct gcpro gcpro1;
539
540#ifdef MAX_PRINT_CHARS
541 print_chars = 0;
542 max_print = MAX_PRINT_CHARS;
543#endif /* MAX_PRINT_CHARS */
544 if (NULL (printcharfun))
545 printcharfun = Vstandard_output;
546 GCPRO1 (obj);
547 PRINTPREPARE;
548 print_depth = 0;
549 PRINTCHAR ('\n');
550 print (obj, printcharfun, 1);
551 PRINTCHAR ('\n');
552 PRINTFINISH;
553#ifdef MAX_PRINT_CHARS
554 max_print = 0;
555 print_chars = 0;
556#endif /* MAX_PRINT_CHARS */
557 UNGCPRO;
558 return obj;
559}
560
561/* The subroutine object for external-debugging-output is kept here
562 for the convenience of the debugger. */
563Lisp_Object Qexternal_debugging_output;
564
565DEFUN ("external-debugging-output",
566 Fexternal_debugging_output, Sexternal_debugging_output,
567 1, 1, 0, "Write CHARACTER to stderr.\n\
568You can call print while debugging emacs, and pass it this function\n\
569to make it write to the debugging output.\n")
570 (Lisp_Object character)
571{
572 CHECK_NUMBER (character, 0);
573 putc (XINT (character), stderr);
574
575 return character;
576}
577\f
578#ifdef LISP_FLOAT_TYPE
579
580void
581float_to_string (buf, data)
582 char *buf;
583/*
584 * This buffer should be at least as large as the max string size of the
585 * largest float, printed in the biggest notation. This is undoubtably
586 * 20d float_output_format, with the negative of the C-constant "HUGE"
587 * from <math.h>.
588 *
589 * On the vax the worst case is -1e38 in 20d format which takes 61 bytes.
590 *
591 * I assume that IEEE-754 format numbers can take 329 bytes for the worst
592 * case of -1e307 in 20d float_output_format. What is one to do (short of
593 * re-writing _doprnt to be more sane)?
594 * -wsr
595 */
596 double data;
597{
598 register unsigned char *cp, c;
599 register int width;
600
601 if (NULL (Vfloat_output_format)
602 || XTYPE (Vfloat_output_format) != Lisp_String)
603 lose:
604 sprintf (buf, "%.20g", data);
605 else /* oink oink */
606 {
607 /* Check that the spec we have is fully valid.
608 This means not only valid for printf,
609 but meant for floats, and reasonable. */
610 cp = XSTRING (Vfloat_output_format)->data;
611
612 if (cp[0] != '%')
613 goto lose;
614 if (cp[1] != '.')
615 goto lose;
616
617 cp += 2;
618 for (width = 0;
619 ((c = *cp) >= '0' && c <= '9');
620 cp++)
621 {
622 width *= 10;
623 width += c - '0';
624 }
625
626 if (*cp != 'e' && *cp != 'f' && *cp != 'g')
627 goto lose;
628
629 if (width < (*cp != 'e') || width > DBL_DIG)
630 goto lose;
631
632 if (cp[1] != 0)
633 goto lose;
634
635 sprintf (buf, XSTRING (Vfloat_output_format)->data, data);
636 }
637}
638#endif /* LISP_FLOAT_TYPE */
639\f
640static void
641print (obj, printcharfun, escapeflag)
642#ifndef RTPC_REGISTER_BUG
643 register Lisp_Object obj;
644#else
645 Lisp_Object obj;
646#endif
647 register Lisp_Object printcharfun;
648 int escapeflag;
649{
650 char buf[30];
651
652 QUIT;
653
654 print_depth++;
655
656 if (print_depth > 200)
657 error ("Apparently circular structure being printed");
658#ifdef MAX_PRINT_CHARS
659 if (max_print && print_chars > max_print)
660 {
661 PRINTCHAR ('\n');
662 print_chars = 0;
663 }
664#endif /* MAX_PRINT_CHARS */
665
666#ifdef SWITCH_ENUM_BUG
667 switch ((int) XTYPE (obj))
668#else
669 switch (XTYPE (obj))
670#endif
671 {
672 default:
673 /* We're in trouble if this happens!
674 Probably should just abort () */
675 strout ("#<EMACS BUG: INVALID DATATYPE ", -1, printcharfun);
676 sprintf (buf, "(#o%3o)", (int) XTYPE (obj));
677 strout (buf, -1, printcharfun);
678 strout (" Save your buffers immediately and please report this bug>",
679 -1, printcharfun);
680 break;
681
682#ifdef LISP_FLOAT_TYPE
683 case Lisp_Float:
684 {
685 char pigbuf[350]; /* see comments in float_to_string */
686
687 float_to_string (pigbuf, XFLOAT(obj)->data);
688 strout (pigbuf, -1, printcharfun);
689 }
690 break;
691#endif /* LISP_FLOAT_TYPE */
692
693 case Lisp_Int:
694 sprintf (buf, "%d", XINT (obj));
695 strout (buf, -1, printcharfun);
696 break;
697
698 case Lisp_String:
699 if (!escapeflag)
700 print_string (obj, printcharfun);
701 else
702 {
703 register int i;
704 register unsigned char c;
705 Lisp_Object obj1;
706 struct gcpro gcpro1;
707
708 /* You can't gcpro register variables, so copy obj to a
709 non-register variable so we can gcpro it without
710 making it non-register. */
711 obj1 = obj;
712 GCPRO1 (obj1);
713
714 PRINTCHAR ('\"');
715 for (i = 0; i < XSTRING (obj)->size; i++)
716 {
717 QUIT;
718 c = XSTRING (obj)->data[i];
719 if (c == '\n' && print_escape_newlines)
720 {
721 PRINTCHAR ('\\');
722 PRINTCHAR ('n');
723 }
724 else
725 {
726 if (c == '\"' || c == '\\')
727 PRINTCHAR ('\\');
728 PRINTCHAR (c);
729 }
730 }
731 PRINTCHAR ('\"');
732 UNGCPRO;
733 }
734 break;
735
736 case Lisp_Symbol:
737 {
738 register int confusing;
739 register unsigned char *p = XSYMBOL (obj)->name->data;
740 register unsigned char *end = p + XSYMBOL (obj)->name->size;
741 register unsigned char c;
742
743 if (p != end && (*p == '-' || *p == '+')) p++;
744 if (p == end)
745 confusing = 0;
746 else
747 {
748 while (p != end && *p >= '0' && *p <= '9')
749 p++;
750 confusing = (end == p);
751 }
752
753 p = XSYMBOL (obj)->name->data;
754 while (p != end)
755 {
756 QUIT;
757 c = *p++;
758 if (escapeflag)
759 {
760 if (c == '\"' || c == '\\' || c == '\'' || c == ';' || c == '#' ||
761 c == '(' || c == ')' || c == ',' || c =='.' || c == '`' ||
762 c == '[' || c == ']' || c == '?' || c <= 040 || confusing)
763 PRINTCHAR ('\\'), confusing = 0;
764 }
765 PRINTCHAR (c);
766 }
767 }
768 break;
769
770 case Lisp_Cons:
771 /* If deeper than spec'd depth, print placeholder. */
772 if (XTYPE (Vprint_level) == Lisp_Int
773 && print_depth > XINT (Vprint_level))
774 {
775 strout ("...", -1, printcharfun);
776 break;
777 }
778
779 PRINTCHAR ('(');
780 {
781 register int i = 0;
782 register int max = 0;
783
784 if (XTYPE (Vprint_length) == Lisp_Int)
785 max = XINT (Vprint_length);
786 while (CONSP (obj))
787 {
788 if (i++)
789 PRINTCHAR (' ');
790 if (max && i > max)
791 {
792 strout ("...", 3, printcharfun);
793 break;
794 }
795 print (Fcar (obj), printcharfun, escapeflag);
796 obj = Fcdr (obj);
797 }
798 }
799 if (!NULL (obj) && !CONSP (obj))
800 {
801 strout (" . ", 3, printcharfun);
802 print (obj, printcharfun, escapeflag);
803 }
804 PRINTCHAR (')');
805 break;
806
807 case Lisp_Compiled:
200f684e 808 strout ("#", -1, printcharfun);
38010d50
JB
809 case Lisp_Vector:
810 PRINTCHAR ('[');
811 {
812 register int i;
813 register Lisp_Object tem;
814 for (i = 0; i < XVECTOR (obj)->size; i++)
815 {
816 if (i) PRINTCHAR (' ');
817 tem = XVECTOR (obj)->contents[i];
818 print (tem, printcharfun, escapeflag);
819 }
820 }
821 PRINTCHAR (']');
38010d50
JB
822 break;
823
824#ifndef standalone
825 case Lisp_Buffer:
826 if (NULL (XBUFFER (obj)->name))
827 strout ("#<killed buffer>", -1, printcharfun);
828 else if (escapeflag)
829 {
830 strout ("#<buffer ", -1, printcharfun);
831 print_string (XBUFFER (obj)->name, printcharfun);
832 PRINTCHAR ('>');
833 }
834 else
835 print_string (XBUFFER (obj)->name, printcharfun);
836 break;
837
838 case Lisp_Process:
839 if (escapeflag)
840 {
841 strout ("#<process ", -1, printcharfun);
842 print_string (XPROCESS (obj)->name, printcharfun);
843 PRINTCHAR ('>');
844 }
845 else
846 print_string (XPROCESS (obj)->name, printcharfun);
847 break;
848
849 case Lisp_Window:
850 strout ("#<window ", -1, printcharfun);
851 sprintf (buf, "%d", XFASTINT (XWINDOW (obj)->sequence_number));
852 strout (buf, -1, printcharfun);
853 if (!NULL (XWINDOW (obj)->buffer))
854 {
855 strout (" on ", -1, printcharfun);
856 print_string (XBUFFER (XWINDOW (obj)->buffer)->name, printcharfun);
857 }
858 PRINTCHAR ('>');
859 break;
860
861 case Lisp_Window_Configuration:
862 strout ("#<window-configuration>", -1, printcharfun);
863 break;
864
865#ifdef MULTI_SCREEN
866 case Lisp_Screen:
867 strout ("#<screen ", -1, printcharfun);
868 print_string (XSCREEN (obj)->name, printcharfun);
869 sprintf (buf, " 0x%x", XFASTINT (XSCREEN (obj)));
870 strout (buf, -1, printcharfun);
871 strout (">", -1, printcharfun);
872 break;
873#endif /* MULTI_SCREEN */
874
875 case Lisp_Marker:
876 strout ("#<marker ", -1, printcharfun);
877 if (!(XMARKER (obj)->buffer))
878 strout ("in no buffer", -1, printcharfun);
879 else
880 {
881 sprintf (buf, "at %d", marker_position (obj));
882 strout (buf, -1, printcharfun);
883 strout (" in ", -1, printcharfun);
884 print_string (XMARKER (obj)->buffer->name, printcharfun);
885 }
886 PRINTCHAR ('>');
887 break;
888#endif /* standalone */
889
890 case Lisp_Subr:
891 strout ("#<subr ", -1, printcharfun);
892 strout (XSUBR (obj)->symbol_name, -1, printcharfun);
893 PRINTCHAR ('>');
894 break;
895 }
896
897 print_depth--;
898}
899\f
900void
901syms_of_print ()
902{
903 staticpro (&Qprint_escape_newlines);
904 Qprint_escape_newlines = intern ("print-escape-newlines");
905
906 DEFVAR_LISP ("standard-output", &Vstandard_output,
907 "Output stream `print' uses by default for outputting a character.\n\
908This may be any function of one argument.\n\
909It may also be a buffer (output is inserted before point)\n\
910or a marker (output is inserted and the marker is advanced)\n\
911or the symbol t (output appears in the minibuffer line).");
912 Vstandard_output = Qt;
913 Qstandard_output = intern ("standard-output");
914 staticpro (&Qstandard_output);
915
916#ifdef LISP_FLOAT_TYPE
917 DEFVAR_LISP ("float-output-format", &Vfloat_output_format,
918 "The format descriptor string that lisp uses to print floats.\n\
919This is a %-spec like those accepted by `printf' in C,\n\
920but with some restrictions. It must start with the two characters `%.'.\n\
921After that comes an integer precision specification,\n\
922and then a letter which controls the format.\n\
923The letters allowed are `e', `f' and `g'.\n\
924Use `e' for exponential notation \"DIG.DIGITSeEXPT\"\n\
925Use `f' for decimal point notation \"DIGITS.DIGITS\".\n\
926Use `g' to choose the shorter of those two formats for the number at hand.\n\
927The precision in any of these cases is the number of digits following\n\
928the decimal point. With `f', a precision of 0 means to omit the\n\
929decimal point. 0 is not allowed with `f' or `g'.\n\n\
930A value of nil means to use `%.20g'.");
931 Vfloat_output_format = Qnil;
932 Qfloat_output_format = intern ("float-output-format");
933 staticpro (&Qfloat_output_format);
934#endif /* LISP_FLOAT_TYPE */
935
936 DEFVAR_LISP ("print-length", &Vprint_length,
937 "Maximum length of list to print before abbreviating.\
938A value of nil means no limit.");
939 Vprint_length = Qnil;
940
941 DEFVAR_LISP ("print-level", &Vprint_level,
942 "Maximum depth of list nesting to print before abbreviating.\
943A value of nil means no limit.");
944 Vprint_level = Qnil;
945
946 DEFVAR_BOOL ("print-escape-newlines", &print_escape_newlines,
947 "Non-nil means print newlines in strings as backslash-n.");
948 print_escape_newlines = 0;
949
950 /* prin1_to_string_buffer initialized in init_buffer_once in buffer.c */
951 staticpro (&Vprin1_to_string_buffer);
952
953 defsubr (&Sprin1);
954 defsubr (&Sprin1_to_string);
955 defsubr (&Sprinc);
956 defsubr (&Sprint);
957 defsubr (&Sterpri);
958 defsubr (&Swrite_char);
959 defsubr (&Sexternal_debugging_output);
960
961 Qexternal_debugging_output = intern ("external-debugging-output");
962 staticpro (&Qexternal_debugging_output);
963
964#ifndef standalone
965 defsubr (&Swith_output_to_temp_buffer);
966#endif /* not standalone */
967}