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