8ded305ece619a85340036d01ba27f114608d2c5
[chise/xemacs-chise.git.1] / src / print.c
1 /* Lisp object printing and output streams.
2    Copyright (C) 1985, 1986, 1988, 1992-1995 Free Software Foundation, Inc.
3    Copyright (C) 1995, 1996 Ben Wing.
4
5 This file is part of XEmacs.
6
7 XEmacs is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
10 later version.
11
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with XEmacs; see the file COPYING.  If not, write to
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 /* Synched up with: Not synched with FSF. */
23
24 /* This file has been Mule-ized. */
25
26 /* Seriously hacked on by Ben Wing for Mule. */
27
28 #include <config.h>
29 #include "lisp.h"
30
31 #include "backtrace.h"
32 #include "buffer.h"
33 #include "bytecode.h"
34 #include "console-tty.h"
35 #include "console-stream.h"
36 #include "extents.h"
37 #include "frame.h"
38 #include "insdel.h"
39 #include "lstream.h"
40 #include "sysfile.h"
41
42 #include <limits.h>
43 #include <float.h>
44 /* Define if not in float.h */
45 #ifndef DBL_DIG
46 #define DBL_DIG 16
47 #endif
48
49 Lisp_Object Vstandard_output, Qstandard_output;
50
51 /* The subroutine object for external-debugging-output is kept here
52    for the convenience of the debugger.  */
53 Lisp_Object Qexternal_debugging_output;
54 Lisp_Object Qalternate_debugging_output;
55
56 /* Avoid actual stack overflow in print.  */
57 static int print_depth;
58
59 /* Detect most circularities to print finite output.  */
60 #define PRINT_CIRCLE 200
61 Lisp_Object being_printed[PRINT_CIRCLE];
62
63 /* Maximum length of list or vector to print in full; noninteger means
64    effectively infinity */
65
66 Lisp_Object Vprint_length;
67 Lisp_Object Qprint_length;
68
69 /* Maximum length of string to print in full; noninteger means
70    effectively infinity */
71
72 Lisp_Object Vprint_string_length;
73 Lisp_Object Qprint_string_length;
74
75 /* Maximum depth of list to print in full; noninteger means
76    effectively infinity.  */
77
78 Lisp_Object Vprint_level;
79
80 /* Label to use when making echo-area messages. */
81
82 Lisp_Object Vprint_message_label;
83
84 /* Nonzero means print newlines in strings as \n.  */
85
86 int print_escape_newlines;
87 int print_readably;
88
89 /* Non-nil means print #: before uninterned symbols.
90    Neither t nor nil means so that and don't clear Vprint_gensym_alist
91    on entry to and exit from print functions.  */
92 Lisp_Object Vprint_gensym;
93 Lisp_Object Vprint_gensym_alist;
94
95 Lisp_Object Qprint_escape_newlines;
96 Lisp_Object Qprint_readably;
97
98 Lisp_Object Qdisplay_error;
99 Lisp_Object Qprint_message_label;
100
101 /* Force immediate output of all printed data.  Used for debugging. */
102 int print_unbuffered;
103
104 FILE *termscript;       /* Stdio stream being used for copy of all output.  */
105
106 \f
107
108 int stdout_needs_newline;
109
110 /* Write a string (in internal format) to stdio stream STREAM. */
111
112 void
113 write_string_to_stdio_stream (FILE *stream, struct console *con,
114                               CONST Bufbyte *str,
115                               Bytecount offset, Bytecount len,
116                               enum external_data_format fmt)
117 {
118   int extlen;
119   CONST Extbyte *extptr;
120
121   GET_CHARPTR_EXT_DATA_ALLOCA (str + offset, len, fmt, extptr, extlen);
122   if (stream)
123     {
124       fwrite (extptr, 1, extlen, stream);
125 #ifdef WINDOWSNT
126       /* Q122442 says that pipes are "treated as files, not as
127          devices", and that this is a feature. Before I found that
128          article, I thought it was a bug. Thanks MS, I feel much
129          better now. - kkm */
130       if (stream == stdout || stream == stderr)
131         fflush (stream);
132 #endif
133     }
134   else
135     {
136       assert (CONSOLE_TTY_P (con));
137       Lstream_write (XLSTREAM (CONSOLE_TTY_DATA (con)->outstream),
138                      extptr, extlen);
139     }
140   if (stream == stdout || stream == stderr ||
141       (!stream && CONSOLE_TTY_DATA (con)->is_stdio))
142     {
143       if (termscript)
144         {
145           fwrite (extptr, 1, extlen, termscript);
146           fflush (termscript);
147         }
148       stdout_needs_newline = (extptr[extlen - 1] != '\n');
149     }
150 }
151
152 /* Write a string to the output location specified in FUNCTION.
153    Arguments NONRELOC, RELOC, OFFSET, and LEN are as in
154    buffer_insert_string_1() in insdel.c. */
155
156 static void
157 output_string (Lisp_Object function, CONST Bufbyte *nonreloc,
158                Lisp_Object reloc, Bytecount offset, Bytecount len)
159 {
160   /* This function can GC */
161   Charcount cclen;
162   /* We change the value of nonreloc (fetching it from reloc as
163      necessary), but we don't want to pass this changed value on to
164      other functions that take both a nonreloc and a reloc, or things
165      may get confused and an assertion failure in
166      fixup_internal_substring() may get triggered. */
167   CONST Bufbyte *newnonreloc = nonreloc;
168   struct gcpro gcpro1, gcpro2;
169
170   /* Emacs won't print while GCing, but an external debugger might */
171   if (gc_in_progress) return;
172
173   /* Perhaps not necessary but probably safer. */
174   GCPRO2 (function, reloc);
175
176   fixup_internal_substring (newnonreloc, reloc, offset, &len);
177
178   if (STRINGP (reloc))
179     newnonreloc = XSTRING_DATA (reloc);
180
181   cclen = bytecount_to_charcount (newnonreloc + offset, len);
182
183   if (LSTREAMP (function))
184     {
185       if (STRINGP (reloc))
186         {
187           /* Protect against Lstream_write() causing a GC and
188              relocating the string.  For small strings, we do it by
189              alloc'ing the string and using a copy; for large strings,
190              we inhibit GC.  */
191           if (len < 65536)
192             {
193               Bufbyte *copied = alloca_array (Bufbyte, len);
194               memcpy (copied, newnonreloc + offset, len);
195               Lstream_write (XLSTREAM (function), copied, len);
196             }
197           else
198             {
199               int speccount = specpdl_depth ();
200               record_unwind_protect (restore_gc_inhibit,
201                                      make_int (gc_currently_forbidden));
202               gc_currently_forbidden = 1;
203               Lstream_write (XLSTREAM (function), newnonreloc + offset, len);
204               unbind_to (speccount, Qnil);
205             }
206         }
207       else
208         Lstream_write (XLSTREAM (function), newnonreloc + offset, len);
209
210       if (print_unbuffered)
211         Lstream_flush (XLSTREAM (function));
212     }
213   else if (BUFFERP (function))
214     {
215       CHECK_LIVE_BUFFER (function);
216       buffer_insert_string (XBUFFER (function), nonreloc, reloc, offset, len);
217     }
218   else if (MARKERP (function))
219     {
220       /* marker_position() will err if marker doesn't point anywhere.  */
221       Bufpos spoint = marker_position (function);
222
223       buffer_insert_string_1 (XMARKER (function)->buffer,
224                               spoint, nonreloc, reloc, offset, len,
225                               0);
226       Fset_marker (function, make_int (spoint + cclen),
227                    Fmarker_buffer (function));
228     }
229   else if (FRAMEP (function))
230     {
231       /* This gets used by functions not invoking print_prepare(),
232          such as Fwrite_char, Fterpri, etc..  */
233       struct frame *f = XFRAME (function);
234       CHECK_LIVE_FRAME (function);
235
236       if (!EQ (Vprint_message_label, echo_area_status (f)))
237         clear_echo_area_from_print (f, Qnil, 1);
238       echo_area_append (f, nonreloc, reloc, offset, len, Vprint_message_label);
239     }
240   else if (EQ (function, Qt) || EQ (function, Qnil))
241     {
242       write_string_to_stdio_stream (stdout, 0, newnonreloc, offset, len,
243                                     FORMAT_TERMINAL);
244     }
245   else
246     {
247       Charcount ccoff = bytecount_to_charcount (newnonreloc, offset);
248       Charcount iii;
249
250       for (iii = ccoff; iii < cclen + ccoff; iii++)
251         {
252           call1 (function,
253                  make_char (charptr_emchar_n (newnonreloc, iii)));
254           if (STRINGP (reloc))
255             newnonreloc = XSTRING_DATA (reloc);
256         }
257     }
258
259   UNGCPRO;
260 }
261 \f
262 #define RESET_PRINT_GENSYM do {                 \
263   if (!CONSP (Vprint_gensym))                   \
264     Vprint_gensym_alist = Qnil;                 \
265 } while (0)
266
267 static Lisp_Object
268 canonicalize_printcharfun (Lisp_Object printcharfun)
269 {
270   if (NILP (printcharfun))
271     printcharfun = Vstandard_output;
272
273   if (EQ (printcharfun, Qt) || NILP (printcharfun))
274     printcharfun = Fselected_frame (Qnil); /* print to minibuffer */
275
276   return printcharfun;
277 }
278
279 static Lisp_Object
280 print_prepare (Lisp_Object printcharfun, Lisp_Object *frame_kludge)
281 {
282   /* Emacs won't print while GCing, but an external debugger might */
283   if (gc_in_progress)
284     return Qnil;
285
286   RESET_PRINT_GENSYM;
287
288   printcharfun = canonicalize_printcharfun (printcharfun);
289
290   /* Here we could safely return the canonicalized PRINTCHARFUN.
291      However, if PRINTCHARFUN is a frame, printing of complex
292      structures becomes very expensive, because `append-message'
293      (called by echo_area_append) gets called as many times as
294      output_string() is called (and that's a *lot*).  append-message
295      tries to keep top of the message-stack in sync with the contents
296      of " *Echo Area" buffer, consing a new string for each component
297      of the printed structure.  For instance, if you print (a a),
298      append-message will cons up the following strings:
299
300          "("
301          "(a"
302          "(a "
303          "(a a"
304          "(a a)"
305
306      and will use only the last one.  With larger objects, this turns
307      into an O(n^2) consing frenzy that locks up XEmacs in incessant
308      garbage collection.
309
310      We prevent this by creating a resizing_buffer stream and letting
311      the printer write into it.  print_finish() will notice this
312      stream, and invoke echo_area_append() with the stream's buffer,
313      only once.  */
314   if (FRAMEP (printcharfun))
315     {
316       CHECK_LIVE_FRAME (printcharfun);
317       *frame_kludge = printcharfun;
318       printcharfun = make_resizing_buffer_output_stream ();
319     }
320
321   return printcharfun;
322 }
323
324 static void
325 print_finish (Lisp_Object stream, Lisp_Object frame_kludge)
326 {
327   /* Emacs won't print while GCing, but an external debugger might */
328   if (gc_in_progress)
329     return;
330
331   RESET_PRINT_GENSYM;
332
333   /* See the comment in print_prepare().  */
334   if (FRAMEP (frame_kludge))
335     {
336       struct frame *f = XFRAME (frame_kludge);
337       Lstream *str = XLSTREAM (stream);
338       CHECK_LIVE_FRAME (frame_kludge);
339
340       Lstream_flush (str);
341       if (!EQ (Vprint_message_label, echo_area_status (f)))
342         clear_echo_area_from_print (f, Qnil, 1);
343       echo_area_append (f, resizing_buffer_stream_ptr (str),
344                         Qnil, 0, Lstream_byte_count (str),
345                         Vprint_message_label);
346       Lstream_delete (str);
347     }
348 }
349 \f
350 /* Used for printing a single-byte character (*not* any Emchar).  */
351 #define write_char_internal(string_of_length_1, stream)                 \
352   output_string (stream, (CONST Bufbyte *) (string_of_length_1),        \
353                  Qnil, 0, 1)
354
355 /* NOTE: Do not call this with the data of a Lisp_String, as
356    printcharfun might cause a GC, which might cause the string's data
357    to be relocated.  To princ a Lisp string, use:
358
359        print_internal (string, printcharfun, 0);
360
361    Also note that STREAM should be the result of
362    canonicalize_printcharfun() (i.e. Qnil means stdout, not
363    Vstandard_output, etc.)  */
364 void
365 write_string_1 (CONST Bufbyte *str, Bytecount size, Lisp_Object stream)
366 {
367   /* This function can GC */
368 #ifdef ERROR_CHECK_BUFPOS
369   assert (size >= 0);
370 #endif
371   output_string (stream, str, Qnil, 0, size);
372 }
373
374 void
375 write_c_string (CONST char *str, Lisp_Object stream)
376 {
377   /* This function can GC */
378   write_string_1 ((CONST Bufbyte *) str, strlen (str), stream);
379 }
380
381 \f
382 DEFUN ("write-char", Fwrite_char, 1, 2, 0, /*
383 Output character CH to stream STREAM.
384 STREAM defaults to the value of `standard-output' (which see).
385 */
386        (ch, stream))
387 {
388   /* This function can GC */
389   Bufbyte str[MAX_EMCHAR_LEN];
390   Bytecount len;
391
392   CHECK_CHAR_COERCE_INT (ch);
393   len = set_charptr_emchar (str, XCHAR (ch));
394   output_string (canonicalize_printcharfun (stream), str, Qnil, 0, len);
395   return ch;
396 }
397
398 void
399 temp_output_buffer_setup (Lisp_Object bufname)
400 {
401   /* This function can GC */
402   struct buffer *old = current_buffer;
403   Lisp_Object buf;
404
405 #ifdef I18N3
406   /* #### This function should accept a Lisp_Object instead of a char *,
407      so that proper translation on the buffer name can occur. */
408 #endif
409
410   Fset_buffer (Fget_buffer_create (bufname));
411
412   current_buffer->read_only = Qnil;
413   Ferase_buffer (Qnil);
414
415   XSETBUFFER (buf, current_buffer);
416   specbind (Qstandard_output, buf);
417
418   set_buffer_internal (old);
419 }
420
421 Lisp_Object
422 internal_with_output_to_temp_buffer (Lisp_Object bufname,
423                                      Lisp_Object (*function) (Lisp_Object arg),
424                                      Lisp_Object arg,
425                                      Lisp_Object same_frame)
426 {
427   int speccount = specpdl_depth ();
428   struct gcpro gcpro1, gcpro2, gcpro3;
429   Lisp_Object buf = Qnil;
430
431   GCPRO3 (buf, arg, same_frame);
432
433   temp_output_buffer_setup (bufname);
434   buf = Vstandard_output;
435
436   arg = (*function) (arg);
437
438   temp_output_buffer_show (buf, same_frame);
439   UNGCPRO;
440
441   return unbind_to (speccount, arg);
442 }
443
444 DEFUN ("with-output-to-temp-buffer", Fwith_output_to_temp_buffer, 1, UNEVALLED, 0, /*
445 Bind `standard-output' to buffer BUFNAME, eval BODY, then show that buffer.
446 The buffer is cleared out initially, and marked as unmodified when done.
447 All output done by BODY is inserted in that buffer by default.
448 The buffer is displayed in another window, but not selected.
449 The value of the last form in BODY is returned.
450 If BODY does not finish normally, the buffer BUFNAME is not displayed.
451
452 If variable `temp-buffer-show-function' is non-nil, call it at the end
453 to get the buffer displayed.  It gets one argument, the buffer to display.
454 */
455        (args))
456 {
457   /* This function can GC */
458   Lisp_Object name = Qnil;
459   int speccount = specpdl_depth ();
460   struct gcpro gcpro1, gcpro2;
461   Lisp_Object val = Qnil;
462
463 #ifdef I18N3
464   /* #### should set the buffer to be translating.  See print_internal(). */
465 #endif
466
467   GCPRO2 (name, val);
468   name = Feval (XCAR (args));
469
470   CHECK_STRING (name);
471
472   temp_output_buffer_setup (name);
473   UNGCPRO;
474
475   val = Fprogn (XCDR (args));
476
477   temp_output_buffer_show (Vstandard_output, Qnil);
478
479   return unbind_to (speccount, val);
480 }
481 \f
482 DEFUN ("terpri", Fterpri, 0, 1, 0, /*
483 Output a newline to STREAM.
484 If STREAM is omitted or nil, the value of `standard-output' is used.
485 */
486        (stream))
487 {
488   /* This function can GC */
489   write_char_internal ("\n", canonicalize_printcharfun (stream));
490   return Qt;
491 }
492
493 DEFUN ("prin1", Fprin1, 1, 2, 0, /*
494 Output the printed representation of OBJECT, any Lisp object.
495 Quoting characters are printed when needed to make output that `read'
496 can handle, whenever this is possible.
497 Output stream is STREAM, or value of `standard-output' (which see).
498 */
499        (object, stream))
500 {
501   /* This function can GC */
502   Lisp_Object frame = Qnil;
503   struct gcpro gcpro1, gcpro2;
504   GCPRO2 (object, stream);
505
506   print_depth = 0;
507   stream = print_prepare (stream, &frame);
508   print_internal (object, stream, 1);
509   print_finish (stream, frame);
510
511   UNGCPRO;
512   return object;
513 }
514
515 DEFUN ("prin1-to-string", Fprin1_to_string, 1, 2, 0, /*
516 Return a string containing the printed representation of OBJECT,
517 any Lisp object.  Quoting characters are used when needed to make output
518 that `read' can handle, whenever this is possible, unless the optional
519 second argument NOESCAPE is non-nil.
520 */
521        (object, noescape))
522 {
523   /* This function can GC */
524   Lisp_Object result = Qnil;
525   Lisp_Object stream = make_resizing_buffer_output_stream ();
526   Lstream *str = XLSTREAM (stream);
527   /* gcpro OBJECT in case a caller forgot to do so */
528   struct gcpro gcpro1, gcpro2, gcpro3;
529   GCPRO3 (object, stream, result);
530
531   print_depth = 0;
532   RESET_PRINT_GENSYM;
533   print_internal (object, stream, NILP (noescape));
534   RESET_PRINT_GENSYM;
535   Lstream_flush (str);
536   UNGCPRO;
537   result = make_string (resizing_buffer_stream_ptr (str),
538                         Lstream_byte_count (str));
539   Lstream_delete (str);
540   return result;
541 }
542
543 DEFUN ("princ", Fprinc, 1, 2, 0, /*
544 Output the printed representation of OBJECT, any Lisp object.
545 No quoting characters are used; no delimiters are printed around
546 the contents of strings.
547 Output stream is STREAM, or value of standard-output (which see).
548 */
549        (object, stream))
550 {
551   /* This function can GC */
552   Lisp_Object frame = Qnil;
553   struct gcpro gcpro1, gcpro2;
554
555   GCPRO2 (object, stream);
556   stream = print_prepare (stream, &frame);
557   print_depth = 0;
558   print_internal (object, stream, 0);
559   print_finish (stream, frame);
560   UNGCPRO;
561   return object;
562 }
563
564 DEFUN ("print", Fprint, 1, 2, 0, /*
565 Output the printed representation of OBJECT, with newlines around it.
566 Quoting characters are printed when needed to make output that `read'
567 can handle, whenever this is possible.
568 Output stream is STREAM, or value of `standard-output' (which see).
569 */
570        (object, stream))
571 {
572   /* This function can GC */
573   Lisp_Object frame = Qnil;
574   struct gcpro gcpro1, gcpro2;
575
576   GCPRO2 (object, stream);
577   stream = print_prepare (stream, &frame);
578   print_depth = 0;
579   write_char_internal ("\n", stream);
580   print_internal (object, stream, 1);
581   write_char_internal ("\n", stream);
582   print_finish (stream, frame);
583   UNGCPRO;
584   return object;
585 }
586 \f
587 /* Print an error message for the error DATA to STREAM.  This is a
588    complete implementation of `display-error', which used to be in
589    Lisp (see prim/cmdloop.el).  It was ported to C so it can be used
590    efficiently by Ferror_message_string.  Fdisplay_error and
591    Ferror_message_string are trivial wrappers around this function.
592
593    STREAM should be the result of canonicalize_printcharfun().  */
594 static void
595 print_error_message (Lisp_Object error_object, Lisp_Object stream)
596 {
597   /* This function can GC */
598   Lisp_Object type = Fcar_safe (error_object);
599   Lisp_Object method = Qnil;
600   Lisp_Object tail;
601
602   /* No need to GCPRO anything under the assumption that ERROR_OBJECT
603      is GCPRO'd.  */
604
605   if (! (CONSP (error_object) && SYMBOLP (type)
606          && CONSP (Fget (type, Qerror_conditions, Qnil))))
607     goto error_throw;
608
609   tail = XCDR (error_object);
610   while (!NILP (tail))
611     {
612       if (CONSP (tail))
613         tail = XCDR (tail);
614       else
615         goto error_throw;
616     }
617   tail = Fget (type, Qerror_conditions, Qnil);
618   while (!NILP (tail))
619     {
620       if (!(CONSP (tail) && SYMBOLP (XCAR (tail))))
621         goto error_throw;
622       else if (!NILP (Fget (XCAR (tail), Qdisplay_error, Qnil)))
623         {
624           method = Fget (XCAR (tail), Qdisplay_error, Qnil);
625           goto error_throw;
626         }
627       else
628         tail = XCDR (tail);
629     }
630   /* Default method */
631   {
632     int first = 1;
633     int speccount = specpdl_depth ();
634
635     specbind (Qprint_message_label, Qerror);
636     tail = Fcdr (error_object);
637     if (EQ (type, Qerror))
638       {
639         print_internal (Fcar (tail), stream, 0);
640         tail = Fcdr (tail);
641       }
642     else
643       {
644         Lisp_Object errmsg = Fget (type, Qerror_message, Qnil);
645         if (NILP (errmsg))
646           print_internal (type, stream, 0);
647         else
648           print_internal (LISP_GETTEXT (errmsg), stream, 0);
649       }
650     while (!NILP (tail))
651       {
652         write_c_string (first ? ": " : ", ", stream);
653         print_internal (Fcar (tail), stream, 1);
654         tail = Fcdr (tail);
655         first = 0;
656       }
657     unbind_to (speccount, Qnil);
658     return;
659     /* not reached */
660   }
661
662  error_throw:
663   if (NILP (method))
664     {
665       write_c_string (GETTEXT ("Peculiar error "), stream);
666       print_internal (error_object, stream, 1);
667       return;
668     }
669   else
670     {
671       call2 (method, error_object, stream);
672     }
673 }
674
675 DEFUN ("error-message-string", Ferror_message_string, 1, 1, 0, /*
676 Convert ERROR-OBJECT to an error message, and return it.
677
678 The format of ERROR-OBJECT should be (ERROR-SYMBOL . DATA).  The
679 message is equivalent to the one that would be issued by
680 `display-error' with the same argument.
681 */
682        (error_object))
683 {
684   /* This function can GC */
685   Lisp_Object result = Qnil;
686   Lisp_Object stream = make_resizing_buffer_output_stream ();
687   struct gcpro gcpro1;
688   GCPRO1 (stream);
689
690   print_error_message (error_object, stream);
691   Lstream_flush (XLSTREAM (stream));
692   result = make_string (resizing_buffer_stream_ptr (XLSTREAM (stream)),
693                         Lstream_byte_count (XLSTREAM (stream)));
694   Lstream_delete (XLSTREAM (stream));
695
696   UNGCPRO;
697   return result;
698 }
699
700 DEFUN ("display-error", Fdisplay_error, 2, 2, 0, /*
701 Display ERROR-OBJECT on STREAM in a user-friendly way.
702 */
703        (error_object, stream))
704 {
705   /* This function can GC */
706   print_error_message (error_object, canonicalize_printcharfun (stream));
707   return Qnil;
708 }
709
710 \f
711 #ifdef LISP_FLOAT_TYPE
712
713 Lisp_Object Vfloat_output_format;
714 Lisp_Object Qfloat_output_format;
715
716 /*
717  * This buffer should be at least as large as the max string size of the
718  * largest float, printed in the biggest notation.  This is undoubtably
719  * 20d float_output_format, with the negative of the C-constant "HUGE"
720  * from <math.h>.
721  *
722  * On the vax the worst case is -1e38 in 20d format which takes 61 bytes.
723  *
724  * I assume that IEEE-754 format numbers can take 329 bytes for the worst
725  * case of -1e307 in 20d float_output_format. What is one to do (short of
726  * re-writing _doprnt to be more sane)?
727  *                      -wsr
728  */
729 void
730 float_to_string (char *buf, double data)
731 {
732   Bufbyte *cp, c;
733   int width;
734
735   if (NILP (Vfloat_output_format)
736       || !STRINGP (Vfloat_output_format))
737   lose:
738     sprintf (buf, "%.16g", data);
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_DATA (Vfloat_output_format);
745
746       if (cp[0] != '%')
747         goto lose;
748       if (cp[1] != '.')
749         goto lose;
750
751       cp += 2;
752       for (width = 0; (c = *cp, isdigit (c)); cp++)
753         {
754           width *= 10;
755           width += c - '0';
756         }
757
758       if (*cp != 'e' && *cp != 'f' && *cp != 'g' && *cp != 'E' && *cp != 'G')
759         goto lose;
760
761       if (width < (int) (*cp != 'e' && *cp != 'E') || width > DBL_DIG)
762         goto lose;
763
764       if (cp[1] != 0)
765         goto lose;
766
767       sprintf (buf, (char *) XSTRING_DATA (Vfloat_output_format),
768                data);
769     }
770
771   /* added by jwz: don't allow "1.0" to print as "1"; that destroys
772      the read-equivalence of lisp objects.  (* x 1) and (* x 1.0) do
773      not do the same thing, so it's important that the printed
774      representation of that form not be corrupted by the printer.
775    */
776   {
777     Bufbyte *s = (Bufbyte *) buf; /* don't use signed chars here!
778                                      isdigit() can't hack them! */
779     if (*s == '-') s++;
780     for (; *s; s++)
781       /* if there's a non-digit, then there is a decimal point, or
782          it's in exponential notation, both of which are ok. */
783       if (!isdigit (*s))
784         goto DONE_LABEL;
785     /* otherwise, we need to hack it. */
786     *s++ = '.';
787     *s++ = '0';
788     *s = 0;
789   }
790  DONE_LABEL:
791
792   /* Some machines print "0.4" as ".4".  I don't like that. */
793   if (buf [0] == '.' || (buf [0] == '-' && buf [1] == '.'))
794     {
795       int i;
796       for (i = strlen (buf) + 1; i >= 0; i--)
797         buf [i+1] = buf [i];
798       buf [(buf [0] == '-' ? 1 : 0)] = '0';
799     }
800 }
801 #endif /* LISP_FLOAT_TYPE */
802
803 /* Print NUMBER to BUFFER.  The digits are first written in reverse
804    order (the least significant digit first), and are then reversed.
805    This is equivalent to sprintf(buffer, "%ld", number), only much
806    faster.
807
808    BUFFER should accept 24 bytes.  This should suffice for the longest
809    numbers on 64-bit machines, including the `-' sign and the trailing
810    \0.  */
811 void
812 long_to_string (char *buffer, long number)
813 {
814 #if (SIZEOF_LONG != 4) && (SIZEOF_LONG != 8)
815   /* Huh? */
816   sprintf (buffer, "%ld", number);
817 #else /* (SIZEOF_LONG == 4) || (SIZEOF_LONG == 8) */
818   char *p = buffer;
819   int force = 0;
820
821   if (number < 0)
822     {
823       *p++ = '-';
824       number = -number;
825     }
826
827 #define FROB(figure) do {                                               \
828     if (force || number >= figure)                                      \
829       *p++ = number / figure + '0', number %= figure, force = 1;        \
830     } while (0)
831 #if SIZEOF_LONG == 8
832   FROB (1000000000000000000L);
833   FROB (100000000000000000L);
834   FROB (10000000000000000L);
835   FROB (1000000000000000L);
836   FROB (100000000000000L);
837   FROB (10000000000000L);
838   FROB (1000000000000L);
839   FROB (100000000000L);
840   FROB (10000000000L);
841 #endif /* SIZEOF_LONG == 8 */
842   FROB (1000000000);
843   FROB (100000000);
844   FROB (10000000);
845   FROB (1000000);
846   FROB (100000);
847   FROB (10000);
848   FROB (1000);
849   FROB (100);
850   FROB (10);
851 #undef FROB
852   *p++ = number + '0';
853   *p = '\0';
854 #endif /* (SIZEOF_LONG == 4) || (SIZEOF_LONG == 8) */
855 }
856 \f
857 static void
858 print_vector_internal (CONST char *start, CONST char *end,
859                        Lisp_Object obj,
860                        Lisp_Object printcharfun, int escapeflag)
861 {
862   /* This function can GC */
863   int i;
864   int len = XVECTOR_LENGTH (obj);
865   int last = len;
866   struct gcpro gcpro1, gcpro2;
867   GCPRO2 (obj, printcharfun);
868
869   if (INTP (Vprint_length))
870     {
871       int max = XINT (Vprint_length);
872       if (max < len) last = max;
873     }
874
875   write_c_string (start, printcharfun);
876   for (i = 0; i < last; i++)
877     {
878       Lisp_Object elt = XVECTOR_DATA (obj)[i];
879       if (i != 0) write_char_internal (" ", printcharfun);
880       print_internal (elt, printcharfun, escapeflag);
881     }
882   UNGCPRO;
883   if (last != len)
884     write_c_string (" ...", printcharfun);
885   write_c_string (end, printcharfun);
886 }
887
888 void
889 print_cons (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
890 {
891   /* This function can GC */
892   struct gcpro gcpro1, gcpro2;
893
894   /* If print_readably is on, print (quote -foo-) as '-foo-
895      (Yeah, this should really be what print-pretty does, but we
896      don't have the rest of a pretty printer, and this actually
897      has non-negligible impact on size/speed of .elc files.)
898   */
899   if (print_readably &&
900       EQ (XCAR (obj), Qquote) &&
901       CONSP (XCDR (obj)) &&
902       NILP (XCDR (XCDR (obj))))
903     {
904       obj = XCAR (XCDR (obj));
905       GCPRO2 (obj, printcharfun);
906       write_char_internal ("\'", printcharfun);
907       UNGCPRO;
908       print_internal (obj, printcharfun, escapeflag);
909       return;
910     }
911
912   GCPRO2 (obj, printcharfun);
913   write_char_internal ("(", printcharfun);
914
915   {
916     int len;
917     int max = INTP (Vprint_length) ? XINT (Vprint_length) : INT_MAX;
918     Lisp_Object tortoise;
919     /* Use tortoise/hare to make sure circular lists don't infloop */
920
921     for (tortoise = obj, len = 0;
922          CONSP (obj);
923          obj = XCDR (obj), len++)
924       {
925         if (len > 0)
926           write_char_internal (" ", printcharfun);
927         if (EQ (obj, tortoise) && len > 0)
928           {
929             if (print_readably)
930               error ("printing unreadable circular list");
931             else
932               write_c_string ("... <circular list>", printcharfun);
933             break;
934           }
935         if (len & 1)
936           tortoise = XCDR (tortoise);
937         if (len > max)
938           {
939             write_c_string ("...", printcharfun);
940             break;
941           }
942         print_internal (XCAR (obj), printcharfun, escapeflag);
943       }
944   }
945   if (!LISTP (obj))
946     {
947       write_c_string (" . ", printcharfun);
948       print_internal (obj, printcharfun, escapeflag);
949     }
950   UNGCPRO;
951
952   write_char_internal (")", printcharfun);
953   return;
954 }
955
956 void
957 print_vector (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
958 {
959   print_vector_internal ("[", "]", obj, printcharfun, escapeflag);
960 }
961
962 void
963 print_string (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
964 {
965   struct Lisp_String *s = XSTRING (obj);
966   /* We distinguish between Bytecounts and Charcounts, to make
967      Vprint_string_length work correctly under Mule.  */
968   Charcount size = string_char_length (s);
969   Charcount max = size;
970   Bytecount bcmax = string_length (s);
971   struct gcpro gcpro1, gcpro2;
972   GCPRO2 (obj, printcharfun);
973
974   if (INTP (Vprint_string_length) &&
975       XINT (Vprint_string_length) < max)
976     {
977       max = XINT (Vprint_string_length);
978       bcmax = charcount_to_bytecount (string_data (s), max);
979     }
980   if (max < 0)
981     {
982       max = 0;
983       bcmax = 0;
984     }
985
986   if (!escapeflag)
987     {
988       /* This deals with GC-relocation and Mule. */
989       output_string (printcharfun, 0, obj, 0, bcmax);
990       if (max < size)
991         write_c_string (" ...", printcharfun);
992     }
993   else
994     {
995       Bytecount i, last = 0;
996
997       write_char_internal ("\"", printcharfun);
998       for (i = 0; i < bcmax; i++)
999         {
1000           Bufbyte ch = string_byte (s, i);
1001           if (ch == '\"' || ch == '\\'
1002               || (ch == '\n' && print_escape_newlines))
1003             {
1004               if (i > last)
1005                 {
1006                   output_string (printcharfun, 0, obj, last,
1007                                  i - last);
1008                 }
1009               if (ch == '\n')
1010                 {
1011                   write_c_string ("\\n", printcharfun);
1012                 }
1013               else
1014                 {
1015                   write_char_internal ("\\", printcharfun);
1016                   /* This is correct for Mule because the
1017                      character is either \ or " */
1018                   write_char_internal (string_data (s) + i, printcharfun);
1019                 }
1020               last = i + 1;
1021             }
1022         }
1023       if (bcmax > last)
1024         {
1025           output_string (printcharfun, 0, obj, last,
1026                          bcmax - last);
1027         }
1028       if (max < size)
1029         write_c_string (" ...", printcharfun);
1030       write_char_internal ("\"", printcharfun);
1031     }
1032   UNGCPRO;
1033 }
1034
1035 static void
1036 default_object_printer (Lisp_Object obj, Lisp_Object printcharfun,
1037                         int escapeflag)
1038 {
1039   struct lcrecord_header *header =
1040     (struct lcrecord_header *) XPNTR (obj);
1041   char buf[200];
1042
1043   if (print_readably)
1044     error ("printing unreadable object #<%s 0x%x>",
1045            LHEADER_IMPLEMENTATION (&header->lheader)->name,
1046            header->uid);
1047
1048   sprintf (buf, "#<%s 0x%x>",
1049            LHEADER_IMPLEMENTATION (&header->lheader)->name,
1050            header->uid);
1051   write_c_string (buf, printcharfun);
1052 }
1053
1054 void
1055 internal_object_printer (Lisp_Object obj, Lisp_Object printcharfun,
1056                          int escapeflag)
1057 {
1058   char buf[200];
1059   sprintf (buf, "#<INTERNAL OBJECT (XEmacs bug?) (%s) 0x%lx>",
1060            XRECORD_LHEADER_IMPLEMENTATION (obj)->name,
1061            (unsigned long) XPNTR (obj));
1062   write_c_string (buf, printcharfun);
1063 }
1064
1065 void
1066 print_internal (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
1067 {
1068   /* This function can GC */
1069
1070   QUIT;
1071
1072   /* Emacs won't print while GCing, but an external debugger might */
1073   if (gc_in_progress) return;
1074
1075 #ifdef I18N3
1076   /* #### Both input and output streams should have a flag associated
1077      with them indicating whether output to that stream, or strings
1078      read from the stream, get translated using Fgettext().  Such a
1079      stream is called a "translating stream".  For the minibuffer and
1080      external-debugging-output this is always true on output, and
1081      with-output-to-temp-buffer sets the flag to true for the buffer
1082      it creates.  This flag should also be user-settable.  Perhaps it
1083      should be split up into two flags, one for input and one for
1084      output. */
1085 #endif
1086
1087   /* Detect circularities and truncate them.
1088      No need to offer any alternative--this is better than an error.  */
1089   if (CONSP (obj) || VECTORP (obj) || COMPILED_FUNCTIONP (obj))
1090     {
1091       int i;
1092       for (i = 0; i < print_depth; i++)
1093         if (EQ (obj, being_printed[i]))
1094           {
1095             char buf[32];
1096             *buf = '#';
1097             long_to_string (buf + 1, i);
1098             write_c_string (buf, printcharfun);
1099             return;
1100           }
1101     }
1102
1103   being_printed[print_depth] = obj;
1104   print_depth++;
1105
1106   if (print_depth > PRINT_CIRCLE)
1107     error ("Apparently circular structure being printed");
1108
1109   switch (XTYPE (obj))
1110     {
1111     case Lisp_Type_Int_Even:
1112     case Lisp_Type_Int_Odd:
1113       {
1114         char buf[24];
1115         long_to_string (buf, XINT (obj));
1116         write_c_string (buf, printcharfun);
1117         break;
1118       }
1119
1120     case Lisp_Type_Char:
1121       {
1122         /* God intended that this be #\..., you know. */
1123         char buf[16];
1124         Emchar ch = XCHAR (obj);
1125         char *p = buf;
1126         *p++ = '?';
1127         if (ch == '\n')
1128           *p++ = '\\', *p++ = 'n';
1129         else if (ch == '\r')
1130           *p++ = '\\', *p++ = 'r';
1131         else if (ch == '\t')
1132           *p++ = '\\', *p++ = 't';
1133         else if (ch < 32)
1134           {
1135             *p++ = '\\', *p++ = '^';
1136             *p++ = ch + 64;
1137             if ((ch + 64) == '\\')
1138               *p++ = '\\';
1139           }
1140         else if (ch == 127)
1141           *p++ = '\\', *p++ = '^', *p++ = '?';
1142         else if (ch >= 128 && ch < 160)
1143           {
1144             *p++ = '\\', *p++ = '^';
1145             p += set_charptr_emchar ((Bufbyte *)p, ch + 64);
1146           }
1147         else if (ch < 127
1148                  && !isdigit (ch)
1149                  && !isalpha (ch)
1150                  && ch != '^') /* must not backslash this or it will
1151                                   be interpreted as the start of a
1152                                   control char */
1153           *p++ = '\\', *p++ = ch;
1154         else
1155           p += set_charptr_emchar ((Bufbyte *)p, ch);
1156         output_string (printcharfun, (Bufbyte *)buf, Qnil, 0, p - buf);
1157         break;
1158       }
1159
1160     case Lisp_Type_Record:
1161       {
1162         struct lrecord_header *lheader = XRECORD_LHEADER (obj);
1163         struct gcpro gcpro1, gcpro2;
1164
1165         if (CONSP (obj) || VECTORP(obj))
1166           {
1167             /* If deeper than spec'd depth, print placeholder.  */
1168             if (INTP (Vprint_level)
1169                 && print_depth > XINT (Vprint_level))
1170               {
1171                 GCPRO2 (obj, printcharfun);
1172                 write_c_string ("...", printcharfun);
1173                 UNGCPRO;
1174                 break;
1175               }
1176           }
1177
1178         GCPRO2 (obj, printcharfun);
1179         if (LHEADER_IMPLEMENTATION (lheader)->printer)
1180           ((LHEADER_IMPLEMENTATION (lheader)->printer)
1181            (obj, printcharfun, escapeflag));
1182         else
1183           default_object_printer (obj, printcharfun, escapeflag);
1184         UNGCPRO;
1185         break;
1186       }
1187
1188     default:
1189       {
1190 #ifdef ERROR_CHECK_TYPECHECK
1191         abort ();
1192 #else  /* not ERROR_CHECK_TYPECHECK */
1193         char buf[128];
1194         /* We're in trouble if this happens! */
1195         if (print_readably)
1196           error ("printing illegal data type #o%03o",
1197                  (int) XTYPE (obj));
1198         write_c_string ("#<EMACS BUG: ILLEGAL DATATYPE ",
1199                         printcharfun);
1200         sprintf (buf, "(#o%3o)", (int) XTYPE (obj));
1201         write_c_string (buf, printcharfun);
1202         write_c_string
1203           (" Save your buffers immediately and please report this bug>",
1204            printcharfun);
1205 #endif /* not ERROR_CHECK_TYPECHECK */
1206         break;
1207       }
1208     }
1209
1210   print_depth--;
1211 }
1212
1213
1214 #ifdef LISP_FLOAT_TYPE
1215 void
1216 print_float (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
1217 {
1218   char pigbuf[350];     /* see comments in float_to_string */
1219
1220   float_to_string (pigbuf, XFLOAT_DATA (obj));
1221   write_c_string (pigbuf, printcharfun);
1222 }
1223 #endif /* LISP_FLOAT_TYPE */
1224
1225 void
1226 print_symbol (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
1227 {
1228   /* This function can GC */
1229   /* #### Bug!! (intern "") isn't printed in some distinguished way */
1230   /* ####  (the reader also loses on it) */
1231   struct Lisp_String *name = symbol_name (XSYMBOL (obj));
1232   Bytecount size = string_length (name);
1233   struct gcpro gcpro1, gcpro2;
1234
1235   if (!escapeflag)
1236     {
1237       /* This deals with GC-relocation */
1238       Lisp_Object nameobj;
1239       XSETSTRING (nameobj, name);
1240       output_string (printcharfun, 0, nameobj, 0, size);
1241       return;
1242     }
1243   GCPRO2 (obj, printcharfun);
1244
1245   /* If we print an uninterned symbol as part of a complex object and
1246      the flag print-gensym is non-nil, prefix it with #n= to read the
1247      object back with the #n# reader syntax later if needed.  */
1248   if (!NILP (Vprint_gensym)
1249       /* #### Test whether this produces a noticable slow-down for
1250          printing when print-gensym is non-nil.  */
1251       && !EQ (obj, oblookup (Vobarray,
1252                              string_data (symbol_name (XSYMBOL (obj))),
1253                              string_length (symbol_name (XSYMBOL (obj))))))
1254     {
1255       if (print_depth > 1)
1256         {
1257           Lisp_Object tem = Fassq (obj, Vprint_gensym_alist);
1258           if (CONSP (tem))
1259             {
1260               write_char_internal ("#", printcharfun);
1261               print_internal (XCDR (tem), printcharfun, escapeflag);
1262               write_char_internal ("#", printcharfun);
1263               return;
1264             }
1265           else
1266             {
1267               if (CONSP (Vprint_gensym_alist))
1268                 {
1269                   /* Vprint_gensym_alist is exposed to Lisp, so we
1270                      have to be careful.  */
1271                   CHECK_CONS (XCAR (Vprint_gensym_alist));
1272                   CHECK_INT (XCDR (XCAR (Vprint_gensym_alist)));
1273                   XSETINT (tem, XINT (XCDR (XCAR (Vprint_gensym_alist))) + 1);
1274                 }
1275               else
1276                 XSETINT (tem, 1);
1277               Vprint_gensym_alist = Fcons (Fcons (obj, tem), Vprint_gensym_alist);
1278
1279               write_char_internal ("#", printcharfun);
1280               print_internal (tem, printcharfun, escapeflag);
1281               write_char_internal ("=", printcharfun);
1282             }
1283         }
1284       write_c_string ("#:", printcharfun);
1285     }
1286
1287   /* Does it look like an integer or a float? */
1288   {
1289     Bufbyte *data = string_data (name);
1290     Bytecount confusing = 0;
1291
1292     if (size == 0)
1293       goto not_yet_confused;    /* Really confusing */
1294     else if (isdigit (data[0]))
1295       confusing = 0;
1296     else if (size == 1)
1297       goto not_yet_confused;
1298     else if (data[0] == '-' || data[0] == '+')
1299       confusing = 1;
1300     else
1301       goto not_yet_confused;
1302
1303     for (; confusing < size; confusing++)
1304       {
1305         if (!isdigit (data[confusing]))
1306           {
1307             confusing = 0;
1308             break;
1309           }
1310       }
1311   not_yet_confused:
1312
1313 #ifdef LISP_FLOAT_TYPE
1314     if (!confusing)
1315       /* #### Ugh, this is needlessly complex and slow for what we
1316          need here.  It might be a good idea to copy equivalent code
1317          from FSF.  --hniksic */
1318       confusing = isfloat_string ((char *) data);
1319 #endif
1320     if (confusing)
1321       write_char_internal ("\\", printcharfun);
1322   }
1323
1324   {
1325     Lisp_Object nameobj;
1326     Bytecount i;
1327     Bytecount last = 0;
1328
1329     XSETSTRING (nameobj, name);
1330     for (i = 0; i < size; i++)
1331       {
1332         switch (string_byte (name, i))
1333           {
1334           case  0: case  1: case  2: case  3:
1335           case  4: case  5: case  6: case  7:
1336           case  8: case  9: case 10: case 11:
1337           case 12: case 13: case 14: case 15:
1338           case 16: case 17: case 18: case 19:
1339           case 20: case 21: case 22: case 23:
1340           case 24: case 25: case 26: case 27:
1341           case 28: case 29: case 30: case 31:
1342           case ' ': case '\"': case '\\': case '\'':
1343           case ';': case '#' : case '(' : case ')':
1344           case ',': case '.' : case '`' :
1345           case '[': case ']' : case '?' :
1346             if (i > last)
1347               output_string (printcharfun, 0, nameobj, last, i - last);
1348             write_char_internal ("\\", printcharfun);
1349             last = i;
1350           }
1351       }
1352     output_string (printcharfun, 0, nameobj, last, size - last);
1353   }
1354   UNGCPRO;
1355 }
1356 \f
1357 /* #ifdef DEBUG_XEMACS */
1358
1359 /* I don't like seeing `Note: Strange doc (not fboundp) for function
1360    alternate-debugging-output @ 429542' -slb */
1361 /* #### Eek!  Any clue how to get rid of it?  In fact, how about
1362    getting rid of this function altogether?  Does anything actually
1363    *use* it?  --hniksic */
1364
1365 int alternate_do_pointer;
1366 char alternate_do_string[5000];
1367
1368 DEFUN ("alternate-debugging-output", Falternate_debugging_output, 1, 1, 0, /*
1369 Append CHARACTER to the array `alternate_do_string'.
1370 This can be used in place of `external-debugging-output' as a function
1371 to be passed to `print'.  Before calling `print', set `alternate_do_pointer'
1372 to 0.
1373 */
1374        (character))
1375 {
1376   Bufbyte str[MAX_EMCHAR_LEN];
1377   Bytecount len;
1378   int extlen;
1379   CONST Extbyte *extptr;
1380
1381   CHECK_CHAR_COERCE_INT (character);
1382   len = set_charptr_emchar (str, XCHAR (character));
1383   GET_CHARPTR_EXT_DATA_ALLOCA (str, len, FORMAT_TERMINAL, extptr, extlen);
1384   memcpy (alternate_do_string + alternate_do_pointer, extptr, extlen);
1385   alternate_do_pointer += extlen;
1386   alternate_do_string[alternate_do_pointer] = 0;
1387   return character;
1388 }
1389 /* #endif / * DEBUG_XEMACS */
1390
1391 DEFUN ("external-debugging-output", Fexternal_debugging_output, 1, 3, 0, /*
1392 Write CHAR-OR-STRING to stderr or stdout.
1393 If optional arg STDOUT-P is non-nil, write to stdout; otherwise, write
1394 to stderr.  You can use this function to write directly to the terminal.
1395 This function can be used as the STREAM argument of Fprint() or the like.
1396
1397 If you have opened a termscript file (using `open-termscript'), then
1398 the output also will be logged to this file.
1399 */
1400        (char_or_string, stdout_p, device))
1401 {
1402   FILE *file = 0;
1403   struct console *con = 0;
1404
1405   if (NILP (device))
1406     {
1407       if (!NILP (stdout_p))
1408         file = stdout;
1409       else
1410         file = stderr;
1411     }
1412   else
1413     {
1414       CHECK_LIVE_DEVICE (device);
1415       if (!DEVICE_TTY_P (XDEVICE (device)) &&
1416           !DEVICE_STREAM_P (XDEVICE (device)))
1417         signal_simple_error ("Must be tty or stream device", device);
1418       con = XCONSOLE (DEVICE_CONSOLE (XDEVICE (device)));
1419       if (DEVICE_TTY_P (XDEVICE (device)))
1420         file = 0;
1421       else if (!NILP (stdout_p))
1422         file = CONSOLE_STREAM_DATA (con)->out;
1423       else
1424         file = CONSOLE_STREAM_DATA (con)->err;
1425     }
1426
1427   if (STRINGP (char_or_string))
1428     write_string_to_stdio_stream (file, con,
1429                                   XSTRING_DATA (char_or_string),
1430                                   0, XSTRING_LENGTH (char_or_string),
1431                                   FORMAT_TERMINAL);
1432   else
1433     {
1434       Bufbyte str[MAX_EMCHAR_LEN];
1435       Bytecount len;
1436
1437       CHECK_CHAR_COERCE_INT (char_or_string);
1438       len = set_charptr_emchar (str, XCHAR (char_or_string));
1439       write_string_to_stdio_stream (file, con, str, 0, len, FORMAT_TERMINAL);
1440     }
1441
1442   return char_or_string;
1443 }
1444
1445 DEFUN ("open-termscript", Fopen_termscript, 1, 1, "FOpen termscript file: ", /*
1446 Start writing all terminal output to FILE as well as the terminal.
1447 FILE = nil means just close any termscript file currently open.
1448 */
1449        (file))
1450 {
1451   /* This function can GC */
1452   if (termscript != 0)
1453     fclose (termscript);
1454   termscript = 0;
1455
1456   if (! NILP (file))
1457     {
1458       file = Fexpand_file_name (file, Qnil);
1459       termscript = fopen ((char *) XSTRING_DATA (file), "w");
1460       if (termscript == NULL)
1461         report_file_error ("Opening termscript", list1 (file));
1462     }
1463   return Qnil;
1464 }
1465
1466 #if 1
1467 /* Debugging kludge -- unbuffered */
1468 static int debug_print_length = 50;
1469 static int debug_print_level = 15;
1470 Lisp_Object debug_temp;
1471
1472 static void
1473 debug_print_no_newline (Lisp_Object debug_print_obj)
1474 {
1475   /* This function can GC */
1476   int old_print_readably = print_readably;
1477   int old_print_depth = print_depth;
1478   Lisp_Object old_print_length = Vprint_length;
1479   Lisp_Object old_print_level = Vprint_level;
1480   Lisp_Object old_inhibit_quit = Vinhibit_quit;
1481   struct gcpro gcpro1, gcpro2, gcpro3;
1482   GCPRO3 (old_print_level, old_print_length, old_inhibit_quit);
1483
1484   if (gc_in_progress)
1485     stderr_out ("** gc-in-progress!  Bad idea to print anything! **\n");
1486
1487   print_depth = 0;
1488   print_readably = 0;
1489   print_unbuffered++;
1490   /* Could use unwind-protect, but why bother? */
1491   if (debug_print_length > 0)
1492     Vprint_length = make_int (debug_print_length);
1493   if (debug_print_level > 0)
1494     Vprint_level = make_int (debug_print_level);
1495   print_internal (debug_print_obj, Qexternal_debugging_output, 1);
1496   Vinhibit_quit = old_inhibit_quit;
1497   Vprint_level = old_print_level;
1498   Vprint_length = old_print_length;
1499   print_depth = old_print_depth;
1500   print_readably = old_print_readably;
1501   print_unbuffered--;
1502   UNGCPRO;
1503 }
1504
1505 void
1506 debug_print (Lisp_Object debug_print_obj)
1507 {
1508   debug_print_no_newline (debug_print_obj);
1509   stderr_out ("\n");
1510   fflush (stderr);
1511 }
1512
1513 /* Debugging kludge -- unbuffered */
1514 /* This function provided for the benefit of the debugger.  */
1515 void debug_backtrace (void);
1516 void
1517 debug_backtrace (void)
1518 {
1519   /* This function can GC */
1520   int         old_print_readably = print_readably;
1521   int         old_print_depth    = print_depth;
1522   Lisp_Object old_print_length   = Vprint_length;
1523   Lisp_Object old_print_level    = Vprint_level;
1524   Lisp_Object old_inhibit_quit   = Vinhibit_quit;
1525
1526   struct gcpro gcpro1, gcpro2, gcpro3;
1527   GCPRO3 (old_print_level, old_print_length, old_inhibit_quit);
1528
1529   if (gc_in_progress)
1530     stderr_out ("** gc-in-progress!  Bad idea to print anything! **\n");
1531
1532   print_depth = 0;
1533   print_readably = 0;
1534   print_unbuffered++;
1535   /* Could use unwind-protect, but why bother? */
1536   if (debug_print_length > 0)
1537     Vprint_length = make_int (debug_print_length);
1538   if (debug_print_level > 0)
1539     Vprint_level = make_int (debug_print_level);
1540
1541   Fbacktrace (Qexternal_debugging_output, Qt);
1542   stderr_out ("\n");
1543   fflush (stderr);
1544
1545   Vinhibit_quit  = old_inhibit_quit;
1546   Vprint_level   = old_print_level;
1547   Vprint_length  = old_print_length;
1548   print_depth    = old_print_depth;
1549   print_readably = old_print_readably;
1550   print_unbuffered--;
1551
1552   UNGCPRO;
1553 }
1554
1555 void
1556 debug_short_backtrace (int length)
1557 {
1558   int first = 1;
1559   struct backtrace *bt = backtrace_list;
1560   stderr_out ("   [");
1561   fflush (stderr);
1562   while (length > 0 && bt)
1563     {
1564       if (!first)
1565         {
1566           stderr_out (", ");
1567           fflush (stderr);
1568         }
1569       if (COMPILED_FUNCTIONP (*bt->function))
1570         {
1571 #if defined(COMPILED_FUNCTION_ANNOTATION_HACK)
1572           Lisp_Object ann =
1573             compiled_function_annotation (XCOMPILED_FUNCTION (*bt->function));
1574 #else
1575           Lisp_Object ann = Qnil;
1576 #endif
1577           if (!NILP (ann))
1578             {
1579               stderr_out ("<compiled-function from ");
1580               fflush (stderr);
1581               debug_print_no_newline (ann);
1582               stderr_out (">");
1583               fflush (stderr);
1584             }
1585           else
1586             {
1587               stderr_out ("<compiled-function of unknown origin>");
1588               fflush (stderr);
1589             }
1590         }
1591       else
1592         debug_print_no_newline (*bt->function);
1593       first = 0;
1594       length--;
1595       bt = bt->next;
1596     }
1597   stderr_out ("]\n");
1598   fflush (stderr);
1599 }
1600
1601 #endif /* debugging kludge */
1602
1603 \f
1604 void
1605 syms_of_print (void)
1606 {
1607   defsymbol (&Qprint_escape_newlines, "print-escape-newlines");
1608   defsymbol (&Qprint_readably, "print-readably");
1609
1610   defsymbol (&Qstandard_output, "standard-output");
1611
1612 #ifdef LISP_FLOAT_TYPE
1613   defsymbol (&Qfloat_output_format, "float-output-format");
1614 #endif
1615
1616   defsymbol (&Qprint_length, "print-length");
1617
1618   defsymbol (&Qprint_string_length, "print-string-length");
1619
1620   defsymbol (&Qdisplay_error, "display-error");
1621   defsymbol (&Qprint_message_label, "print-message-label");
1622
1623   DEFSUBR (Fprin1);
1624   DEFSUBR (Fprin1_to_string);
1625   DEFSUBR (Fprinc);
1626   DEFSUBR (Fprint);
1627   DEFSUBR (Ferror_message_string);
1628   DEFSUBR (Fdisplay_error);
1629   DEFSUBR (Fterpri);
1630   DEFSUBR (Fwrite_char);
1631   DEFSUBR (Falternate_debugging_output);
1632   defsymbol (&Qalternate_debugging_output, "alternate-debugging-output");
1633   DEFSUBR (Fexternal_debugging_output);
1634   DEFSUBR (Fopen_termscript);
1635   defsymbol (&Qexternal_debugging_output, "external-debugging-output");
1636   DEFSUBR (Fwith_output_to_temp_buffer);
1637 }
1638
1639 void
1640 vars_of_print (void)
1641 {
1642   alternate_do_pointer = 0;
1643
1644   DEFVAR_LISP ("standard-output", &Vstandard_output /*
1645 Output stream `print' uses by default for outputting a character.
1646 This may be any function of one argument.
1647 It may also be a buffer (output is inserted before point)
1648 or a marker (output is inserted and the marker is advanced)
1649 or the symbol t (output appears in the minibuffer line).
1650 */ );
1651   Vstandard_output = Qt;
1652
1653 #ifdef LISP_FLOAT_TYPE
1654   DEFVAR_LISP ("float-output-format", &Vfloat_output_format /*
1655 The format descriptor string that lisp uses to print floats.
1656 This is a %-spec like those accepted by `printf' in C,
1657 but with some restrictions.  It must start with the two characters `%.'.
1658 After that comes an integer precision specification,
1659 and then a letter which controls the format.
1660 The letters allowed are `e', `f' and `g'.
1661 Use `e' for exponential notation "DIG.DIGITSeEXPT"
1662 Use `f' for decimal point notation "DIGITS.DIGITS".
1663 Use `g' to choose the shorter of those two formats for the number at hand.
1664 The precision in any of these cases is the number of digits following
1665 the decimal point.  With `f', a precision of 0 means to omit the
1666 decimal point.  0 is not allowed with `f' or `g'.
1667
1668 A value of nil means to use `%.16g'.
1669
1670 Regardless of the value of `float-output-format', a floating point number
1671 will never be printed in such a way that it is ambiguous with an integer;
1672 that is, a floating-point number will always be printed with a decimal
1673 point and/or an exponent, even if the digits following the decimal point
1674 are all zero.  This is to preserve read-equivalence.
1675 */ );
1676   Vfloat_output_format = Qnil;
1677 #endif /* LISP_FLOAT_TYPE */
1678
1679   DEFVAR_LISP ("print-length", &Vprint_length /*
1680 Maximum length of list or vector to print before abbreviating.
1681 A value of nil means no limit.
1682 */ );
1683   Vprint_length = Qnil;
1684
1685   DEFVAR_LISP ("print-string-length", &Vprint_string_length /*
1686 Maximum length of string to print before abbreviating.
1687 A value of nil means no limit.
1688 */ );
1689   Vprint_string_length = Qnil;
1690
1691   DEFVAR_LISP ("print-level", &Vprint_level /*
1692 Maximum depth of list nesting to print before abbreviating.
1693 A value of nil means no limit.
1694 */ );
1695   Vprint_level = Qnil;
1696
1697   DEFVAR_BOOL ("print-escape-newlines", &print_escape_newlines /*
1698 Non-nil means print newlines in strings as backslash-n.
1699 */ );
1700   print_escape_newlines = 0;
1701
1702   DEFVAR_BOOL ("print-readably", &print_readably /*
1703 If non-nil, then all objects will be printed in a readable form.
1704 If an object has no readable representation, then an error is signalled.
1705 When print-readably is true, compiled-function objects will be written in
1706  #[...] form instead of in #<compiled-function [...]> form, and two-element
1707  lists of the form (quote object) will be written as the equivalent 'object.
1708 Do not SET this variable; bind it instead.
1709 */ );
1710   print_readably = 0;
1711
1712   /* #### I think this should default to t.  But we'd better wait
1713      until we see that it works out.  */
1714   DEFVAR_LISP ("print-gensym", &Vprint_gensym /*
1715 If non-nil, then uninterned symbols will be printed specially.
1716 Uninterned symbols are those which are not present in `obarray', that is,
1717 those which were made with `make-symbol' or by calling `intern' with a
1718 second argument.
1719
1720 When print-gensym is true, such symbols will be preceded by "#:",
1721 which causes the reader to create a new symbol instead of interning
1722 and returning an existing one.  Beware: the #: syntax creates a new
1723 symbol each time it is seen, so if you print an object which contains
1724 two pointers to the same uninterned symbol, `read' will not duplicate
1725 that structure.
1726
1727 If the value of `print-gensym' is a cons cell, then in addition
1728 refrain from clearing `print-gensym-alist' on entry to and exit from
1729 printing functions, so that the use of #...# and #...= can carry over
1730 for several separately printed objects.
1731 */ );
1732   Vprint_gensym = Qnil;
1733
1734   DEFVAR_LISP ("print-gensym-alist", &Vprint_gensym_alist /*
1735 Association list of elements (GENSYM . N) to guide use of #N# and #N=.
1736 In each element, GENSYM is an uninterned symbol that has been associated
1737 with #N= for the specified value of N.
1738 */ );
1739   Vprint_gensym_alist = Qnil;
1740
1741   DEFVAR_LISP ("print-message-label", &Vprint_message_label /*
1742 Label for minibuffer messages created with `print'.  This should
1743 generally be bound with `let' rather than set.  (See `display-message'.)
1744 */ );
1745   Vprint_message_label = Qprint;
1746 }