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