1 /* Lisp object printing and output streams.
2 Copyright (C) 1985, 1986, 1988, 1992-1995 Free Software Foundation, Inc.
3 Copyright (C) 1995, 1996, 2000, 2002 Ben Wing.
5 This file is part of SXEmacs
7 SXEmacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 SXEmacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 /* Synched up with: Not synched with FSF. */
23 /* This file has been Mule-ized. */
25 /* Seriously hacked on by Ben Wing for Mule. */
30 #include "backtrace.h"
33 #include "ui/TTY/console-tty.h" /* for stuff in
34 write_string_to_stdio_stream. Needs
36 #include "ui/console-stream.h"
39 #include "ui/insdel.h"
44 /* Define if not in float.h */
49 Lisp_Object Vstandard_output, Qstandard_output;
51 /* The subroutine object for external-debugging-output is kept here
52 for the convenience of the debugger. */
53 Lisp_Object Qexternal_debugging_output, Qalternate_debugging_output;
55 /* Avoid actual stack overflow in print. */
56 static int print_depth;
58 /* Detect most circularities to print finite output. */
59 #define PRINT_CIRCLE 200
60 static Lisp_Object being_printed[PRINT_CIRCLE];
62 /* Maximum length of list or vector to print in full; noninteger means
63 effectively infinity */
65 Lisp_Object Vprint_length;
66 Lisp_Object Qprint_length;
68 /* Maximum length of string to print in full; noninteger means
69 effectively infinity */
71 Lisp_Object Vprint_string_length;
72 Lisp_Object Qprint_string_length;
74 /* Maximum depth of list to print in full; noninteger means
75 effectively infinity. */
77 Lisp_Object Vprint_level;
79 /* Label to use when making echo-area messages. */
81 Lisp_Object Vprint_message_label;
83 /* Nonzero means print newlines in strings as \n. */
85 int print_escape_newlines;
88 /* Non-nil means print #: before uninterned symbols.
89 Neither t nor nil means so that and don't clear Vprint_gensym_alist
90 on entry to and exit from print functions. */
91 Lisp_Object Vprint_gensym;
92 Lisp_Object Vprint_gensym_alist;
94 Lisp_Object Qdisplay_error;
95 Lisp_Object Qprint_message_label;
97 Lisp_Object Vcustom_object_printer;
99 /* Force immediate output of all printed data. Used for debugging. */
100 int print_unbuffered;
102 FILE *termscript; /* Stdio stream being used for copy of all output. */
104 int stdout_needs_newline;
107 std_handle_out_external(FILE * stream, Lisp_Object lstream,
108 const Extbyte * extptr, Extcount extlen,
109 /* is this really stdout/stderr?
110 (controls termscript writing) */
111 int output_is_std_handle, int must_flush)
113 assert(extptr != NULL);
116 stdout_needs_newline = 1;
121 fwrite(extptr, 1, extlen, stream);
126 Lstream_write(XLSTREAM(lstream), extptr, extlen);
128 if (output_is_std_handle) {
130 fwrite(extptr, 1, extlen, termscript);
133 stdout_needs_newline = extlen ? (extptr[extlen - 1] != '\n') : 1;
137 /* #### The following function should be replaced a call to the
138 emacs_doprnt_*() functions. This is the only way to ensure that
139 I18N3 works properly (many implementations of the *printf()
140 functions, including the ones included in glibc, do not implement
141 the %###$ argument-positioning syntax).
143 Note, however, that to do this, we'd have to
145 1) pre-allocate all the lstreams and do whatever else was necessary
146 to make sure that no allocation occurs, since these functions may be
147 called from fatal_error_signal().
149 2) (to be really correct) make a new lstream that outputs using
150 mswindows_output_console_string(). */
152 static int std_handle_out_va(FILE * stream, const char *fmt, va_list args)
154 Bufbyte buffer[16384],
156 Extbyte *extptr = NULL;
159 bufsize = sizeof(buffer),
161 int speccount = specpdl_depth();
165 retval = vsnprintf((char *)kludge, bufsize, fmt, args);
167 /* Nothing to write!! */
169 } else if ( retval < 0 ) {
171 XMALLOC_UNBIND(kludge, bufsize, speccount);
172 XMALLOC_OR_ALLOCA(kludge,bufsize,Bufbyte);
174 } else if ( retval > bufsize ) {
175 /* We need more space, so we need to allocate it
177 bufsize = retval + 1;
178 XMALLOC_OR_ALLOCA(kludge,bufsize,Bufbyte);
181 } while( retval == 0 );
185 if (initialized && !inhibit_non_essential_printing_operations &&
186 ! fatal_error_in_progress ) {
187 TO_EXTERNAL_FORMAT(DATA, (kludge, strlen((char *)kludge)),
188 ALLOCA, (extptr, extlen), Qnative);
189 std_handle_out_external(stream, Qnil, extptr, extlen, 1, 1);
190 } else if (fatal_error_in_progress || !inhibit_non_essential_printing_operations)
191 fprintf(stream,"%s",(char*)kludge);
192 XMALLOC_UNBIND(kludge, bufsize, speccount);
196 /* Output portably to stderr or its equivalent; call GETTEXT on the
197 format string. Automatically flush when done. */
199 int stderr_out(const char *fmt, ...)
207 && !fatal_error_in_progress ? GETTEXT(fmt) : fmt, args);
212 /* Output portably to stdout or its equivalent; call GETTEXT on the
213 format string. Automatically flush when done. */
215 int stdout_out(const char *fmt, ...)
223 && !fatal_error_in_progress ? GETTEXT(fmt) : fmt, args);
228 DOESNT_RETURN fatal(const char *fmt, ...)
233 stderr_out("\nSXEmacs: ");
234 std_handle_out_va(stderr, GETTEXT(fmt), args);
241 /* Write a string (in internal format) to stdio stream STREAM. */
244 write_string_to_stdio_stream(FILE * stream, struct console *con,
246 Bytecount offset, Bytecount len,
247 Lisp_Object coding_system, int must_flush)
250 const Extbyte *extptr;
252 /* #### yuck! sometimes this function is called with string data,
253 and the following call may gc. */
255 Bufbyte *puta = (Bufbyte *) alloca(len);
256 memcpy(puta, str + offset, len);
258 if (initialized && !inhibit_non_essential_printing_operations)
259 TO_EXTERNAL_FORMAT(DATA, (puta, len),
260 ALLOCA, (extptr, extlen),
263 extptr = (Extbyte *) puta;
264 extlen = (Bytecount) len;
269 std_handle_out_external(stream, Qnil, extptr, extlen,
271 || stream == stderr, must_flush);
273 assert(CONSOLE_TTY_P(con));
274 std_handle_out_external(0, CONSOLE_TTY_DATA(con)->outstream,
276 CONSOLE_TTY_DATA(con)->is_stdio,
281 /* Write a string to the output location specified in FUNCTION.
282 Arguments NONRELOC, RELOC, OFFSET, and LEN are as in
283 buffer_insert_string_1() in insdel.c. */
286 output_string(Lisp_Object function, const Bufbyte * nonreloc,
287 Lisp_Object reloc, Bytecount offset, Bytecount len)
289 /* This function can GC */
291 /* We change the value of nonreloc (fetching it from reloc as
292 necessary), but we don't want to pass this changed value on to
293 other functions that take both a nonreloc and a reloc, or things
294 may get confused and an assertion failure in
295 fixup_internal_substring() may get triggered. */
296 const Bufbyte *newnonreloc = nonreloc;
297 struct gcpro gcpro1, gcpro2;
299 /* Emacs won't print while GCing, but an external debugger might */
303 /* Perhaps not necessary but probably safer. */
304 GCPRO2(function, reloc);
306 fixup_internal_substring(newnonreloc, reloc, offset, &len);
309 newnonreloc = XSTRING_DATA(reloc);
311 cclen = bytecount_to_charcount(newnonreloc + offset, len);
313 if (LSTREAMP(function)) {
314 if (STRINGP(reloc)) {
315 /* Protect against Lstream_write() causing a GC and
316 relocating the string. For small strings, we do it by
317 alloc'ing the string and using a copy; for large strings,
320 Bufbyte *copied = alloca_array(Bufbyte, len);
321 memcpy(copied, newnonreloc + offset, len);
322 Lstream_write(XLSTREAM(function), copied, len);
324 int speccount = specpdl_depth();
325 record_unwind_protect(restore_gc_inhibit,
327 (gc_currently_forbidden));
328 gc_currently_forbidden = 1;
329 Lstream_write(XLSTREAM(function),
330 newnonreloc + offset, len);
331 unbind_to(speccount, Qnil);
334 Lstream_write(XLSTREAM(function), newnonreloc + offset,
337 if (print_unbuffered)
338 Lstream_flush(XLSTREAM(function));
339 } else if (BUFFERP(function)) {
340 CHECK_LIVE_BUFFER(function);
341 buffer_insert_string(XBUFFER(function), nonreloc, reloc, offset,
343 } else if (MARKERP(function)) {
344 /* marker_position() will err if marker doesn't point anywhere. */
345 Bufpos spoint = marker_position(function);
347 buffer_insert_string_1(XMARKER(function)->buffer,
348 spoint, nonreloc, reloc, offset, len, 0);
349 Fset_marker(function, make_int(spoint + cclen),
350 Fmarker_buffer(function));
351 } else if (FRAMEP(function)) {
352 /* This gets used by functions not invoking print_prepare(),
353 such as Fwrite_char, Fterpri, etc.. */
354 struct frame *f = XFRAME(function);
355 CHECK_LIVE_FRAME(function);
357 if (!EQ(Vprint_message_label, echo_area_status(f)))
358 clear_echo_area_from_print(f, Qnil, 1);
359 echo_area_append(f, nonreloc, reloc, offset, len,
360 Vprint_message_label);
361 } else if (EQ(function, Qt) || EQ(function, Qnil)) {
362 write_string_to_stdio_stream(stdout, 0, newnonreloc, offset,
363 len, Qterminal, print_unbuffered);
365 Charcount ccoff = bytecount_to_charcount(newnonreloc, offset);
368 for (iii = ccoff; iii < cclen + ccoff; iii++) {
370 make_char(charptr_emchar_n(newnonreloc, iii)));
372 newnonreloc = XSTRING_DATA(reloc);
379 #define RESET_PRINT_GENSYM do { \
380 if (!CONSP (Vprint_gensym)) \
381 Vprint_gensym_alist = Qnil; \
384 static Lisp_Object canonicalize_printcharfun(Lisp_Object printcharfun)
386 if (NILP(printcharfun))
387 printcharfun = Vstandard_output;
389 if (EQ(printcharfun, Qt) || NILP(printcharfun))
390 printcharfun = Fselected_frame(Qnil); /* print to minibuffer */
396 print_prepare(Lisp_Object printcharfun, Lisp_Object * frame_kludge)
398 /* Emacs won't print while GCing, but an external debugger might */
404 printcharfun = canonicalize_printcharfun(printcharfun);
406 /* Here we could safely return the canonicalized PRINTCHARFUN.
407 However, if PRINTCHARFUN is a frame, printing of complex
408 structures becomes very expensive, because `append-message'
409 (called by echo_area_append) gets called as many times as
410 output_string() is called (and that's a *lot*). append-message
411 tries to keep top of the message-stack in sync with the contents
412 of " *Echo Area" buffer, consing a new string for each component
413 of the printed structure. For instance, if you print (a a),
414 append-message will cons up the following strings:
422 and will use only the last one. With larger objects, this turns
423 into an O(n^2) consing frenzy that locks up SXEmacs in incessant
426 We prevent this by creating a resizing_buffer stream and letting
427 the printer write into it. print_finish() will notice this
428 stream, and invoke echo_area_append() with the stream's buffer,
430 if (FRAMEP(printcharfun)) {
431 CHECK_LIVE_FRAME(printcharfun);
432 *frame_kludge = printcharfun;
433 printcharfun = make_resizing_buffer_output_stream();
439 static void print_finish(Lisp_Object stream, Lisp_Object frame_kludge)
441 /* Emacs won't print while GCing, but an external debugger might */
447 /* See the comment in print_prepare(). */
448 if (FRAMEP(frame_kludge)) {
449 struct frame *f = XFRAME(frame_kludge);
450 Lstream *str = XLSTREAM(stream);
451 CHECK_LIVE_FRAME(frame_kludge);
454 if (!EQ(Vprint_message_label, echo_area_status(f)))
455 clear_echo_area_from_print(f, Qnil, 1);
456 echo_area_append(f, resizing_buffer_stream_ptr(str),
457 Qnil, 0, Lstream_byte_count(str),
458 Vprint_message_label);
463 /* Used for printing a single-byte character (*not* any Emchar). */
464 #define write_char_internal(string_of_length_1, stream) \
465 output_string (stream, (const Bufbyte *) (string_of_length_1), \
468 /* NOTE: Do not call this with the data of a Lisp_String, as
469 printcharfun might cause a GC, which might cause the string's data
470 to be relocated. To princ a Lisp string, use:
472 print_internal (string, printcharfun, 0);
474 Also note that STREAM should be the result of
475 canonicalize_printcharfun() (i.e. Qnil means stdout, not
476 Vstandard_output, etc.) */
477 void write_string_1(const Bufbyte * str, Bytecount size, Lisp_Object stream)
479 /* This function can GC */
480 #ifdef ERROR_CHECK_BUFPOS
483 output_string(stream, str, Qnil, 0, size);
486 void write_c_string(const char *str, Lisp_Object stream)
488 /* This function can GC */
489 write_string_1((const Bufbyte *)str, strlen(str), stream);
492 static void write_fmt_string(Lisp_Object stream, const char *fmt, ...)
498 vsprintf(bigbuf, fmt, va);
500 write_c_string(bigbuf, stream);
503 DEFUN("write-char", Fwrite_char, 1, 2, 0, /*
504 Output character CHARACTER to stream STREAM.
505 STREAM defaults to the value of `standard-output' (which see).
509 /* This function can GC */
510 Bufbyte str[MAX_EMCHAR_LEN];
513 CHECK_CHAR_COERCE_INT(character);
514 len = set_charptr_emchar(str, XCHAR(character));
515 output_string(canonicalize_printcharfun(stream), str, Qnil, 0, len);
519 void temp_output_buffer_setup(Lisp_Object bufname)
521 /* This function can GC */
522 struct buffer *old = current_buffer;
526 /* #### This function should accept a Lisp_Object instead of a char *,
527 so that proper translation on the buffer name can occur. */
530 Fset_buffer(Fget_buffer_create(bufname));
532 current_buffer->read_only = Qnil;
535 XSETBUFFER(buf, current_buffer);
536 specbind(Qstandard_output, buf);
538 set_buffer_internal(old);
542 internal_with_output_to_temp_buffer(Lisp_Object bufname,
543 Lisp_Object(*function) (Lisp_Object arg),
544 Lisp_Object arg, Lisp_Object same_frame)
546 int speccount = specpdl_depth();
547 struct gcpro gcpro1, gcpro2, gcpro3;
548 Lisp_Object buf = Qnil;
550 GCPRO3(buf, arg, same_frame);
552 temp_output_buffer_setup(bufname);
553 buf = Vstandard_output;
555 arg = (*function) (arg);
557 temp_output_buffer_show(buf, same_frame);
560 return unbind_to(speccount, arg);
563 DEFUN("with-output-to-temp-buffer", Fwith_output_to_temp_buffer, 1, UNEVALLED, 0, /*
564 Bind `standard-output' to buffer BUFNAME, eval BODY, then show that buffer.
565 The buffer is cleared out initially, and marked as unmodified when done.
566 All output done by BODY is inserted in that buffer by default.
567 The buffer is displayed in another window, but not selected.
568 The value of the last form in BODY is returned.
569 If BODY does not finish normally, the buffer BUFNAME is not displayed.
571 If variable `temp-buffer-show-function' is non-nil, call it at the end
572 to get the buffer displayed. It gets one argument, the buffer to display.
576 /* This function can GC */
577 Lisp_Object name = Qnil;
578 int speccount = specpdl_depth();
579 struct gcpro gcpro1, gcpro2;
580 Lisp_Object val = Qnil;
583 /* #### should set the buffer to be translating. See print_internal(). */
587 name = Feval(XCAR(args));
591 temp_output_buffer_setup(name);
594 val = Fprogn(XCDR(args));
596 temp_output_buffer_show(Vstandard_output, Qnil);
598 return unbind_to(speccount, val);
601 DEFUN("terpri", Fterpri, 0, 1, 0, /*
602 Output a newline to STREAM.
603 If STREAM is omitted or nil, the value of `standard-output' is used.
607 /* This function can GC */
608 write_char_internal("\n", canonicalize_printcharfun(stream));
612 DEFUN("prin1", Fprin1, 1, 2, 0, /*
613 Output the printed representation of OBJECT, any Lisp object.
614 Quoting characters are printed when needed to make output that `read'
615 can handle, whenever this is possible.
616 Output stream is STREAM, or value of `standard-output' (which see).
620 /* This function can GC */
621 Lisp_Object frame = Qnil;
622 struct gcpro gcpro1, gcpro2;
623 GCPRO2(object, stream);
626 stream = print_prepare(stream, &frame);
627 print_internal(object, stream, 1);
628 print_finish(stream, frame);
634 DEFUN("prin1-to-string", Fprin1_to_string, 1, 2, 0, /*
635 Return a string containing the printed representation of OBJECT,
636 any Lisp object. Quoting characters are used when needed to make output
637 that `read' can handle, whenever this is possible, unless the optional
638 second argument NOESCAPE is non-nil.
642 /* This function can GC */
643 Lisp_Object result = Qnil;
644 Lisp_Object stream = make_resizing_buffer_output_stream();
645 Lstream *str = XLSTREAM(stream);
646 /* gcpro OBJECT in case a caller forgot to do so */
647 struct gcpro gcpro1, gcpro2, gcpro3;
648 GCPRO3(object, stream, result);
652 print_internal(object, stream, NILP(noescape));
656 result = make_string(resizing_buffer_stream_ptr(str),
657 Lstream_byte_count(str));
662 DEFUN("princ", Fprinc, 1, 2, 0, /*
663 Output the printed representation of OBJECT, any Lisp object.
664 No quoting characters are used; no delimiters are printed around
665 the contents of strings.
666 Output stream is STREAM, or value of `standard-output' (which see).
670 /* This function can GC */
671 Lisp_Object frame = Qnil;
672 struct gcpro gcpro1, gcpro2;
674 GCPRO2(object, stream);
675 stream = print_prepare(stream, &frame);
677 print_internal(object, stream, 0);
678 print_finish(stream, frame);
683 DEFUN("print", Fprint, 1, 2, 0, /*
684 Output the printed representation of OBJECT, with newlines around it.
685 Quoting characters are printed when needed to make output that `read'
686 can handle, whenever this is possible.
687 Output stream is STREAM, or value of `standard-output' (which see).
691 /* This function can GC */
692 Lisp_Object frame = Qnil;
693 struct gcpro gcpro1, gcpro2;
695 GCPRO2(object, stream);
696 stream = print_prepare(stream, &frame);
698 write_char_internal("\n", stream);
699 print_internal(object, stream, 1);
700 write_char_internal("\n", stream);
701 print_finish(stream, frame);
706 /* Print an error message for the error DATA to STREAM. This is a
707 complete implementation of `display-error', which used to be in
708 Lisp (see prim/cmdloop.el). It was ported to C so it can be used
709 efficiently by Ferror_message_string. Fdisplay_error and
710 Ferror_message_string are trivial wrappers around this function.
712 STREAM should be the result of canonicalize_printcharfun(). */
714 print_error_message(Lisp_Object error_object, Lisp_Object stream)
716 /* This function can GC */
717 Lisp_Object type = Fcar_safe(error_object);
718 Lisp_Object method = Qnil;
721 /* No need to GCPRO anything under the assumption that ERROR_OBJECT
724 if (!(CONSP(error_object) && SYMBOLP(type))) {
725 Lisp_Object foo = Fget(type, Qerror_conditions, Qnil);
731 tail = XCDR(error_object);
732 while (!NILP(tail)) {
738 tail = Fget(type, Qerror_conditions, Qnil);
739 while (!NILP(tail)) {
740 if (!(CONSP(tail) && SYMBOLP(XCAR(tail))))
742 else if (!NILP(Fget(XCAR(tail), Qdisplay_error, Qnil))) {
743 method = Fget(XCAR(tail), Qdisplay_error, Qnil);
751 int speccount = specpdl_depth();
752 Lisp_Object frame = Qnil;
756 specbind(Qprint_message_label, Qerror);
757 stream = print_prepare(stream, &frame);
759 tail = Fcdr(error_object);
760 if (EQ(type, Qerror)) {
761 print_internal(Fcar(tail), stream, 0);
764 Lisp_Object errmsg = Fget(type, Qerror_message, Qnil);
766 print_internal(type, stream, 0);
768 print_internal(LISP_GETTEXT(errmsg), stream, 0);
770 while (!NILP(tail)) {
771 write_c_string(first ? ": " : ", ", stream);
772 print_internal(Fcar(tail), stream, 1);
776 print_finish(stream, frame);
778 unbind_to(speccount, Qnil);
785 write_c_string(GETTEXT("Peculiar error "), stream);
786 print_internal(error_object, stream, 1);
789 call2(method, error_object, stream);
793 DEFUN("error-message-string", Ferror_message_string, 1, 1, 0, /*
794 Convert ERROR-OBJECT to an error message, and return it.
796 The format of ERROR-OBJECT should be (ERROR-SYMBOL . DATA). The
797 message is equivalent to the one that would be issued by
798 `display-error' with the same argument.
802 /* This function can GC */
803 Lisp_Object result = Qnil;
804 Lisp_Object stream = make_resizing_buffer_output_stream();
808 print_error_message(error_object, stream);
809 Lstream_flush(XLSTREAM(stream));
810 result = make_string(resizing_buffer_stream_ptr(XLSTREAM(stream)),
811 Lstream_byte_count(XLSTREAM(stream)));
812 Lstream_delete(XLSTREAM(stream));
818 DEFUN("display-error", Fdisplay_error, 2, 2, 0, /*
819 Display ERROR-OBJECT on STREAM in a user-friendly way.
821 (error_object, stream))
823 /* This function can GC */
824 print_error_message(error_object, canonicalize_printcharfun(stream));
830 Lisp_Object Vfloat_output_format;
833 * This buffer should be at least as large as the max string size of the
834 * largest float, printed in the biggest notation. This is undoubtedly
835 * 20d float_output_format, with the negative of the C-constant "HUGE"
838 * On the vax the worst case is -1e38 in 20d format which takes 61 bytes.
840 * I assume that IEEE-754 format numbers can take 329 bytes for the worst
841 * case of -1e307 in 20d float_output_format. What is one to do (short of
842 * re-writing _doprnt to be more sane)?
845 void float_to_string(char *buf, fpfloat data)
850 if (NILP(Vfloat_output_format) || !STRINGP(Vfloat_output_format)) {
853 sprintf(buf, "%.16g", data);
854 #elif fpfloat_long_double_p
855 sprintf(buf, "%.16Lg", data);
857 } else { /* oink oink */
859 /* Check that the spec we have is fully valid.
860 This means not only valid for printf,
861 but meant for floats, and reasonable. */
862 cp = XSTRING_DATA(Vfloat_output_format);
870 for (width = 0; (c = *cp, isdigit(c)); cp++) {
875 if (*cp != 'e' && *cp != 'f' && *cp != 'g' && *cp != 'E'
879 if (width < (int)(*cp != 'e' && *cp != 'E') || width > DBL_DIG)
885 sprintf(buf, (char *)XSTRING_DATA(Vfloat_output_format), data);
888 /* added by jwz: don't allow "1.0" to print as "1"; that destroys
889 the read-equivalence of lisp objects. (* x 1) and (* x 1.0) do
890 not do the same thing, so it's important that the printed
891 representation of that form not be corrupted by the printer.
894 Bufbyte *s = (Bufbyte *) buf; /* don't use signed chars here!
895 isdigit() can't hack them! */
899 /* if there's a non-digit, then there is a decimal point, or
900 it's in exponential notation, both of which are ok. */
903 /* otherwise, we need to hack it. */
910 /* Some machines print "0.4" as ".4". I don't like that. */
911 if (buf[0] == '.' || (buf[0] == '-' && buf[1] == '.')) {
913 for (i = strlen(buf) + 1; i >= 0; i--)
915 buf[(buf[0] == '-' ? 1 : 0)] = '0';
918 #endif /* HAVE_FPFLOAT */
920 /* Print NUMBER to BUFFER.
921 This is equivalent to sprintf (buffer, "%ld", number), only much faster.
923 BUFFER should accept 24 bytes. This should suffice for the longest
924 numbers on 64-bit machines, including the `-' sign and the trailing
925 '\0'. Returns a pointer to the trailing '\0'. */
926 char *long_to_string(char *buffer, long number)
928 #if (SIZEOF_LONG != 4) && (SIZEOF_LONG != 8)
930 sprintf(buffer, "%ld", number);
931 return buffer + strlen(buffer);
932 #else /* (SIZEOF_LONG == 4) || (SIZEOF_LONG == 8) */
940 #define FROB(figure) do { \
941 if (force || number >= figure) \
942 *p++ = number / figure + '0', number %= figure, force = 1; \
945 FROB(1000000000000000000L);
946 FROB(100000000000000000L);
947 FROB(10000000000000000L);
948 FROB(1000000000000000L);
949 FROB(100000000000000L);
950 FROB(10000000000000L);
951 FROB(1000000000000L);
954 #endif /* SIZEOF_LONG == 8 */
968 #endif /* (SIZEOF_LONG == 4) || (SIZEOF_LONG == 8) */
972 print_vector_internal(const char *start, const char *end,
973 Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
975 /* This function can GC */
977 int len = XVECTOR_LENGTH(obj);
979 struct gcpro gcpro1, gcpro2;
980 GCPRO2(obj, printcharfun);
982 if (INTP(Vprint_length)) {
983 int max = XINT(Vprint_length);
988 write_c_string(start, printcharfun);
989 for (i = 0; i < last; i++) {
990 Lisp_Object elt = XVECTOR_DATA(obj)[i];
992 write_char_internal(" ", printcharfun);
993 print_internal(elt, printcharfun, escapeflag);
997 write_c_string(" ...", printcharfun);
998 write_c_string(end, printcharfun);
1001 void print_cons(Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
1003 /* This function can GC */
1004 struct gcpro gcpro1, gcpro2;
1006 /* If print_readably is on, print (quote -foo-) as '-foo-
1007 (Yeah, this should really be what print-pretty does, but we
1008 don't have the rest of a pretty printer, and this actually
1009 has non-negligible impact on size/speed of .elc files.)
1011 if (print_readably &&
1012 EQ(XCAR(obj), Qquote) &&
1013 CONSP(XCDR(obj)) && NILP(XCDR(XCDR(obj)))) {
1014 obj = XCAR(XCDR(obj));
1015 GCPRO2(obj, printcharfun);
1016 write_char_internal("\'", printcharfun);
1018 print_internal(obj, printcharfun, escapeflag);
1022 GCPRO2(obj, printcharfun);
1023 write_char_internal("(", printcharfun);
1027 int max = INTP(Vprint_length) ? XINT(Vprint_length) : INT_MAX;
1028 Lisp_Object tortoise;
1029 /* Use tortoise/hare to make sure circular lists don't infloop */
1031 for (tortoise = obj, len = 0;
1032 CONSP(obj); obj = XCDR(obj), len++) {
1034 write_char_internal(" ", printcharfun);
1035 if (EQ(obj, tortoise) && len > 0) {
1038 ("printing unreadable circular list");
1040 write_c_string("... <circular list>",
1045 tortoise = XCDR(tortoise);
1047 write_c_string("...", printcharfun);
1050 print_internal(XCAR(obj), printcharfun, escapeflag);
1054 write_c_string(" . ", printcharfun);
1055 print_internal(obj, printcharfun, escapeflag);
1059 write_char_internal(")", printcharfun);
1063 void print_vector(Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
1065 print_vector_internal("[", "]", obj, printcharfun, escapeflag);
1068 void print_string(Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
1070 Lisp_String *s = XSTRING(obj);
1071 /* We distinguish between Bytecounts and Charcounts, to make
1072 Vprint_string_length work correctly under Mule. */
1073 Charcount size = string_char_length(s);
1074 Charcount max = size;
1075 Bytecount bcmax = string_length(s);
1076 struct gcpro gcpro1, gcpro2;
1077 GCPRO2(obj, printcharfun);
1079 if (INTP(Vprint_string_length) && XINT(Vprint_string_length) < max) {
1080 max = XINT(Vprint_string_length);
1081 bcmax = charcount_to_bytecount(string_data(s), max);
1089 /* This deals with GC-relocation and Mule. */
1090 output_string(printcharfun, 0, obj, 0, bcmax);
1092 write_c_string(" ...", printcharfun);
1094 Bytecount i, last = 0;
1096 write_char_internal("\"", printcharfun);
1097 for (i = 0; i < bcmax; i++) {
1098 Bufbyte ch = string_byte(s, i);
1099 if (ch == '\"' || ch == '\\'
1100 || (ch == '\n' && print_escape_newlines)) {
1102 output_string(printcharfun, 0, obj,
1106 write_c_string("\\n", printcharfun);
1108 write_char_internal("\\", printcharfun);
1109 /* This is correct for Mule because the
1110 character is either \ or " */
1111 write_char_internal(string_data(s) + i,
1118 output_string(printcharfun, 0, obj, last, bcmax - last);
1121 write_c_string(" ...", printcharfun);
1122 write_char_internal("\"", printcharfun);
1128 default_object_printer(Lisp_Object obj, Lisp_Object printcharfun,
1131 struct lcrecord_header *header = (struct lcrecord_header *)XPNTR(obj);
1135 error("printing unreadable object #<%s 0x%x>",
1136 LHEADER_IMPLEMENTATION(&header->lheader)->name,
1139 sprintf(buf, "#<%s 0x%x>",
1140 LHEADER_IMPLEMENTATION(&header->lheader)->name, header->uid);
1141 write_c_string(buf, printcharfun);
1145 internal_object_printer(Lisp_Object obj, Lisp_Object printcharfun,
1149 sprintf(buf, "#<INTERNAL OBJECT (SXEmacs bug?) (%s) 0x%lx>",
1150 XRECORD_LHEADER_IMPLEMENTATION(obj)->name,
1151 (unsigned long)XPNTR(obj));
1152 write_c_string(buf, printcharfun);
1155 enum printing_badness {
1156 BADNESS_INTEGER_OBJECT,
1157 BADNESS_POINTER_OBJECT,
1162 printing_major_badness(Lisp_Object printcharfun,
1163 Char_ASCII * badness_string, int type, void *val,
1164 enum printing_badness badness)
1169 case BADNESS_INTEGER_OBJECT:
1170 sprintf(buf, "%s %d object %ld", badness_string, type,
1174 case BADNESS_POINTER_OBJECT:
1175 sprintf(buf, "%s %d object %p", badness_string, type, val);
1178 case BADNESS_NO_TYPE:
1179 sprintf(buf, "%s object %p", badness_string, val);
1185 /* Don't abort or signal if called from debug_print() or already
1187 if (!inhibit_non_essential_printing_operations) {
1188 #ifdef ERROR_CHECK_TYPES
1190 #else /* not ERROR_CHECK_TYPES */
1192 type_error(Qinternal_error, "printing %s", buf);
1193 #endif /* not ERROR_CHECK_TYPES */
1195 write_fmt_string(printcharfun,
1196 "#<EMACS BUG: %s Save your buffers immediately and "
1197 "please report this bug>", buf);
1201 print_internal(Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
1203 /* This function can GC */
1204 /* defined in emacs.c */
1205 extern int inhibit_autoloads, nodumpfile;
1209 /* Emacs won't print while GCing, but an external debugger might */
1214 /* #### Both input and output streams should have a flag associated
1215 with them indicating whether output to that stream, or strings
1216 read from the stream, get translated using Fgettext(). Such a
1217 stream is called a "translating stream". For the minibuffer and
1218 external-debugging-output this is always true on output, and
1219 with-output-to-temp-buffer sets the flag to true for the buffer
1220 it creates. This flag should also be user-settable. Perhaps it
1221 should be split up into two flags, one for input and one for
1225 /* Try out custom printing */
1226 if (UNLIKELY(!(bool)inhibit_autoloads && !(bool)nodumpfile) &&
1227 !EQ(Qnil, Vcustom_object_printer) &&
1228 !EQ(Qnil, apply1(Vcustom_object_printer,
1229 Fcons(obj, Fcons(printcharfun, Qnil))))) {
1233 /* Detect circularities and truncate them.
1234 No need to offer any alternative--this is better than an error. */
1235 if (CONSP(obj) || VECTORP(obj) || COMPILED_FUNCTIONP(obj)) {
1237 for (i = 0; i < print_depth; i++)
1238 if (EQ(obj, being_printed[i])) {
1241 long_to_string(buf + 1, i);
1242 write_c_string(buf, printcharfun);
1247 being_printed[print_depth] = obj;
1250 if (print_depth > PRINT_CIRCLE) {
1251 error("Apparently circular structure being printed");
1254 switch (XTYPE(obj)) {
1255 case Lisp_Type_Int_Even:
1256 case Lisp_Type_Int_Odd: {
1257 /* ASCII Decimal representation uses 2.4 times as many bits as
1259 char buf[3 * sizeof(EMACS_INT) + 5];
1260 long_to_string(buf, XINT(obj));
1261 write_c_string(buf, printcharfun);
1265 case Lisp_Type_Char: {
1266 /* God intended that this be #\..., you know. */
1268 memset(buf, 0, sizeof(buf));
1269 Emchar ch = XCHAR(obj);
1287 if ((ch + 64) == '\\')
1291 } else if (ch < 127) {
1292 /* syntactically special characters should be
1314 } else if (ch == 127) {
1315 *p++ = '\\', *p++ = '^', *p++ = '?';
1316 } else if (ch < 160) {
1317 *p++ = '\\', *p++ = '^';
1318 p += set_charptr_emchar((Bufbyte *) p, ch + 64);
1320 p += set_charptr_emchar((Bufbyte *) p, ch);
1323 output_string(printcharfun, (Bufbyte *) buf, Qnil, 0,
1329 case Lisp_Type_Record: {
1330 struct lrecord_header *lheader = XRECORD_LHEADER(obj);
1332 /* Try to check for various sorts of bogus pointers if we're in
1333 a situation where it may be likely -- i.e. called from
1334 debug_print() or we're already crashing. In such cases,
1335 (further) crashing is counterproductive. */
1337 if (inhibit_non_essential_printing_operations &&
1338 !debug_can_access_memory(lheader, sizeof(*lheader))) {
1339 write_fmt_string(printcharfun,
1340 "#<EMACS BUG: BAD MEMORY ACCESS %p>",
1345 if (CONSP(obj) || VECTORP(obj)) {
1346 /* If deeper than spec'd depth, print placeholder. */
1347 if (INTP(Vprint_level)
1348 && print_depth > XINT(Vprint_level)) {
1349 write_c_string("...", printcharfun);
1354 if (lheader->type == lrecord_type_free) {
1355 printing_major_badness(printcharfun,
1360 } else if (lheader->type == lrecord_type_undefined) {
1361 printing_major_badness(printcharfun,
1362 "lrecord_type_undefined",
1366 } else if (lheader->type >= lrecord_type_count) {
1367 printing_major_badness(printcharfun,
1368 "illegal lrecord type",
1369 (int)(lheader->type),
1371 BADNESS_POINTER_OBJECT);
1375 /* Further checks for bad memory in critical situations. We
1376 don't normally do these because they may be expensive or
1377 weird (e.g. under Unix we typically have to set a SIGSEGV
1378 handler and try to trigger a seg fault). */
1380 if (inhibit_non_essential_printing_operations) {
1381 const struct lrecord_implementation *imp =
1382 LHEADER_IMPLEMENTATION(lheader);
1384 if (!debug_can_access_memory
1385 (lheader, imp->size_in_bytes_method ?
1386 imp->size_in_bytes_method(lheader) :
1387 imp->static_size)) {
1390 "#<EMACS BUG: type %s "
1391 "BAD MEMORY ACCESS %p>",
1392 LHEADER_IMPLEMENTATION
1393 (lheader)->name, lheader);
1398 Lisp_String *l = (Lisp_String *)lheader;
1399 if (!debug_can_access_memory(
1400 l->data, l->size)) {
1404 "(CAN'T ACCESS STRING "
1405 "DATA %p)>", lheader, l->data);
1411 if (LHEADER_IMPLEMENTATION(lheader)->printer) {
1412 ((LHEADER_IMPLEMENTATION(lheader)->printer)
1413 (obj, printcharfun, escapeflag));
1415 default_object_printer(obj, printcharfun, escapeflag);
1421 /* We're in trouble if this happens! */
1422 printing_major_badness(printcharfun,
1423 "illegal data type", XTYPE(obj),
1425 BADNESS_INTEGER_OBJECT);
1434 void print_symbol(Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
1436 /* This function can GC */
1437 /* #### Bug!! (intern "") isn't printed in some distinguished way */
1438 /* #### (the reader also loses on it) */
1439 Lisp_String *name = symbol_name(XSYMBOL(obj));
1440 Bytecount size = string_length(name);
1441 struct gcpro gcpro1, gcpro2;
1444 /* This deals with GC-relocation */
1445 Lisp_Object nameobj;
1446 XSETSTRING(nameobj, name);
1447 output_string(printcharfun, 0, nameobj, 0, size);
1450 GCPRO2(obj, printcharfun);
1452 /* If we print an uninterned symbol as part of a complex object and
1453 the flag print-gensym is non-nil, prefix it with #n= to read the
1454 object back with the #n# reader syntax later if needed. */
1455 if (!NILP(Vprint_gensym)
1456 /* #### Test whether this produces a noticeable slow-down for
1457 printing when print-gensym is non-nil. */
1458 && !EQ(obj, oblookup(Vobarray,
1459 string_data(symbol_name(XSYMBOL(obj))),
1460 string_length(symbol_name(XSYMBOL(obj)))))) {
1461 if (print_depth > 1) {
1462 Lisp_Object tem = Fassq(obj, Vprint_gensym_alist);
1464 write_char_internal("#", printcharfun);
1465 print_internal(XCDR(tem), printcharfun,
1467 write_char_internal("#", printcharfun);
1471 if (CONSP(Vprint_gensym_alist)) {
1472 /* Vprint_gensym_alist is exposed to Lisp, so we
1473 have to be careful. */
1474 CHECK_CONS(XCAR(Vprint_gensym_alist));
1476 (XCAR(Vprint_gensym_alist)));
1480 (Vprint_gensym_alist))) +
1484 Vprint_gensym_alist =
1485 Fcons(Fcons(obj, tem), Vprint_gensym_alist);
1487 write_char_internal("#", printcharfun);
1488 print_internal(tem, printcharfun, escapeflag);
1489 write_char_internal("=", printcharfun);
1492 write_c_string("#:", printcharfun);
1495 /* Does it look like an integer or a float? */
1497 Bufbyte *data = string_data(name);
1498 Bytecount confusing = 0;
1501 goto not_yet_confused; /* Really confusing */
1502 else if (isdigit(data[0]))
1505 goto not_yet_confused;
1506 else if (data[0] == '-' || data[0] == '+')
1509 goto not_yet_confused;
1511 for (; confusing < size; confusing++) {
1512 if (!isdigit(data[confusing])) {
1521 /* #### Ugh, this is needlessly complex and slow for what we
1522 need here. It might be a good idea to copy equivalent code
1523 from FSF. --hniksic */
1524 confusing = isfloat_string((char *)data);
1527 write_char_internal("\\", printcharfun);
1531 Lisp_Object nameobj;
1535 XSETSTRING(nameobj, name);
1536 for (i = 0; i < size; i++) {
1537 switch (string_byte(name, i)) {
1585 output_string(printcharfun, 0, nameobj,
1587 write_char_internal("\\", printcharfun);
1593 output_string(printcharfun, 0, nameobj, last, size - last);
1598 /* Useful on systems or in places where writing to stdout is unavailable or
1601 static int alternate_do_pointer;
1602 static char alternate_do_string[5000];
1604 DEFUN("alternate-debugging-output", Falternate_debugging_output, 1, 1, 0, /*
1605 Append CHARACTER to the array `alternate_do_string'.
1606 This can be used in place of `external-debugging-output' as a function
1607 to be passed to `print'. Before calling `print', set `alternate_do_pointer'
1612 Bufbyte str[MAX_EMCHAR_LEN];
1615 const Extbyte *extptr;
1617 CHECK_CHAR_COERCE_INT(character);
1618 len = set_charptr_emchar(str, XCHAR(character));
1619 TO_EXTERNAL_FORMAT(DATA, (str, len),
1620 ALLOCA, (extptr, extlen), Qterminal);
1621 memcpy(alternate_do_string + alternate_do_pointer, extptr, extlen);
1622 alternate_do_pointer += extlen;
1623 alternate_do_string[alternate_do_pointer] = 0;
1627 DEFUN("external-debugging-output", Fexternal_debugging_output, 1, 3, 0, /*
1628 Write CHAR-OR-STRING to stderr or stdout.
1629 If optional arg STDOUT-P is non-nil, write to stdout; otherwise, write
1630 to stderr. You can use this function to write directly to the terminal.
1631 This function can be used as the STREAM argument of Fprint() or the like.
1633 Under MS Windows, this writes output to the console window (which is
1634 created, if necessary), unless SXEmacs is being run noninteractively
1635 \(i.e. using the `-batch' argument).
1637 If you have opened a termscript file (using `open-termscript'), then
1638 the output also will be logged to this file.
1640 (char_or_string, stdout_p, device))
1643 struct console *con = 0;
1646 if (!NILP(stdout_p))
1651 CHECK_LIVE_DEVICE(device);
1652 if (!DEVICE_TTY_P(XDEVICE(device)) &&
1653 !DEVICE_STREAM_P(XDEVICE(device)))
1654 signal_simple_error("Must be tty or stream device",
1656 con = XCONSOLE(DEVICE_CONSOLE(XDEVICE(device)));
1657 if (DEVICE_TTY_P(XDEVICE(device))) {
1659 } else if (!NILP(stdout_p)) {
1660 file = CONSOLE_STREAM_DATA(con)->out;
1662 file = CONSOLE_STREAM_DATA(con)->err;
1666 if (STRINGP(char_or_string))
1667 write_string_to_stdio_stream(file, con,
1668 XSTRING_DATA(char_or_string),
1669 0, XSTRING_LENGTH(char_or_string),
1672 Bufbyte str[MAX_EMCHAR_LEN];
1675 CHECK_CHAR_COERCE_INT(char_or_string);
1676 len = set_charptr_emchar(str, XCHAR(char_or_string));
1677 write_string_to_stdio_stream(file, con, str, 0, len, Qterminal,
1681 return char_or_string;
1684 DEFUN("open-termscript", Fopen_termscript, 1, 1, "FOpen termscript file: ", /*
1685 Start writing all terminal output to FILENAME as well as the terminal.
1686 FILENAME = nil means just close any termscript file currently open.
1690 /* This function can GC */
1691 if (termscript != 0) {
1696 if (!NILP(filename)) {
1697 filename = Fexpand_file_name(filename, Qnil);
1698 termscript = fopen((char *)XSTRING_DATA(filename), "w");
1699 if (termscript == NULL)
1700 report_file_error("Opening termscript",
1707 /* Debugging kludge -- unbuffered */
1708 static int debug_print_length = 50;
1709 static int debug_print_level = 15;
1710 static int debug_print_readably = -1;
1712 static void debug_print_no_newline(Lisp_Object debug_print_obj)
1714 /* This function can GC */
1715 int save_print_readably = print_readably;
1716 int save_print_depth = print_depth;
1717 Lisp_Object save_Vprint_length = Vprint_length;
1718 Lisp_Object save_Vprint_level = Vprint_level;
1719 Lisp_Object save_Vinhibit_quit = Vinhibit_quit;
1720 struct gcpro gcpro1, gcpro2, gcpro3;
1721 GCPRO3(save_Vprint_level, save_Vprint_length, save_Vinhibit_quit);
1725 ("** gc-in-progress! Bad idea to print anything! **\n");
1728 print_readably = debug_print_readably != -1 ? debug_print_readably : 0;
1730 inhibit_non_essential_printing_operations = 1;
1731 /* Could use unwind-protect, but why bother? */
1732 if (debug_print_length > 0)
1733 Vprint_length = make_int(debug_print_length);
1734 if (debug_print_level > 0)
1735 Vprint_level = make_int(debug_print_level);
1737 print_internal(debug_print_obj, Qexternal_debugging_output, 1);
1738 alternate_do_pointer = 0;
1739 print_internal(debug_print_obj, Qalternate_debugging_output, 1);
1741 Vinhibit_quit = save_Vinhibit_quit;
1742 Vprint_level = save_Vprint_level;
1743 Vprint_length = save_Vprint_length;
1744 print_depth = save_print_depth;
1745 print_readably = save_print_readably;
1746 inhibit_non_essential_printing_operations = 0;
1751 void debug_print(Lisp_Object debug_print_obj)
1753 debug_print_no_newline(debug_print_obj);
1757 /* Debugging kludge -- unbuffered */
1758 /* This function provided for the benefit of the debugger. */
1759 void debug_backtrace(void);
1760 void debug_backtrace(void)
1762 /* This function can GC */
1763 int old_print_readably = print_readably;
1764 int old_print_depth = print_depth;
1765 Lisp_Object old_print_length = Vprint_length;
1766 Lisp_Object old_print_level = Vprint_level;
1767 Lisp_Object old_inhibit_quit = Vinhibit_quit;
1769 struct gcpro gcpro1, gcpro2, gcpro3;
1770 GCPRO3(old_print_level, old_print_length, old_inhibit_quit);
1774 ("** gc-in-progress! Bad idea to print anything! **\n");
1779 inhibit_non_essential_printing_operations = 1;
1780 /* Could use unwind-protect, but why bother? */
1781 if (debug_print_length > 0)
1782 Vprint_length = make_int(debug_print_length);
1783 if (debug_print_level > 0)
1784 Vprint_level = make_int(debug_print_level);
1786 Fbacktrace(Qexternal_debugging_output, Qt);
1789 Vinhibit_quit = old_inhibit_quit;
1790 Vprint_level = old_print_level;
1791 Vprint_length = old_print_length;
1792 print_depth = old_print_depth;
1793 print_readably = old_print_readably;
1794 inhibit_non_essential_printing_operations = 0;
1800 void debug_short_backtrace(int length)
1803 struct backtrace *bt = backtrace_list;
1805 while (length > 0 && bt) {
1809 if (COMPILED_FUNCTIONP(*bt->function)) {
1810 #if defined(COMPILED_FUNCTION_ANNOTATION_HACK)
1812 compiled_function_annotation(XCOMPILED_FUNCTION
1815 Lisp_Object ann = Qnil;
1818 stderr_out("<compiled-function from ");
1819 debug_print_no_newline(ann);
1823 ("<compiled-function of unknown origin>");
1826 debug_print_no_newline(*bt->function);
1834 #endif /* debugging kludge */
1836 void syms_of_print(void)
1838 defsymbol(&Qstandard_output, "standard-output");
1840 defsymbol(&Qprint_length, "print-length");
1842 defsymbol(&Qprint_string_length, "print-string-length");
1844 defsymbol(&Qdisplay_error, "display-error");
1845 defsymbol(&Qprint_message_label, "print-message-label");
1848 DEFSUBR(Fprin1_to_string);
1851 DEFSUBR(Ferror_message_string);
1852 DEFSUBR(Fdisplay_error);
1854 DEFSUBR(Fwrite_char);
1855 DEFSUBR(Falternate_debugging_output);
1856 DEFSUBR(Fexternal_debugging_output);
1857 DEFSUBR(Fopen_termscript);
1858 defsymbol(&Qexternal_debugging_output, "external-debugging-output");
1859 defsymbol(&Qalternate_debugging_output, "alternate-debugging-output");
1860 DEFSUBR(Fwith_output_to_temp_buffer);
1863 void reinit_vars_of_print(void)
1865 alternate_do_pointer = 0;
1868 void vars_of_print(void)
1870 reinit_vars_of_print();
1872 DEFVAR_LISP("standard-output", &Vstandard_output /*
1873 Output stream `print' uses by default for outputting a character.
1874 This may be any function of one argument.
1875 It may also be a buffer (output is inserted before point)
1876 or a marker (output is inserted and the marker is advanced)
1877 or the symbol t (output appears in the minibuffer line).
1879 Vstandard_output = Qt;
1882 DEFVAR_LISP("float-output-format", &Vfloat_output_format /*
1883 The format descriptor string that lisp uses to print floats.
1884 This is a %-spec like those accepted by `printf' in C,
1885 but with some restrictions. It must start with the two characters `%.'.
1886 After that comes an integer precision specification,
1887 and then a letter which controls the format.
1888 The letters allowed are `e', `f' and `g'.
1889 Use `e' for exponential notation "DIG.DIGITSeEXPT"
1890 Use `f' for decimal point notation "DIGITS.DIGITS".
1891 Use `g' to choose the shorter of those two formats for the number at hand.
1892 The precision in any of these cases is the number of digits following
1893 the decimal point. With `f', a precision of 0 means to omit the
1894 decimal point. 0 is not allowed with `f' or `g'.
1896 A value of nil means to use `%.16g'.
1898 Regardless of the value of `float-output-format', a floating point number
1899 will never be printed in such a way that it is ambiguous with an integer;
1900 that is, a floating-point number will always be printed with a decimal
1901 point and/or an exponent, even if the digits following the decimal point
1902 are all zero. This is to preserve read-equivalence.
1904 Vfloat_output_format = Qnil;
1905 #endif /* HAVE_FPFLOAT */
1907 DEFVAR_LISP("print-length", &Vprint_length /*
1908 Maximum length of list or vector to print before abbreviating.
1909 A value of nil means no limit.
1911 Vprint_length = Qnil;
1913 DEFVAR_LISP("print-string-length", &Vprint_string_length /*
1914 Maximum length of string to print before abbreviating.
1915 A value of nil means no limit.
1917 Vprint_string_length = Qnil;
1919 DEFVAR_LISP("print-level", &Vprint_level /*
1920 Maximum depth of list nesting to print before abbreviating.
1921 A value of nil means no limit.
1923 Vprint_level = Qnil;
1925 DEFVAR_BOOL("print-escape-newlines", &print_escape_newlines /*
1926 Non-nil means print newlines in strings as backslash-n.
1928 print_escape_newlines = 0;
1930 DEFVAR_BOOL("print-readably", &print_readably /*
1931 If non-nil, then all objects will be printed in a readable form.
1932 If an object has no readable representation, then an error is signalled.
1933 When print-readably is true, compiled-function objects will be written in
1934 #[...] form instead of in #<compiled-function [...]> form, and two-element
1935 lists of the form (quote object) will be written as the equivalent 'object.
1936 Do not SET this variable; bind it instead.
1940 /* #### I think this should default to t. But we'd better wait
1941 until we see that it works out. */
1942 DEFVAR_LISP("print-gensym", &Vprint_gensym /*
1943 If non-nil, then uninterned symbols will be printed specially.
1944 Uninterned symbols are those which are not present in `obarray', that is,
1945 those which were made with `make-symbol' or by calling `intern' with a
1948 When print-gensym is true, such symbols will be preceded by "#:",
1949 which causes the reader to create a new symbol instead of interning
1950 and returning an existing one. Beware: the #: syntax creates a new
1951 symbol each time it is seen, so if you print an object which contains
1952 two pointers to the same uninterned symbol, `read' will not duplicate
1955 If the value of `print-gensym' is a cons cell, then in addition
1956 refrain from clearing `print-gensym-alist' on entry to and exit from
1957 printing functions, so that the use of #...# and #...= can carry over
1958 for several separately printed objects.
1960 Vprint_gensym = Qnil;
1962 DEFVAR_LISP("print-gensym-alist", &Vprint_gensym_alist /*
1963 Association list of elements (GENSYM . N) to guide use of #N# and #N=.
1964 In each element, GENSYM is an uninterned symbol that has been associated
1965 with #N= for the specified value of N.
1967 Vprint_gensym_alist = Qnil;
1969 DEFVAR_LISP("print-message-label", &Vprint_message_label /*
1970 Label for minibuffer messages created with `print'. This should
1971 generally be bound with `let' rather than set. (See `display-message'.)
1973 Vprint_message_label = Qprint;
1975 DEFVAR_LISP("custom-object-printer", &Vcustom_object_printer /*
1976 Function to call in order to print custom object.
1978 Vcustom_object_printer = Qnil;