Merged in changes from CVS HEAD
[bpt/emacs.git] / src / print.c
1 /* Lisp object printing and output streams.
2 Copyright (C) 1985, 86, 88, 93, 94, 95, 97, 98, 1999, 2000, 01, 2003
3 Free Software Foundation, Inc.
4
5 This file is part of GNU Emacs.
6
7 GNU Emacs 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 2, or (at your option)
10 any later version.
11
12 GNU Emacs 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.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; 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
23 #include <config.h>
24 #include <stdio.h>
25 #include "lisp.h"
26 #include "buffer.h"
27 #include "charset.h"
28 #include "keyboard.h"
29 #include "frame.h"
30 #include "window.h"
31 #include "process.h"
32 #include "dispextern.h"
33 #include "systty.h" /* For emacs_tty in termchar.h */
34 #include "termchar.h"
35 #include "intervals.h"
36
37 Lisp_Object Vstandard_output, Qstandard_output;
38
39 Lisp_Object Qtemp_buffer_setup_hook;
40
41 /* These are used to print like we read. */
42 extern Lisp_Object Qbackquote, Qcomma, Qcomma_at, Qcomma_dot, Qfunction;
43
44 Lisp_Object Vfloat_output_format, Qfloat_output_format;
45
46 /* Work around a problem that happens because math.h on hpux 7
47 defines two static variables--which, in Emacs, are not really static,
48 because `static' is defined as nothing. The problem is that they are
49 defined both here and in lread.c.
50 These macros prevent the name conflict. */
51 #if defined (HPUX) && !defined (HPUX8)
52 #define _MAXLDBL print_maxldbl
53 #define _NMAXLDBL print_nmaxldbl
54 #endif
55
56 #include <math.h>
57
58 #if STDC_HEADERS
59 #include <float.h>
60 #endif
61
62 /* Default to values appropriate for IEEE floating point. */
63 #ifndef FLT_RADIX
64 #define FLT_RADIX 2
65 #endif
66 #ifndef DBL_MANT_DIG
67 #define DBL_MANT_DIG 53
68 #endif
69 #ifndef DBL_DIG
70 #define DBL_DIG 15
71 #endif
72 #ifndef DBL_MIN
73 #define DBL_MIN 2.2250738585072014e-308
74 #endif
75
76 #ifdef DBL_MIN_REPLACEMENT
77 #undef DBL_MIN
78 #define DBL_MIN DBL_MIN_REPLACEMENT
79 #endif
80
81 /* Define DOUBLE_DIGITS_BOUND, an upper bound on the number of decimal digits
82 needed to express a float without losing information.
83 The general-case formula is valid for the usual case, IEEE floating point,
84 but many compilers can't optimize the formula to an integer constant,
85 so make a special case for it. */
86 #if FLT_RADIX == 2 && DBL_MANT_DIG == 53
87 #define DOUBLE_DIGITS_BOUND 17 /* IEEE floating point */
88 #else
89 #define DOUBLE_DIGITS_BOUND ((int) ceil (log10 (pow (FLT_RADIX, DBL_MANT_DIG))))
90 #endif
91
92 /* Avoid actual stack overflow in print. */
93 int print_depth;
94
95 /* Nonzero if inside outputting backquote in old style. */
96 int old_backquote_output;
97
98 /* Detect most circularities to print finite output. */
99 #define PRINT_CIRCLE 200
100 Lisp_Object being_printed[PRINT_CIRCLE];
101
102 /* When printing into a buffer, first we put the text in this
103 block, then insert it all at once. */
104 char *print_buffer;
105
106 /* Size allocated in print_buffer. */
107 int print_buffer_size;
108 /* Chars stored in print_buffer. */
109 int print_buffer_pos;
110 /* Bytes stored in print_buffer. */
111 int print_buffer_pos_byte;
112
113 /* Maximum length of list to print in full; noninteger means
114 effectively infinity */
115
116 Lisp_Object Vprint_length;
117
118 /* Maximum depth of list to print in full; noninteger means
119 effectively infinity. */
120
121 Lisp_Object Vprint_level;
122
123 /* Nonzero means print newlines in strings as \n. */
124
125 int print_escape_newlines;
126
127 /* Nonzero means to print single-byte non-ascii characters in strings as
128 octal escapes. */
129
130 int print_escape_nonascii;
131
132 /* Nonzero means to print multibyte characters in strings as hex escapes. */
133
134 int print_escape_multibyte;
135
136 Lisp_Object Qprint_escape_newlines;
137 Lisp_Object Qprint_escape_multibyte, Qprint_escape_nonascii;
138
139 /* Nonzero means print (quote foo) forms as 'foo, etc. */
140
141 int print_quoted;
142
143 /* Non-nil means print #: before uninterned symbols. */
144
145 Lisp_Object Vprint_gensym;
146
147 /* Non-nil means print recursive structures using #n= and #n# syntax. */
148
149 Lisp_Object Vprint_circle;
150
151 /* Non-nil means keep continuous number for #n= and #n# syntax
152 between several print functions. */
153
154 Lisp_Object Vprint_continuous_numbering;
155
156 /* Vprint_number_table is a vector like [OBJ1 STAT1 OBJ2 STAT2 ...],
157 where OBJn are objects going to be printed, and STATn are their status,
158 which may be different meanings during process. See the comments of
159 the functions print and print_preprocess for details.
160 print_number_index keeps the last position the next object should be added,
161 twice of which is the actual vector position in Vprint_number_table. */
162 int print_number_index;
163 Lisp_Object Vprint_number_table;
164
165 /* PRINT_NUMBER_OBJECT returns the I'th object in Vprint_number_table TABLE.
166 PRINT_NUMBER_STATUS returns the status of the I'th object in TABLE.
167 See the comment of the variable Vprint_number_table. */
168 #define PRINT_NUMBER_OBJECT(table,i) XVECTOR ((table))->contents[(i) * 2]
169 #define PRINT_NUMBER_STATUS(table,i) XVECTOR ((table))->contents[(i) * 2 + 1]
170
171 /* Nonzero means print newline to stdout before next minibuffer message.
172 Defined in xdisp.c */
173
174 extern int noninteractive_need_newline;
175
176 extern int minibuffer_auto_raise;
177
178 #ifdef MAX_PRINT_CHARS
179 static int print_chars;
180 static int max_print;
181 #endif /* MAX_PRINT_CHARS */
182
183 void print_interval ();
184
185 \f
186 /* Low level output routines for characters and strings */
187
188 /* Lisp functions to do output using a stream
189 must have the stream in a variable called printcharfun
190 and must start with PRINTPREPARE, end with PRINTFINISH,
191 and use PRINTDECLARE to declare common variables.
192 Use PRINTCHAR to output one character,
193 or call strout to output a block of characters. */
194
195 #define PRINTDECLARE \
196 struct buffer *old = current_buffer; \
197 int old_point = -1, start_point = -1; \
198 int old_point_byte = -1, start_point_byte = -1; \
199 int specpdl_count = SPECPDL_INDEX (); \
200 int free_print_buffer = 0; \
201 int multibyte = !NILP (current_buffer->enable_multibyte_characters); \
202 Lisp_Object original
203
204 #define PRINTPREPARE \
205 original = printcharfun; \
206 if (NILP (printcharfun)) printcharfun = Qt; \
207 if (BUFFERP (printcharfun)) \
208 { \
209 if (XBUFFER (printcharfun) != current_buffer) \
210 Fset_buffer (printcharfun); \
211 printcharfun = Qnil; \
212 } \
213 if (MARKERP (printcharfun)) \
214 { \
215 if (!(XMARKER (original)->buffer)) \
216 error ("Marker does not point anywhere"); \
217 if (XMARKER (original)->buffer != current_buffer) \
218 set_buffer_internal (XMARKER (original)->buffer); \
219 old_point = PT; \
220 old_point_byte = PT_BYTE; \
221 SET_PT_BOTH (marker_position (printcharfun), \
222 marker_byte_position (printcharfun)); \
223 start_point = PT; \
224 start_point_byte = PT_BYTE; \
225 printcharfun = Qnil; \
226 } \
227 if (NILP (printcharfun)) \
228 { \
229 Lisp_Object string; \
230 if (NILP (current_buffer->enable_multibyte_characters) \
231 && ! print_escape_multibyte) \
232 specbind (Qprint_escape_multibyte, Qt); \
233 if (! NILP (current_buffer->enable_multibyte_characters) \
234 && ! print_escape_nonascii) \
235 specbind (Qprint_escape_nonascii, Qt); \
236 if (print_buffer != 0) \
237 { \
238 string = make_string_from_bytes (print_buffer, \
239 print_buffer_pos, \
240 print_buffer_pos_byte); \
241 record_unwind_protect (print_unwind, string); \
242 } \
243 else \
244 { \
245 print_buffer_size = 1000; \
246 print_buffer = (char *) xmalloc (print_buffer_size); \
247 free_print_buffer = 1; \
248 } \
249 print_buffer_pos = 0; \
250 print_buffer_pos_byte = 0; \
251 } \
252 if (EQ (printcharfun, Qt) && ! noninteractive) \
253 setup_echo_area_for_printing (multibyte);
254
255 #define PRINTFINISH \
256 if (NILP (printcharfun)) \
257 { \
258 if (print_buffer_pos != print_buffer_pos_byte \
259 && NILP (current_buffer->enable_multibyte_characters)) \
260 { \
261 unsigned char *temp \
262 = (unsigned char *) alloca (print_buffer_pos + 1); \
263 copy_text (print_buffer, temp, print_buffer_pos_byte, \
264 1, 0); \
265 insert_1_both (temp, print_buffer_pos, \
266 print_buffer_pos, 0, 1, 0); \
267 } \
268 else \
269 insert_1_both (print_buffer, print_buffer_pos, \
270 print_buffer_pos_byte, 0, 1, 0); \
271 } \
272 if (free_print_buffer) \
273 { \
274 xfree (print_buffer); \
275 print_buffer = 0; \
276 } \
277 unbind_to (specpdl_count, Qnil); \
278 if (MARKERP (original)) \
279 set_marker_both (original, Qnil, PT, PT_BYTE); \
280 if (old_point >= 0) \
281 SET_PT_BOTH (old_point + (old_point >= start_point \
282 ? PT - start_point : 0), \
283 old_point_byte + (old_point_byte >= start_point_byte \
284 ? PT_BYTE - start_point_byte : 0)); \
285 if (old != current_buffer) \
286 set_buffer_internal (old);
287
288 #define PRINTCHAR(ch) printchar (ch, printcharfun)
289
290 /* This is used to restore the saved contents of print_buffer
291 when there is a recursive call to print. */
292
293 static Lisp_Object
294 print_unwind (saved_text)
295 Lisp_Object saved_text;
296 {
297 bcopy (SDATA (saved_text), print_buffer, SCHARS (saved_text));
298 return Qnil;
299 }
300
301
302 /* Print character CH using method FUN. FUN nil means print to
303 print_buffer. FUN t means print to echo area or stdout if
304 non-interactive. If FUN is neither nil nor t, call FUN with CH as
305 argument. */
306
307 static void
308 printchar (ch, fun)
309 unsigned int ch;
310 Lisp_Object fun;
311 {
312 #ifdef MAX_PRINT_CHARS
313 if (max_print)
314 print_chars++;
315 #endif /* MAX_PRINT_CHARS */
316
317 if (!NILP (fun) && !EQ (fun, Qt))
318 call1 (fun, make_number (ch));
319 else
320 {
321 unsigned char str[MAX_MULTIBYTE_LENGTH];
322 int len = CHAR_STRING (ch, str);
323
324 QUIT;
325
326 if (NILP (fun))
327 {
328 if (print_buffer_pos_byte + len >= print_buffer_size)
329 print_buffer = (char *) xrealloc (print_buffer,
330 print_buffer_size *= 2);
331 bcopy (str, print_buffer + print_buffer_pos_byte, len);
332 print_buffer_pos += 1;
333 print_buffer_pos_byte += len;
334 }
335 else if (noninteractive)
336 {
337 fwrite (str, 1, len, stdout);
338 noninteractive_need_newline = 1;
339 }
340 else
341 {
342 int multibyte_p
343 = !NILP (current_buffer->enable_multibyte_characters);
344
345 setup_echo_area_for_printing (multibyte_p);
346 insert_char (ch);
347 message_dolog (str, len, 0, multibyte_p);
348 }
349 }
350 }
351
352
353 /* Output SIZE characters, SIZE_BYTE bytes from string PTR using
354 method PRINTCHARFUN. If SIZE < 0, use the string length of PTR for
355 both SIZE and SIZE_BYTE. PRINTCHARFUN nil means output to
356 print_buffer. PRINTCHARFUN t means output to the echo area or to
357 stdout if non-interactive. If neither nil nor t, call Lisp
358 function PRINTCHARFUN for each character printed. MULTIBYTE
359 non-zero means PTR contains multibyte characters. */
360
361 static void
362 strout (ptr, size, size_byte, printcharfun, multibyte)
363 char *ptr;
364 int size, size_byte;
365 Lisp_Object printcharfun;
366 int multibyte;
367 {
368 if (size < 0)
369 size_byte = size = strlen (ptr);
370
371 if (NILP (printcharfun))
372 {
373 if (print_buffer_pos_byte + size_byte > print_buffer_size)
374 {
375 print_buffer_size = print_buffer_size * 2 + size_byte;
376 print_buffer = (char *) xrealloc (print_buffer,
377 print_buffer_size);
378 }
379 bcopy (ptr, print_buffer + print_buffer_pos_byte, size_byte);
380 print_buffer_pos += size;
381 print_buffer_pos_byte += size_byte;
382
383 #ifdef MAX_PRINT_CHARS
384 if (max_print)
385 print_chars += size;
386 #endif /* MAX_PRINT_CHARS */
387 }
388 else if (noninteractive && EQ (printcharfun, Qt))
389 {
390 fwrite (ptr, 1, size_byte, stdout);
391 noninteractive_need_newline = 1;
392 }
393 else if (EQ (printcharfun, Qt))
394 {
395 /* Output to echo area. We're trying to avoid a little overhead
396 here, that's the reason we don't call printchar to do the
397 job. */
398 int i;
399 int multibyte_p
400 = !NILP (current_buffer->enable_multibyte_characters);
401
402 setup_echo_area_for_printing (multibyte_p);
403 message_dolog (ptr, size_byte, 0, multibyte_p);
404
405 if (size == size_byte)
406 {
407 for (i = 0; i < size; ++i)
408 insert_char ((unsigned char )*ptr++);
409 }
410 else
411 {
412 int len;
413 for (i = 0; i < size_byte; i += len)
414 {
415 int ch = STRING_CHAR_AND_LENGTH (ptr + i, size_byte - i, len);
416 insert_char (ch);
417 }
418 }
419
420 #ifdef MAX_PRINT_CHARS
421 if (max_print)
422 print_chars += size;
423 #endif /* MAX_PRINT_CHARS */
424 }
425 else
426 {
427 /* PRINTCHARFUN is a Lisp function. */
428 int i = 0;
429
430 if (size == size_byte)
431 {
432 while (i < size_byte)
433 {
434 int ch = ptr[i++];
435 PRINTCHAR (ch);
436 }
437 }
438 else
439 {
440 while (i < size_byte)
441 {
442 /* Here, we must convert each multi-byte form to the
443 corresponding character code before handing it to
444 PRINTCHAR. */
445 int len;
446 int ch = STRING_CHAR_AND_LENGTH (ptr + i, size_byte - i, len);
447 PRINTCHAR (ch);
448 i += len;
449 }
450 }
451 }
452 }
453
454 /* Print the contents of a string STRING using PRINTCHARFUN.
455 It isn't safe to use strout in many cases,
456 because printing one char can relocate. */
457
458 static void
459 print_string (string, printcharfun)
460 Lisp_Object string;
461 Lisp_Object printcharfun;
462 {
463 if (EQ (printcharfun, Qt) || NILP (printcharfun))
464 {
465 int chars;
466
467 if (STRING_MULTIBYTE (string))
468 chars = SCHARS (string);
469 else if (EQ (printcharfun, Qt)
470 ? ! NILP (buffer_defaults.enable_multibyte_characters)
471 : ! NILP (current_buffer->enable_multibyte_characters))
472 {
473 /* If unibyte string STRING contains 8-bit codes, we must
474 convert STRING to a multibyte string containing the same
475 character codes. */
476 Lisp_Object newstr;
477 int bytes;
478
479 chars = SBYTES (string);
480 bytes = parse_str_to_multibyte (SDATA (string), chars);
481 if (chars < bytes)
482 {
483 newstr = make_uninit_multibyte_string (chars, bytes);
484 bcopy (SDATA (string), SDATA (newstr), chars);
485 str_to_multibyte (SDATA (newstr), bytes, chars);
486 string = newstr;
487 }
488 }
489 else
490 chars = SBYTES (string);
491
492 /* strout is safe for output to a frame (echo area) or to print_buffer. */
493 strout (SDATA (string),
494 chars, SBYTES (string),
495 printcharfun, STRING_MULTIBYTE (string));
496 }
497 else
498 {
499 /* Otherwise, string may be relocated by printing one char.
500 So re-fetch the string address for each character. */
501 int i;
502 int size = SCHARS (string);
503 int size_byte = SBYTES (string);
504 struct gcpro gcpro1;
505 GCPRO1 (string);
506 if (size == size_byte)
507 for (i = 0; i < size; i++)
508 PRINTCHAR (SREF (string, i));
509 else
510 for (i = 0; i < size_byte; )
511 {
512 /* Here, we must convert each multi-byte form to the
513 corresponding character code before handing it to PRINTCHAR. */
514 int len;
515 int ch = STRING_CHAR_AND_LENGTH (SDATA (string) + i,
516 size_byte - i, len);
517 if (!CHAR_VALID_P (ch, 0))
518 {
519 ch = SREF (string, i);
520 len = 1;
521 }
522 PRINTCHAR (ch);
523 i += len;
524 }
525 UNGCPRO;
526 }
527 }
528 \f
529 DEFUN ("write-char", Fwrite_char, Swrite_char, 1, 2, 0,
530 doc: /* Output character CHARACTER to stream PRINTCHARFUN.
531 PRINTCHARFUN defaults to the value of `standard-output' (which see). */)
532 (character, printcharfun)
533 Lisp_Object character, printcharfun;
534 {
535 PRINTDECLARE;
536
537 if (NILP (printcharfun))
538 printcharfun = Vstandard_output;
539 CHECK_NUMBER (character);
540 PRINTPREPARE;
541 PRINTCHAR (XINT (character));
542 PRINTFINISH;
543 return character;
544 }
545
546 /* Used from outside of print.c to print a block of SIZE
547 single-byte chars at DATA on the default output stream.
548 Do not use this on the contents of a Lisp string. */
549
550 void
551 write_string (data, size)
552 char *data;
553 int size;
554 {
555 PRINTDECLARE;
556 Lisp_Object printcharfun;
557
558 printcharfun = Vstandard_output;
559
560 PRINTPREPARE;
561 strout (data, size, size, printcharfun, 0);
562 PRINTFINISH;
563 }
564
565 /* Used from outside of print.c to print a block of SIZE
566 single-byte chars at DATA on a specified stream PRINTCHARFUN.
567 Do not use this on the contents of a Lisp string. */
568
569 void
570 write_string_1 (data, size, printcharfun)
571 char *data;
572 int size;
573 Lisp_Object printcharfun;
574 {
575 PRINTDECLARE;
576
577 PRINTPREPARE;
578 strout (data, size, size, printcharfun, 0);
579 PRINTFINISH;
580 }
581
582
583 void
584 temp_output_buffer_setup (bufname)
585 const char *bufname;
586 {
587 int count = SPECPDL_INDEX ();
588 register struct buffer *old = current_buffer;
589 register Lisp_Object buf;
590
591 record_unwind_protect (set_buffer_if_live, Fcurrent_buffer ());
592
593 Fset_buffer (Fget_buffer_create (build_string (bufname)));
594
595 Fkill_all_local_variables ();
596 delete_all_overlays (current_buffer);
597 current_buffer->directory = old->directory;
598 current_buffer->read_only = Qnil;
599 current_buffer->filename = Qnil;
600 current_buffer->undo_list = Qt;
601 eassert (current_buffer->overlays_before == NULL);
602 eassert (current_buffer->overlays_after == NULL);
603 current_buffer->enable_multibyte_characters
604 = buffer_defaults.enable_multibyte_characters;
605 Ferase_buffer ();
606 XSETBUFFER (buf, current_buffer);
607
608 Frun_hooks (1, &Qtemp_buffer_setup_hook);
609
610 unbind_to (count, Qnil);
611
612 specbind (Qstandard_output, buf);
613 }
614
615 Lisp_Object
616 internal_with_output_to_temp_buffer (bufname, function, args)
617 const char *bufname;
618 Lisp_Object (*function) P_ ((Lisp_Object));
619 Lisp_Object args;
620 {
621 int count = SPECPDL_INDEX ();
622 Lisp_Object buf, val;
623 struct gcpro gcpro1;
624
625 GCPRO1 (args);
626 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
627 temp_output_buffer_setup (bufname);
628 buf = Vstandard_output;
629 UNGCPRO;
630
631 val = (*function) (args);
632
633 GCPRO1 (val);
634 temp_output_buffer_show (buf);
635 UNGCPRO;
636
637 return unbind_to (count, val);
638 }
639
640 DEFUN ("with-output-to-temp-buffer",
641 Fwith_output_to_temp_buffer, Swith_output_to_temp_buffer,
642 1, UNEVALLED, 0,
643 doc: /* Bind `standard-output' to buffer BUFNAME, eval BODY, then show that buffer.
644 The buffer is cleared out initially, and marked as unmodified when done.
645 All output done by BODY is inserted in that buffer by default.
646 The buffer is displayed in another window, but not selected.
647 The value of the last form in BODY is returned.
648 If BODY does not finish normally, the buffer BUFNAME is not displayed.
649
650 The hook `temp-buffer-setup-hook' is run before BODY,
651 with the buffer BUFNAME temporarily current.
652 The hook `temp-buffer-show-hook' is run after the buffer is displayed,
653 with the buffer temporarily current, and the window that was used
654 to display it temporarily selected.
655
656 If variable `temp-buffer-show-function' is non-nil, call it at the end
657 to get the buffer displayed instead of just displaying the non-selected
658 buffer and calling the hook. It gets one argument, the buffer to display.
659
660 usage: (with-output-to-temp-buffer BUFFNAME BODY ...) */)
661 (args)
662 Lisp_Object args;
663 {
664 struct gcpro gcpro1;
665 Lisp_Object name;
666 int count = SPECPDL_INDEX ();
667 Lisp_Object buf, val;
668
669 GCPRO1(args);
670 name = Feval (Fcar (args));
671 CHECK_STRING (name);
672 temp_output_buffer_setup (SDATA (name));
673 buf = Vstandard_output;
674 UNGCPRO;
675
676 val = Fprogn (XCDR (args));
677
678 GCPRO1 (val);
679 temp_output_buffer_show (buf);
680 UNGCPRO;
681
682 return unbind_to (count, val);
683 }
684
685 \f
686 static void print ();
687 static void print_preprocess ();
688 static void print_preprocess_string ();
689 static void print_object ();
690
691 DEFUN ("terpri", Fterpri, Sterpri, 0, 1, 0,
692 doc: /* Output a newline to stream PRINTCHARFUN.
693 If PRINTCHARFUN is omitted or nil, the value of `standard-output' is used. */)
694 (printcharfun)
695 Lisp_Object printcharfun;
696 {
697 PRINTDECLARE;
698
699 if (NILP (printcharfun))
700 printcharfun = Vstandard_output;
701 PRINTPREPARE;
702 PRINTCHAR ('\n');
703 PRINTFINISH;
704 return Qt;
705 }
706
707 DEFUN ("prin1", Fprin1, Sprin1, 1, 2, 0,
708 doc: /* Output the printed representation of OBJECT, any Lisp object.
709 Quoting characters are printed when needed to make output that `read'
710 can handle, whenever this is possible. For complex objects, the behavior
711 is controlled by `print-level' and `print-length', which see.
712
713 OBJECT is any of the Lisp data types: a number, a string, a symbol,
714 a list, a buffer, a window, a frame, etc.
715
716 A printed representation of an object is text which describes that object.
717
718 Optional argument PRINTCHARFUN is the output stream, which can be one
719 of these:
720
721 - a buffer, in which case output is inserted into that buffer at point;
722 - a marker, in which case output is inserted at marker's position;
723 - a function, in which case that function is called once for each
724 character of OBJECT's printed representation;
725 - a symbol, in which case that symbol's function definition is called; or
726 - t, in which case the output is displayed in the echo area.
727
728 If PRINTCHARFUN is omitted, the value of `standard-output' (which see)
729 is used instead. */)
730 (object, printcharfun)
731 Lisp_Object object, printcharfun;
732 {
733 PRINTDECLARE;
734
735 #ifdef MAX_PRINT_CHARS
736 max_print = 0;
737 #endif /* MAX_PRINT_CHARS */
738 if (NILP (printcharfun))
739 printcharfun = Vstandard_output;
740 PRINTPREPARE;
741 print (object, printcharfun, 1);
742 PRINTFINISH;
743 return object;
744 }
745
746 /* a buffer which is used to hold output being built by prin1-to-string */
747 Lisp_Object Vprin1_to_string_buffer;
748
749 DEFUN ("prin1-to-string", Fprin1_to_string, Sprin1_to_string, 1, 2, 0,
750 doc: /* Return a string containing the printed representation of OBJECT.
751 OBJECT can be any Lisp object. This function outputs quoting characters
752 when necessary to make output that `read' can handle, whenever possible,
753 unless the optional second argument NOESCAPE is non-nil.
754
755 OBJECT is any of the Lisp data types: a number, a string, a symbol,
756 a list, a buffer, a window, a frame, etc.
757
758 A printed representation of an object is text which describes that object. */)
759 (object, noescape)
760 Lisp_Object object, noescape;
761 {
762 Lisp_Object printcharfun;
763 /* struct gcpro gcpro1, gcpro2; */
764 Lisp_Object save_deactivate_mark;
765 int count = specpdl_ptr - specpdl;
766 struct buffer *previous;
767
768 specbind (Qinhibit_modification_hooks, Qt);
769
770 {
771 PRINTDECLARE;
772
773 /* Save and restore this--we are altering a buffer
774 but we don't want to deactivate the mark just for that.
775 No need for specbind, since errors deactivate the mark. */
776 save_deactivate_mark = Vdeactivate_mark;
777 /* GCPRO2 (object, save_deactivate_mark); */
778 abort_on_gc++;
779
780 printcharfun = Vprin1_to_string_buffer;
781 PRINTPREPARE;
782 print (object, printcharfun, NILP (noescape));
783 /* Make Vprin1_to_string_buffer be the default buffer after PRINTFINSH */
784 PRINTFINISH;
785 }
786
787 previous = current_buffer;
788 set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
789 object = Fbuffer_string ();
790 if (SBYTES (object) == SCHARS (object))
791 STRING_SET_UNIBYTE (object);
792
793 /* Note that this won't make prepare_to_modify_buffer call
794 ask-user-about-supersession-threat because this buffer
795 does not visit a file. */
796 Ferase_buffer ();
797 set_buffer_internal (previous);
798
799 Vdeactivate_mark = save_deactivate_mark;
800 /* UNGCPRO; */
801
802 abort_on_gc--;
803 return unbind_to (count, object);
804 }
805
806 DEFUN ("princ", Fprinc, Sprinc, 1, 2, 0,
807 doc: /* Output the printed representation of OBJECT, any Lisp object.
808 No quoting characters are used; no delimiters are printed around
809 the contents of strings.
810
811 OBJECT is any of the Lisp data types: a number, a string, a symbol,
812 a list, a buffer, a window, a frame, etc.
813
814 A printed representation of an object is text which describes that object.
815
816 Optional argument PRINTCHARFUN is the output stream, which can be one
817 of these:
818
819 - a buffer, in which case output is inserted into that buffer at point;
820 - a marker, in which case output is inserted at marker's position;
821 - a function, in which case that function is called once for each
822 character of OBJECT's printed representation;
823 - a symbol, in which case that symbol's function definition is called; or
824 - t, in which case the output is displayed in the echo area.
825
826 If PRINTCHARFUN is omitted, the value of `standard-output' (which see)
827 is used instead. */)
828 (object, printcharfun)
829 Lisp_Object object, printcharfun;
830 {
831 PRINTDECLARE;
832
833 if (NILP (printcharfun))
834 printcharfun = Vstandard_output;
835 PRINTPREPARE;
836 print (object, printcharfun, 0);
837 PRINTFINISH;
838 return object;
839 }
840
841 DEFUN ("print", Fprint, Sprint, 1, 2, 0,
842 doc: /* Output the printed representation of OBJECT, with newlines around it.
843 Quoting characters are printed when needed to make output that `read'
844 can handle, whenever this is possible. For complex objects, the behavior
845 is controlled by `print-level' and `print-length', which see.
846
847 OBJECT is any of the Lisp data types: a number, a string, a symbol,
848 a list, a buffer, a window, a frame, etc.
849
850 A printed representation of an object is text which describes that object.
851
852 Optional argument PRINTCHARFUN is the output stream, which can be one
853 of these:
854
855 - a buffer, in which case output is inserted into that buffer at point;
856 - a marker, in which case output is inserted at marker's position;
857 - a function, in which case that function is called once for each
858 character of OBJECT's printed representation;
859 - a symbol, in which case that symbol's function definition is called; or
860 - t, in which case the output is displayed in the echo area.
861
862 If PRINTCHARFUN is omitted, the value of `standard-output' (which see)
863 is used instead. */)
864 (object, printcharfun)
865 Lisp_Object object, printcharfun;
866 {
867 PRINTDECLARE;
868 struct gcpro gcpro1;
869
870 #ifdef MAX_PRINT_CHARS
871 print_chars = 0;
872 max_print = MAX_PRINT_CHARS;
873 #endif /* MAX_PRINT_CHARS */
874 if (NILP (printcharfun))
875 printcharfun = Vstandard_output;
876 GCPRO1 (object);
877 PRINTPREPARE;
878 PRINTCHAR ('\n');
879 print (object, printcharfun, 1);
880 PRINTCHAR ('\n');
881 PRINTFINISH;
882 #ifdef MAX_PRINT_CHARS
883 max_print = 0;
884 print_chars = 0;
885 #endif /* MAX_PRINT_CHARS */
886 UNGCPRO;
887 return object;
888 }
889
890 /* The subroutine object for external-debugging-output is kept here
891 for the convenience of the debugger. */
892 Lisp_Object Qexternal_debugging_output;
893
894 DEFUN ("external-debugging-output", Fexternal_debugging_output, Sexternal_debugging_output, 1, 1, 0,
895 doc: /* Write CHARACTER to stderr.
896 You can call print while debugging emacs, and pass it this function
897 to make it write to the debugging output. */)
898 (character)
899 Lisp_Object character;
900 {
901 CHECK_NUMBER (character);
902 putc (XINT (character), stderr);
903
904 #ifdef WINDOWSNT
905 /* Send the output to a debugger (nothing happens if there isn't one). */
906 {
907 char buf[2] = {(char) XINT (character), '\0'};
908 OutputDebugString (buf);
909 }
910 #endif
911
912 return character;
913 }
914
915
916 #if defined(GNU_LINUX)
917
918 /* This functionality is not vitally important in general, so we rely on
919 non-portable ability to use stderr as lvalue. */
920
921 #define WITH_REDIRECT_DEBUGGING_OUTPUT 1
922
923 FILE *initial_stderr_stream = NULL;
924
925 DEFUN ("redirect-debugging-output", Fredirect_debugging_output, Sredirect_debugging_output,
926 1, 2,
927 "FDebug output file: \nP",
928 doc: /* Redirect debugging output (stderr stream) to file FILE.
929 If FILE is nil, reset target to the initial stderr stream.
930 Optional arg APPEND non-nil (interactively, with prefix arg) means
931 append to existing target file. */)
932 (file, append)
933 Lisp_Object file, append;
934 {
935 if (initial_stderr_stream != NULL)
936 fclose(stderr);
937 stderr = initial_stderr_stream;
938 initial_stderr_stream = NULL;
939
940 if (STRINGP (file))
941 {
942 file = Fexpand_file_name (file, Qnil);
943 initial_stderr_stream = stderr;
944 stderr = fopen(SDATA (file), NILP (append) ? "w" : "a");
945 if (stderr == NULL)
946 {
947 stderr = initial_stderr_stream;
948 initial_stderr_stream = NULL;
949 report_file_error ("Cannot open debugging output stream",
950 Fcons (file, Qnil));
951 }
952 }
953 return Qnil;
954 }
955 #endif /* GNU_LINUX */
956
957
958 /* This is the interface for debugging printing. */
959
960 void
961 debug_print (arg)
962 Lisp_Object arg;
963 {
964 Fprin1 (arg, Qexternal_debugging_output);
965 fprintf (stderr, "\r\n");
966 }
967 \f
968 DEFUN ("error-message-string", Ferror_message_string, Serror_message_string,
969 1, 1, 0,
970 doc: /* Convert an error value (ERROR-SYMBOL . DATA) to an error message.
971 See Info anchor `(elisp)Definition of signal' for some details on how this
972 error message is constructed. */)
973 (obj)
974 Lisp_Object obj;
975 {
976 struct buffer *old = current_buffer;
977 Lisp_Object value;
978 struct gcpro gcpro1;
979
980 /* If OBJ is (error STRING), just return STRING.
981 That is not only faster, it also avoids the need to allocate
982 space here when the error is due to memory full. */
983 if (CONSP (obj) && EQ (XCAR (obj), Qerror)
984 && CONSP (XCDR (obj))
985 && STRINGP (XCAR (XCDR (obj)))
986 && NILP (XCDR (XCDR (obj))))
987 return XCAR (XCDR (obj));
988
989 print_error_message (obj, Vprin1_to_string_buffer, 0, Qnil);
990
991 set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
992 value = Fbuffer_string ();
993
994 GCPRO1 (value);
995 Ferase_buffer ();
996 set_buffer_internal (old);
997 UNGCPRO;
998
999 return value;
1000 }
1001
1002 /* Print an error message for the error DATA onto Lisp output stream
1003 STREAM (suitable for the print functions). */
1004
1005 void
1006 print_error_message (data, stream, context, caller)
1007 Lisp_Object data, stream;
1008 char *context;
1009 Lisp_Object caller;
1010 {
1011 Lisp_Object errname, errmsg, file_error, tail;
1012 struct gcpro gcpro1;
1013 int i;
1014
1015 if (context != 0)
1016 write_string_1 (context, -1, stream);
1017
1018 /* If we know from where the error was signaled, show it in
1019 *Messages*. */
1020 if (!NILP (caller) && SYMBOLP (caller))
1021 {
1022 const char *name = SDATA (SYMBOL_NAME (caller));
1023 message_dolog (name, strlen (name), 0, 0);
1024 message_dolog (": ", 2, 0, 0);
1025 }
1026
1027 errname = Fcar (data);
1028
1029 if (EQ (errname, Qerror))
1030 {
1031 data = Fcdr (data);
1032 if (!CONSP (data))
1033 data = Qnil;
1034 errmsg = Fcar (data);
1035 file_error = Qnil;
1036 }
1037 else
1038 {
1039 Lisp_Object error_conditions;
1040 errmsg = Fget (errname, Qerror_message);
1041 error_conditions = Fget (errname, Qerror_conditions);
1042 file_error = Fmemq (Qfile_error, error_conditions);
1043 }
1044
1045 /* Print an error message including the data items. */
1046
1047 tail = Fcdr_safe (data);
1048 GCPRO1 (tail);
1049
1050 /* For file-error, make error message by concatenating
1051 all the data items. They are all strings. */
1052 if (!NILP (file_error) && CONSP (tail))
1053 errmsg = XCAR (tail), tail = XCDR (tail);
1054
1055 if (STRINGP (errmsg))
1056 Fprinc (errmsg, stream);
1057 else
1058 write_string_1 ("peculiar error", -1, stream);
1059
1060 for (i = 0; CONSP (tail); tail = XCDR (tail), i++)
1061 {
1062 Lisp_Object obj;
1063
1064 write_string_1 (i ? ", " : ": ", 2, stream);
1065 obj = XCAR (tail);
1066 if (!NILP (file_error) || EQ (errname, Qend_of_file))
1067 Fprinc (obj, stream);
1068 else
1069 Fprin1 (obj, stream);
1070 }
1071
1072 UNGCPRO;
1073 }
1074
1075
1076 \f
1077 /*
1078 * The buffer should be at least as large as the max string size of the
1079 * largest float, printed in the biggest notation. This is undoubtedly
1080 * 20d float_output_format, with the negative of the C-constant "HUGE"
1081 * from <math.h>.
1082 *
1083 * On the vax the worst case is -1e38 in 20d format which takes 61 bytes.
1084 *
1085 * I assume that IEEE-754 format numbers can take 329 bytes for the worst
1086 * case of -1e307 in 20d float_output_format. What is one to do (short of
1087 * re-writing _doprnt to be more sane)?
1088 * -wsr
1089 */
1090
1091 void
1092 float_to_string (buf, data)
1093 unsigned char *buf;
1094 double data;
1095 {
1096 unsigned char *cp;
1097 int width;
1098
1099 /* Check for plus infinity in a way that won't lose
1100 if there is no plus infinity. */
1101 if (data == data / 2 && data > 1.0)
1102 {
1103 strcpy (buf, "1.0e+INF");
1104 return;
1105 }
1106 /* Likewise for minus infinity. */
1107 if (data == data / 2 && data < -1.0)
1108 {
1109 strcpy (buf, "-1.0e+INF");
1110 return;
1111 }
1112 /* Check for NaN in a way that won't fail if there are no NaNs. */
1113 if (! (data * 0.0 >= 0.0))
1114 {
1115 /* Prepend "-" if the NaN's sign bit is negative.
1116 The sign bit of a double is the bit that is 1 in -0.0. */
1117 int i;
1118 union { double d; char c[sizeof (double)]; } u_data, u_minus_zero;
1119 u_data.d = data;
1120 u_minus_zero.d = - 0.0;
1121 for (i = 0; i < sizeof (double); i++)
1122 if (u_data.c[i] & u_minus_zero.c[i])
1123 {
1124 *buf++ = '-';
1125 break;
1126 }
1127
1128 strcpy (buf, "0.0e+NaN");
1129 return;
1130 }
1131
1132 if (NILP (Vfloat_output_format)
1133 || !STRINGP (Vfloat_output_format))
1134 lose:
1135 {
1136 /* Generate the fewest number of digits that represent the
1137 floating point value without losing information.
1138 The following method is simple but a bit slow.
1139 For ideas about speeding things up, please see:
1140
1141 Guy L Steele Jr & Jon L White, How to print floating-point numbers
1142 accurately. SIGPLAN notices 25, 6 (June 1990), 112-126.
1143
1144 Robert G Burger & R Kent Dybvig, Printing floating point numbers
1145 quickly and accurately, SIGPLAN notices 31, 5 (May 1996), 108-116. */
1146
1147 width = fabs (data) < DBL_MIN ? 1 : DBL_DIG;
1148 do
1149 sprintf (buf, "%.*g", width, data);
1150 while (width++ < DOUBLE_DIGITS_BOUND && atof (buf) != data);
1151 }
1152 else /* oink oink */
1153 {
1154 /* Check that the spec we have is fully valid.
1155 This means not only valid for printf,
1156 but meant for floats, and reasonable. */
1157 cp = SDATA (Vfloat_output_format);
1158
1159 if (cp[0] != '%')
1160 goto lose;
1161 if (cp[1] != '.')
1162 goto lose;
1163
1164 cp += 2;
1165
1166 /* Check the width specification. */
1167 width = -1;
1168 if ('0' <= *cp && *cp <= '9')
1169 {
1170 width = 0;
1171 do
1172 width = (width * 10) + (*cp++ - '0');
1173 while (*cp >= '0' && *cp <= '9');
1174
1175 /* A precision of zero is valid only for %f. */
1176 if (width > DBL_DIG
1177 || (width == 0 && *cp != 'f'))
1178 goto lose;
1179 }
1180
1181 if (*cp != 'e' && *cp != 'f' && *cp != 'g')
1182 goto lose;
1183
1184 if (cp[1] != 0)
1185 goto lose;
1186
1187 sprintf (buf, SDATA (Vfloat_output_format), data);
1188 }
1189
1190 /* Make sure there is a decimal point with digit after, or an
1191 exponent, so that the value is readable as a float. But don't do
1192 this with "%.0f"; it's valid for that not to produce a decimal
1193 point. Note that width can be 0 only for %.0f. */
1194 if (width != 0)
1195 {
1196 for (cp = buf; *cp; cp++)
1197 if ((*cp < '0' || *cp > '9') && *cp != '-')
1198 break;
1199
1200 if (*cp == '.' && cp[1] == 0)
1201 {
1202 cp[1] = '0';
1203 cp[2] = 0;
1204 }
1205
1206 if (*cp == 0)
1207 {
1208 *cp++ = '.';
1209 *cp++ = '0';
1210 *cp++ = 0;
1211 }
1212 }
1213 }
1214
1215 \f
1216 static void
1217 print (obj, printcharfun, escapeflag)
1218 Lisp_Object obj;
1219 register Lisp_Object printcharfun;
1220 int escapeflag;
1221 {
1222 print_depth = 0;
1223 old_backquote_output = 0;
1224
1225 /* Reset print_number_index and Vprint_number_table only when
1226 the variable Vprint_continuous_numbering is nil. Otherwise,
1227 the values of these variables will be kept between several
1228 print functions. */
1229 if (NILP (Vprint_continuous_numbering))
1230 {
1231 print_number_index = 0;
1232 Vprint_number_table = Qnil;
1233 }
1234
1235 /* Construct Vprint_number_table for print-gensym and print-circle. */
1236 if (!NILP (Vprint_gensym) || !NILP (Vprint_circle))
1237 {
1238 int i, start, index;
1239 start = index = print_number_index;
1240 /* Construct Vprint_number_table.
1241 This increments print_number_index for the objects added. */
1242 print_preprocess (obj);
1243
1244 /* Remove unnecessary objects, which appear only once in OBJ;
1245 that is, whose status is Qnil. Compactify the necessary objects. */
1246 for (i = start; i < print_number_index; i++)
1247 if (!NILP (PRINT_NUMBER_STATUS (Vprint_number_table, i)))
1248 {
1249 PRINT_NUMBER_OBJECT (Vprint_number_table, index)
1250 = PRINT_NUMBER_OBJECT (Vprint_number_table, i);
1251 index++;
1252 }
1253
1254 /* Clear out objects outside the active part of the table. */
1255 for (i = index; i < print_number_index; i++)
1256 PRINT_NUMBER_OBJECT (Vprint_number_table, i) = Qnil;
1257
1258 /* Reset the status field for the next print step. Now this
1259 field means whether the object has already been printed. */
1260 for (i = start; i < print_number_index; i++)
1261 PRINT_NUMBER_STATUS (Vprint_number_table, i) = Qnil;
1262
1263 print_number_index = index;
1264 }
1265
1266 print_object (obj, printcharfun, escapeflag);
1267 }
1268
1269 /* Construct Vprint_number_table according to the structure of OBJ.
1270 OBJ itself and all its elements will be added to Vprint_number_table
1271 recursively if it is a list, vector, compiled function, char-table,
1272 string (its text properties will be traced), or a symbol that has
1273 no obarray (this is for the print-gensym feature).
1274 The status fields of Vprint_number_table mean whether each object appears
1275 more than once in OBJ: Qnil at the first time, and Qt after that . */
1276 static void
1277 print_preprocess (obj)
1278 Lisp_Object obj;
1279 {
1280 int i, size;
1281
1282 loop:
1283 if (STRINGP (obj) || CONSP (obj) || VECTORP (obj)
1284 || COMPILEDP (obj) || CHAR_TABLE_P (obj)
1285 || (! NILP (Vprint_gensym)
1286 && SYMBOLP (obj)
1287 && !SYMBOL_INTERNED_P (obj)))
1288 {
1289 /* In case print-circle is nil and print-gensym is t,
1290 add OBJ to Vprint_number_table only when OBJ is a symbol. */
1291 if (! NILP (Vprint_circle) || SYMBOLP (obj))
1292 {
1293 for (i = 0; i < print_number_index; i++)
1294 if (EQ (PRINT_NUMBER_OBJECT (Vprint_number_table, i), obj))
1295 {
1296 /* OBJ appears more than once. Let's remember that. */
1297 PRINT_NUMBER_STATUS (Vprint_number_table, i) = Qt;
1298 return;
1299 }
1300
1301 /* OBJ is not yet recorded. Let's add to the table. */
1302 if (print_number_index == 0)
1303 {
1304 /* Initialize the table. */
1305 Vprint_number_table = Fmake_vector (make_number (40), Qnil);
1306 }
1307 else if (XVECTOR (Vprint_number_table)->size == print_number_index * 2)
1308 {
1309 /* Reallocate the table. */
1310 int i = print_number_index * 4;
1311 Lisp_Object old_table = Vprint_number_table;
1312 Vprint_number_table = Fmake_vector (make_number (i), Qnil);
1313 for (i = 0; i < print_number_index; i++)
1314 {
1315 PRINT_NUMBER_OBJECT (Vprint_number_table, i)
1316 = PRINT_NUMBER_OBJECT (old_table, i);
1317 PRINT_NUMBER_STATUS (Vprint_number_table, i)
1318 = PRINT_NUMBER_STATUS (old_table, i);
1319 }
1320 }
1321 PRINT_NUMBER_OBJECT (Vprint_number_table, print_number_index) = obj;
1322 /* If Vprint_continuous_numbering is non-nil and OBJ is a gensym,
1323 always print the gensym with a number. This is a special for
1324 the lisp function byte-compile-output-docform. */
1325 if (!NILP (Vprint_continuous_numbering)
1326 && SYMBOLP (obj)
1327 && !SYMBOL_INTERNED_P (obj))
1328 PRINT_NUMBER_STATUS (Vprint_number_table, print_number_index) = Qt;
1329 print_number_index++;
1330 }
1331
1332 switch (XGCTYPE (obj))
1333 {
1334 case Lisp_String:
1335 /* A string may have text properties, which can be circular. */
1336 traverse_intervals_noorder (STRING_INTERVALS (obj),
1337 print_preprocess_string, Qnil);
1338 break;
1339
1340 case Lisp_Cons:
1341 print_preprocess (XCAR (obj));
1342 obj = XCDR (obj);
1343 goto loop;
1344
1345 case Lisp_Vectorlike:
1346 size = XVECTOR (obj)->size & PSEUDOVECTOR_SIZE_MASK;
1347 for (i = 0; i < size; i++)
1348 print_preprocess (XVECTOR (obj)->contents[i]);
1349 break;
1350
1351 default:
1352 break;
1353 }
1354 }
1355 }
1356
1357 static void
1358 print_preprocess_string (interval, arg)
1359 INTERVAL interval;
1360 Lisp_Object arg;
1361 {
1362 print_preprocess (interval->plist);
1363 }
1364
1365 static void
1366 print_object (obj, printcharfun, escapeflag)
1367 Lisp_Object obj;
1368 register Lisp_Object printcharfun;
1369 int escapeflag;
1370 {
1371 char buf[30];
1372
1373 QUIT;
1374
1375 /* Detect circularities and truncate them. */
1376 if (STRINGP (obj) || CONSP (obj) || VECTORP (obj)
1377 || COMPILEDP (obj) || CHAR_TABLE_P (obj)
1378 || (! NILP (Vprint_gensym)
1379 && SYMBOLP (obj)
1380 && !SYMBOL_INTERNED_P (obj)))
1381 {
1382 if (NILP (Vprint_circle) && NILP (Vprint_gensym))
1383 {
1384 /* Simple but incomplete way. */
1385 int i;
1386 for (i = 0; i < print_depth; i++)
1387 if (EQ (obj, being_printed[i]))
1388 {
1389 sprintf (buf, "#%d", i);
1390 strout (buf, -1, -1, printcharfun, 0);
1391 return;
1392 }
1393 being_printed[print_depth] = obj;
1394 }
1395 else
1396 {
1397 /* With the print-circle feature. */
1398 int i;
1399 for (i = 0; i < print_number_index; i++)
1400 if (EQ (PRINT_NUMBER_OBJECT (Vprint_number_table, i), obj))
1401 {
1402 if (NILP (PRINT_NUMBER_STATUS (Vprint_number_table, i)))
1403 {
1404 /* Add a prefix #n= if OBJ has not yet been printed;
1405 that is, its status field is nil. */
1406 sprintf (buf, "#%d=", i + 1);
1407 strout (buf, -1, -1, printcharfun, 0);
1408 /* OBJ is going to be printed. Set the status to t. */
1409 PRINT_NUMBER_STATUS (Vprint_number_table, i) = Qt;
1410 break;
1411 }
1412 else
1413 {
1414 /* Just print #n# if OBJ has already been printed. */
1415 sprintf (buf, "#%d#", i + 1);
1416 strout (buf, -1, -1, printcharfun, 0);
1417 return;
1418 }
1419 }
1420 }
1421 }
1422
1423 print_depth++;
1424
1425 if (print_depth > PRINT_CIRCLE)
1426 error ("Apparently circular structure being printed");
1427 #ifdef MAX_PRINT_CHARS
1428 if (max_print && print_chars > max_print)
1429 {
1430 PRINTCHAR ('\n');
1431 print_chars = 0;
1432 }
1433 #endif /* MAX_PRINT_CHARS */
1434
1435 switch (XGCTYPE (obj))
1436 {
1437 case Lisp_Int:
1438 if (sizeof (int) == sizeof (EMACS_INT))
1439 sprintf (buf, "%d", XINT (obj));
1440 else if (sizeof (long) == sizeof (EMACS_INT))
1441 sprintf (buf, "%ld", (long) XINT (obj));
1442 else
1443 abort ();
1444 strout (buf, -1, -1, printcharfun, 0);
1445 break;
1446
1447 case Lisp_Float:
1448 {
1449 char pigbuf[350]; /* see comments in float_to_string */
1450
1451 float_to_string (pigbuf, XFLOAT_DATA (obj));
1452 strout (pigbuf, -1, -1, printcharfun, 0);
1453 }
1454 break;
1455
1456 case Lisp_String:
1457 if (!escapeflag)
1458 print_string (obj, printcharfun);
1459 else
1460 {
1461 register int i, i_byte;
1462 struct gcpro gcpro1;
1463 unsigned char *str;
1464 int size_byte;
1465 /* 1 means we must ensure that the next character we output
1466 cannot be taken as part of a hex character escape. */
1467 int need_nonhex = 0;
1468 int multibyte = STRING_MULTIBYTE (obj);
1469
1470 GCPRO1 (obj);
1471
1472 if (!NULL_INTERVAL_P (STRING_INTERVALS (obj)))
1473 {
1474 PRINTCHAR ('#');
1475 PRINTCHAR ('(');
1476 }
1477
1478 PRINTCHAR ('\"');
1479 str = SDATA (obj);
1480 size_byte = SBYTES (obj);
1481
1482 for (i = 0, i_byte = 0; i_byte < size_byte;)
1483 {
1484 /* Here, we must convert each multi-byte form to the
1485 corresponding character code before handing it to PRINTCHAR. */
1486 int len;
1487 int c;
1488
1489 if (multibyte)
1490 {
1491 c = STRING_CHAR_AND_LENGTH (str + i_byte,
1492 size_byte - i_byte, len);
1493 if (CHAR_VALID_P (c, 0))
1494 i_byte += len;
1495 else
1496 c = str[i_byte++];
1497 }
1498 else
1499 c = str[i_byte++];
1500
1501 QUIT;
1502
1503 if (c == '\n' && print_escape_newlines)
1504 {
1505 PRINTCHAR ('\\');
1506 PRINTCHAR ('n');
1507 }
1508 else if (c == '\f' && print_escape_newlines)
1509 {
1510 PRINTCHAR ('\\');
1511 PRINTCHAR ('f');
1512 }
1513 else if (multibyte
1514 && ! ASCII_BYTE_P (c)
1515 && (SINGLE_BYTE_CHAR_P (c) || print_escape_multibyte))
1516 {
1517 /* When multibyte is disabled,
1518 print multibyte string chars using hex escapes.
1519 For a char code that could be in a unibyte string,
1520 when found in a multibyte string, always use a hex escape
1521 so it reads back as multibyte. */
1522 unsigned char outbuf[50];
1523 sprintf (outbuf, "\\x%x", c);
1524 strout (outbuf, -1, -1, printcharfun, 0);
1525 need_nonhex = 1;
1526 }
1527 else if (! multibyte
1528 && SINGLE_BYTE_CHAR_P (c) && ! ASCII_BYTE_P (c)
1529 && print_escape_nonascii)
1530 {
1531 /* When printing in a multibyte buffer
1532 or when explicitly requested,
1533 print single-byte non-ASCII string chars
1534 using octal escapes. */
1535 unsigned char outbuf[5];
1536 sprintf (outbuf, "\\%03o", c);
1537 strout (outbuf, -1, -1, printcharfun, 0);
1538 }
1539 else
1540 {
1541 /* If we just had a hex escape, and this character
1542 could be taken as part of it,
1543 output `\ ' to prevent that. */
1544 if (need_nonhex)
1545 {
1546 need_nonhex = 0;
1547 if ((c >= 'a' && c <= 'f')
1548 || (c >= 'A' && c <= 'F')
1549 || (c >= '0' && c <= '9'))
1550 strout ("\\ ", -1, -1, printcharfun, 0);
1551 }
1552
1553 if (c == '\"' || c == '\\')
1554 PRINTCHAR ('\\');
1555 PRINTCHAR (c);
1556 }
1557 }
1558 PRINTCHAR ('\"');
1559
1560 if (!NULL_INTERVAL_P (STRING_INTERVALS (obj)))
1561 {
1562 traverse_intervals (STRING_INTERVALS (obj),
1563 0, print_interval, printcharfun);
1564 PRINTCHAR (')');
1565 }
1566
1567 UNGCPRO;
1568 }
1569 break;
1570
1571 case Lisp_Symbol:
1572 {
1573 register int confusing;
1574 register unsigned char *p = SDATA (SYMBOL_NAME (obj));
1575 register unsigned char *end = p + SBYTES (SYMBOL_NAME (obj));
1576 register int c;
1577 int i, i_byte, size_byte;
1578 Lisp_Object name;
1579
1580 name = SYMBOL_NAME (obj);
1581
1582 if (p != end && (*p == '-' || *p == '+')) p++;
1583 if (p == end)
1584 confusing = 0;
1585 /* If symbol name begins with a digit, and ends with a digit,
1586 and contains nothing but digits and `e', it could be treated
1587 as a number. So set CONFUSING.
1588
1589 Symbols that contain periods could also be taken as numbers,
1590 but periods are always escaped, so we don't have to worry
1591 about them here. */
1592 else if (*p >= '0' && *p <= '9'
1593 && end[-1] >= '0' && end[-1] <= '9')
1594 {
1595 while (p != end && ((*p >= '0' && *p <= '9')
1596 /* Needed for \2e10. */
1597 || *p == 'e'))
1598 p++;
1599 confusing = (end == p);
1600 }
1601 else
1602 confusing = 0;
1603
1604 if (! NILP (Vprint_gensym) && !SYMBOL_INTERNED_P (obj))
1605 {
1606 PRINTCHAR ('#');
1607 PRINTCHAR (':');
1608 }
1609
1610 size_byte = SBYTES (name);
1611
1612 for (i = 0, i_byte = 0; i_byte < size_byte;)
1613 {
1614 /* Here, we must convert each multi-byte form to the
1615 corresponding character code before handing it to PRINTCHAR. */
1616 FETCH_STRING_CHAR_ADVANCE (c, name, i, i_byte);
1617 QUIT;
1618
1619 if (escapeflag)
1620 {
1621 if (c == '\"' || c == '\\' || c == '\''
1622 || c == ';' || c == '#' || c == '(' || c == ')'
1623 || c == ',' || c =='.' || c == '`'
1624 || c == '[' || c == ']' || c == '?' || c <= 040
1625 || confusing)
1626 PRINTCHAR ('\\'), confusing = 0;
1627 }
1628 PRINTCHAR (c);
1629 }
1630 }
1631 break;
1632
1633 case Lisp_Cons:
1634 /* If deeper than spec'd depth, print placeholder. */
1635 if (INTEGERP (Vprint_level)
1636 && print_depth > XINT (Vprint_level))
1637 strout ("...", -1, -1, printcharfun, 0);
1638 else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
1639 && (EQ (XCAR (obj), Qquote)))
1640 {
1641 PRINTCHAR ('\'');
1642 print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
1643 }
1644 else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
1645 && (EQ (XCAR (obj), Qfunction)))
1646 {
1647 PRINTCHAR ('#');
1648 PRINTCHAR ('\'');
1649 print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
1650 }
1651 else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
1652 && ! old_backquote_output
1653 && ((EQ (XCAR (obj), Qbackquote)
1654 || EQ (XCAR (obj), Qcomma)
1655 || EQ (XCAR (obj), Qcomma_at)
1656 || EQ (XCAR (obj), Qcomma_dot))))
1657 {
1658 print_object (XCAR (obj), printcharfun, 0);
1659 print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
1660 }
1661 else
1662 {
1663 PRINTCHAR ('(');
1664
1665 /* If the first element is a backquote form,
1666 print it old-style so it won't be misunderstood. */
1667 if (print_quoted && CONSP (XCAR (obj))
1668 && CONSP (XCDR (XCAR (obj)))
1669 && NILP (XCDR (XCDR (XCAR (obj))))
1670 && EQ (XCAR (XCAR (obj)), Qbackquote))
1671 {
1672 Lisp_Object tem;
1673 tem = XCAR (obj);
1674 PRINTCHAR ('(');
1675
1676 print_object (Qbackquote, printcharfun, 0);
1677 PRINTCHAR (' ');
1678
1679 ++old_backquote_output;
1680 print_object (XCAR (XCDR (tem)), printcharfun, 0);
1681 --old_backquote_output;
1682 PRINTCHAR (')');
1683
1684 obj = XCDR (obj);
1685 }
1686
1687 {
1688 int print_length, i;
1689 Lisp_Object halftail = obj;
1690
1691 /* Negative values of print-length are invalid in CL.
1692 Treat them like nil, as CMUCL does. */
1693 if (NATNUMP (Vprint_length))
1694 print_length = XFASTINT (Vprint_length);
1695 else
1696 print_length = 0;
1697
1698 i = 0;
1699 while (CONSP (obj))
1700 {
1701 /* Detect circular list. */
1702 if (NILP (Vprint_circle))
1703 {
1704 /* Simple but imcomplete way. */
1705 if (i != 0 && EQ (obj, halftail))
1706 {
1707 sprintf (buf, " . #%d", i / 2);
1708 strout (buf, -1, -1, printcharfun, 0);
1709 goto end_of_list;
1710 }
1711 }
1712 else
1713 {
1714 /* With the print-circle feature. */
1715 if (i != 0)
1716 {
1717 int i;
1718 for (i = 0; i < print_number_index; i++)
1719 if (EQ (PRINT_NUMBER_OBJECT (Vprint_number_table, i),
1720 obj))
1721 {
1722 if (NILP (PRINT_NUMBER_STATUS (Vprint_number_table, i)))
1723 {
1724 strout (" . ", 3, 3, printcharfun, 0);
1725 print_object (obj, printcharfun, escapeflag);
1726 }
1727 else
1728 {
1729 sprintf (buf, " . #%d#", i + 1);
1730 strout (buf, -1, -1, printcharfun, 0);
1731 }
1732 goto end_of_list;
1733 }
1734 }
1735 }
1736
1737 if (i++)
1738 PRINTCHAR (' ');
1739
1740 if (print_length && i > print_length)
1741 {
1742 strout ("...", 3, 3, printcharfun, 0);
1743 goto end_of_list;
1744 }
1745
1746 print_object (XCAR (obj), printcharfun, escapeflag);
1747
1748 obj = XCDR (obj);
1749 if (!(i & 1))
1750 halftail = XCDR (halftail);
1751 }
1752 }
1753
1754 /* OBJ non-nil here means it's the end of a dotted list. */
1755 if (!NILP (obj))
1756 {
1757 strout (" . ", 3, 3, printcharfun, 0);
1758 print_object (obj, printcharfun, escapeflag);
1759 }
1760
1761 end_of_list:
1762 PRINTCHAR (')');
1763 }
1764 break;
1765
1766 case Lisp_Vectorlike:
1767 if (PROCESSP (obj))
1768 {
1769 if (escapeflag)
1770 {
1771 strout ("#<process ", -1, -1, printcharfun, 0);
1772 print_string (XPROCESS (obj)->name, printcharfun);
1773 PRINTCHAR ('>');
1774 }
1775 else
1776 print_string (XPROCESS (obj)->name, printcharfun);
1777 }
1778 else if (BOOL_VECTOR_P (obj))
1779 {
1780 register int i;
1781 register unsigned char c;
1782 struct gcpro gcpro1;
1783 int size_in_chars
1784 = (XBOOL_VECTOR (obj)->size + BITS_PER_CHAR - 1) / BITS_PER_CHAR;
1785
1786 GCPRO1 (obj);
1787
1788 PRINTCHAR ('#');
1789 PRINTCHAR ('&');
1790 sprintf (buf, "%d", XBOOL_VECTOR (obj)->size);
1791 strout (buf, -1, -1, printcharfun, 0);
1792 PRINTCHAR ('\"');
1793
1794 /* Don't print more characters than the specified maximum.
1795 Negative values of print-length are invalid. Treat them
1796 like a print-length of nil. */
1797 if (NATNUMP (Vprint_length)
1798 && XFASTINT (Vprint_length) < size_in_chars)
1799 size_in_chars = XFASTINT (Vprint_length);
1800
1801 for (i = 0; i < size_in_chars; i++)
1802 {
1803 QUIT;
1804 c = XBOOL_VECTOR (obj)->data[i];
1805 if (c == '\n' && print_escape_newlines)
1806 {
1807 PRINTCHAR ('\\');
1808 PRINTCHAR ('n');
1809 }
1810 else if (c == '\f' && print_escape_newlines)
1811 {
1812 PRINTCHAR ('\\');
1813 PRINTCHAR ('f');
1814 }
1815 else
1816 {
1817 if (c == '\"' || c == '\\')
1818 PRINTCHAR ('\\');
1819 PRINTCHAR (c);
1820 }
1821 }
1822 PRINTCHAR ('\"');
1823
1824 UNGCPRO;
1825 }
1826 else if (SUBRP (obj))
1827 {
1828 strout ("#<subr ", -1, -1, printcharfun, 0);
1829 strout (XSUBR (obj)->symbol_name, -1, -1, printcharfun, 0);
1830 PRINTCHAR ('>');
1831 }
1832 else if (WINDOWP (obj))
1833 {
1834 strout ("#<window ", -1, -1, printcharfun, 0);
1835 sprintf (buf, "%d", XFASTINT (XWINDOW (obj)->sequence_number));
1836 strout (buf, -1, -1, printcharfun, 0);
1837 if (!NILP (XWINDOW (obj)->buffer))
1838 {
1839 strout (" on ", -1, -1, printcharfun, 0);
1840 print_string (XBUFFER (XWINDOW (obj)->buffer)->name, printcharfun);
1841 }
1842 PRINTCHAR ('>');
1843 }
1844 else if (HASH_TABLE_P (obj))
1845 {
1846 struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
1847 strout ("#<hash-table", -1, -1, printcharfun, 0);
1848 if (SYMBOLP (h->test))
1849 {
1850 PRINTCHAR (' ');
1851 PRINTCHAR ('\'');
1852 strout (SDATA (SYMBOL_NAME (h->test)), -1, -1, printcharfun, 0);
1853 PRINTCHAR (' ');
1854 strout (SDATA (SYMBOL_NAME (h->weak)), -1, -1, printcharfun, 0);
1855 PRINTCHAR (' ');
1856 sprintf (buf, "%d/%d", XFASTINT (h->count),
1857 XVECTOR (h->next)->size);
1858 strout (buf, -1, -1, printcharfun, 0);
1859 }
1860 sprintf (buf, " 0x%lx", (unsigned long) h);
1861 strout (buf, -1, -1, printcharfun, 0);
1862 PRINTCHAR ('>');
1863 }
1864 else if (BUFFERP (obj))
1865 {
1866 if (NILP (XBUFFER (obj)->name))
1867 strout ("#<killed buffer>", -1, -1, printcharfun, 0);
1868 else if (escapeflag)
1869 {
1870 strout ("#<buffer ", -1, -1, printcharfun, 0);
1871 print_string (XBUFFER (obj)->name, printcharfun);
1872 PRINTCHAR ('>');
1873 }
1874 else
1875 print_string (XBUFFER (obj)->name, printcharfun);
1876 }
1877 else if (WINDOW_CONFIGURATIONP (obj))
1878 {
1879 strout ("#<window-configuration>", -1, -1, printcharfun, 0);
1880 }
1881 else if (FRAMEP (obj))
1882 {
1883 strout ((FRAME_LIVE_P (XFRAME (obj))
1884 ? "#<frame " : "#<dead frame "),
1885 -1, -1, printcharfun, 0);
1886 print_string (XFRAME (obj)->name, printcharfun);
1887 sprintf (buf, " 0x%lx", (unsigned long) (XFRAME (obj)));
1888 strout (buf, -1, -1, printcharfun, 0);
1889 PRINTCHAR ('>');
1890 }
1891 else
1892 {
1893 int size = XVECTOR (obj)->size;
1894 if (COMPILEDP (obj))
1895 {
1896 PRINTCHAR ('#');
1897 size &= PSEUDOVECTOR_SIZE_MASK;
1898 }
1899 if (CHAR_TABLE_P (obj))
1900 {
1901 /* We print a char-table as if it were a vector,
1902 lumping the parent and default slots in with the
1903 character slots. But we add #^ as a prefix. */
1904 PRINTCHAR ('#');
1905 PRINTCHAR ('^');
1906 if (SUB_CHAR_TABLE_P (obj))
1907 PRINTCHAR ('^');
1908 size &= PSEUDOVECTOR_SIZE_MASK;
1909 }
1910 if (size & PSEUDOVECTOR_FLAG)
1911 goto badtype;
1912
1913 PRINTCHAR ('[');
1914 {
1915 register int i;
1916 register Lisp_Object tem;
1917 int real_size = size;
1918
1919 /* Don't print more elements than the specified maximum. */
1920 if (NATNUMP (Vprint_length)
1921 && XFASTINT (Vprint_length) < size)
1922 size = XFASTINT (Vprint_length);
1923
1924 for (i = 0; i < size; i++)
1925 {
1926 if (i) PRINTCHAR (' ');
1927 tem = XVECTOR (obj)->contents[i];
1928 print_object (tem, printcharfun, escapeflag);
1929 }
1930 if (size < real_size)
1931 strout (" ...", 4, 4, printcharfun, 0);
1932 }
1933 PRINTCHAR (']');
1934 }
1935 break;
1936
1937 case Lisp_Misc:
1938 switch (XMISCTYPE (obj))
1939 {
1940 case Lisp_Misc_Marker:
1941 strout ("#<marker ", -1, -1, printcharfun, 0);
1942 /* Do you think this is necessary? */
1943 if (XMARKER (obj)->insertion_type != 0)
1944 strout ("(moves after insertion) ", -1, -1, printcharfun, 0);
1945 if (!(XMARKER (obj)->buffer))
1946 strout ("in no buffer", -1, -1, printcharfun, 0);
1947 else
1948 {
1949 sprintf (buf, "at %d", marker_position (obj));
1950 strout (buf, -1, -1, printcharfun, 0);
1951 strout (" in ", -1, -1, printcharfun, 0);
1952 print_string (XMARKER (obj)->buffer->name, printcharfun);
1953 }
1954 PRINTCHAR ('>');
1955 break;
1956
1957 case Lisp_Misc_Overlay:
1958 strout ("#<overlay ", -1, -1, printcharfun, 0);
1959 if (!(XMARKER (OVERLAY_START (obj))->buffer))
1960 strout ("in no buffer", -1, -1, printcharfun, 0);
1961 else
1962 {
1963 sprintf (buf, "from %d to %d in ",
1964 marker_position (OVERLAY_START (obj)),
1965 marker_position (OVERLAY_END (obj)));
1966 strout (buf, -1, -1, printcharfun, 0);
1967 print_string (XMARKER (OVERLAY_START (obj))->buffer->name,
1968 printcharfun);
1969 }
1970 PRINTCHAR ('>');
1971 break;
1972
1973 /* Remaining cases shouldn't happen in normal usage, but let's print
1974 them anyway for the benefit of the debugger. */
1975 case Lisp_Misc_Free:
1976 strout ("#<misc free cell>", -1, -1, printcharfun, 0);
1977 break;
1978
1979 case Lisp_Misc_Intfwd:
1980 sprintf (buf, "#<intfwd to %d>", *XINTFWD (obj)->intvar);
1981 strout (buf, -1, -1, printcharfun, 0);
1982 break;
1983
1984 case Lisp_Misc_Boolfwd:
1985 sprintf (buf, "#<boolfwd to %s>",
1986 (*XBOOLFWD (obj)->boolvar ? "t" : "nil"));
1987 strout (buf, -1, -1, printcharfun, 0);
1988 break;
1989
1990 case Lisp_Misc_Objfwd:
1991 strout ("#<objfwd to ", -1, -1, printcharfun, 0);
1992 print_object (*XOBJFWD (obj)->objvar, printcharfun, escapeflag);
1993 PRINTCHAR ('>');
1994 break;
1995
1996 case Lisp_Misc_Buffer_Objfwd:
1997 strout ("#<buffer_objfwd to ", -1, -1, printcharfun, 0);
1998 print_object (PER_BUFFER_VALUE (current_buffer,
1999 XBUFFER_OBJFWD (obj)->offset),
2000 printcharfun, escapeflag);
2001 PRINTCHAR ('>');
2002 break;
2003
2004 case Lisp_Misc_Kboard_Objfwd:
2005 strout ("#<kboard_objfwd to ", -1, -1, printcharfun, 0);
2006 print_object (*(Lisp_Object *)((char *) current_kboard
2007 + XKBOARD_OBJFWD (obj)->offset),
2008 printcharfun, escapeflag);
2009 PRINTCHAR ('>');
2010 break;
2011
2012 case Lisp_Misc_Buffer_Local_Value:
2013 strout ("#<buffer_local_value ", -1, -1, printcharfun, 0);
2014 goto do_buffer_local;
2015 case Lisp_Misc_Some_Buffer_Local_Value:
2016 strout ("#<some_buffer_local_value ", -1, -1, printcharfun, 0);
2017 do_buffer_local:
2018 strout ("[realvalue] ", -1, -1, printcharfun, 0);
2019 print_object (XBUFFER_LOCAL_VALUE (obj)->realvalue,
2020 printcharfun, escapeflag);
2021 if (XBUFFER_LOCAL_VALUE (obj)->found_for_buffer)
2022 strout ("[local in buffer] ", -1, -1, printcharfun, 0);
2023 else
2024 strout ("[buffer] ", -1, -1, printcharfun, 0);
2025 print_object (XBUFFER_LOCAL_VALUE (obj)->buffer,
2026 printcharfun, escapeflag);
2027 if (XBUFFER_LOCAL_VALUE (obj)->check_frame)
2028 {
2029 if (XBUFFER_LOCAL_VALUE (obj)->found_for_frame)
2030 strout ("[local in frame] ", -1, -1, printcharfun, 0);
2031 else
2032 strout ("[frame] ", -1, -1, printcharfun, 0);
2033 print_object (XBUFFER_LOCAL_VALUE (obj)->frame,
2034 printcharfun, escapeflag);
2035 }
2036 strout ("[alist-elt] ", -1, -1, printcharfun, 0);
2037 print_object (XCAR (XBUFFER_LOCAL_VALUE (obj)->cdr),
2038 printcharfun, escapeflag);
2039 strout ("[default-value] ", -1, -1, printcharfun, 0);
2040 print_object (XCDR (XBUFFER_LOCAL_VALUE (obj)->cdr),
2041 printcharfun, escapeflag);
2042 PRINTCHAR ('>');
2043 break;
2044
2045 default:
2046 goto badtype;
2047 }
2048 break;
2049
2050 default:
2051 badtype:
2052 {
2053 /* We're in trouble if this happens!
2054 Probably should just abort () */
2055 strout ("#<EMACS BUG: INVALID DATATYPE ", -1, -1, printcharfun, 0);
2056 if (MISCP (obj))
2057 sprintf (buf, "(MISC 0x%04x)", (int) XMISCTYPE (obj));
2058 else if (VECTORLIKEP (obj))
2059 sprintf (buf, "(PVEC 0x%08x)", (int) XVECTOR (obj)->size);
2060 else
2061 sprintf (buf, "(0x%02x)", (int) XTYPE (obj));
2062 strout (buf, -1, -1, printcharfun, 0);
2063 strout (" Save your buffers immediately and please report this bug>",
2064 -1, -1, printcharfun, 0);
2065 }
2066 }
2067
2068 print_depth--;
2069 }
2070 \f
2071
2072 /* Print a description of INTERVAL using PRINTCHARFUN.
2073 This is part of printing a string that has text properties. */
2074
2075 void
2076 print_interval (interval, printcharfun)
2077 INTERVAL interval;
2078 Lisp_Object printcharfun;
2079 {
2080 PRINTCHAR (' ');
2081 print_object (make_number (interval->position), printcharfun, 1);
2082 PRINTCHAR (' ');
2083 print_object (make_number (interval->position + LENGTH (interval)),
2084 printcharfun, 1);
2085 PRINTCHAR (' ');
2086 print_object (interval->plist, printcharfun, 1);
2087 }
2088
2089 \f
2090 void
2091 syms_of_print ()
2092 {
2093 Qtemp_buffer_setup_hook = intern ("temp-buffer-setup-hook");
2094 staticpro (&Qtemp_buffer_setup_hook);
2095
2096 DEFVAR_LISP ("standard-output", &Vstandard_output,
2097 doc: /* Output stream `print' uses by default for outputting a character.
2098 This may be any function of one argument.
2099 It may also be a buffer (output is inserted before point)
2100 or a marker (output is inserted and the marker is advanced)
2101 or the symbol t (output appears in the echo area). */);
2102 Vstandard_output = Qt;
2103 Qstandard_output = intern ("standard-output");
2104 staticpro (&Qstandard_output);
2105
2106 DEFVAR_LISP ("float-output-format", &Vfloat_output_format,
2107 doc: /* The format descriptor string used to print floats.
2108 This is a %-spec like those accepted by `printf' in C,
2109 but with some restrictions. It must start with the two characters `%.'.
2110 After that comes an integer precision specification,
2111 and then a letter which controls the format.
2112 The letters allowed are `e', `f' and `g'.
2113 Use `e' for exponential notation \"DIG.DIGITSeEXPT\"
2114 Use `f' for decimal point notation \"DIGITS.DIGITS\".
2115 Use `g' to choose the shorter of those two formats for the number at hand.
2116 The precision in any of these cases is the number of digits following
2117 the decimal point. With `f', a precision of 0 means to omit the
2118 decimal point. 0 is not allowed with `e' or `g'.
2119
2120 A value of nil means to use the shortest notation
2121 that represents the number without losing information. */);
2122 Vfloat_output_format = Qnil;
2123 Qfloat_output_format = intern ("float-output-format");
2124 staticpro (&Qfloat_output_format);
2125
2126 DEFVAR_LISP ("print-length", &Vprint_length,
2127 doc: /* Maximum length of list to print before abbreviating.
2128 A value of nil means no limit. See also `eval-expression-print-length'. */);
2129 Vprint_length = Qnil;
2130
2131 DEFVAR_LISP ("print-level", &Vprint_level,
2132 doc: /* Maximum depth of list nesting to print before abbreviating.
2133 A value of nil means no limit. See also `eval-expression-print-level'. */);
2134 Vprint_level = Qnil;
2135
2136 DEFVAR_BOOL ("print-escape-newlines", &print_escape_newlines,
2137 doc: /* Non-nil means print newlines in strings as `\\n'.
2138 Also print formfeeds as `\\f'. */);
2139 print_escape_newlines = 0;
2140
2141 DEFVAR_BOOL ("print-escape-nonascii", &print_escape_nonascii,
2142 doc: /* Non-nil means print unibyte non-ASCII chars in strings as \\OOO.
2143 \(OOO is the octal representation of the character code.)
2144 Only single-byte characters are affected, and only in `prin1'.
2145 When the output goes in a multibyte buffer, this feature is
2146 enabled regardless of the value of the variable. */);
2147 print_escape_nonascii = 0;
2148
2149 DEFVAR_BOOL ("print-escape-multibyte", &print_escape_multibyte,
2150 doc: /* Non-nil means print multibyte characters in strings as \\xXXXX.
2151 \(XXXX is the hex representation of the character code.)
2152 This affects only `prin1'. */);
2153 print_escape_multibyte = 0;
2154
2155 DEFVAR_BOOL ("print-quoted", &print_quoted,
2156 doc: /* Non-nil means print quoted forms with reader syntax.
2157 I.e., (quote foo) prints as 'foo, (function foo) as #'foo, and backquoted
2158 forms print as in the new syntax. */);
2159 print_quoted = 0;
2160
2161 DEFVAR_LISP ("print-gensym", &Vprint_gensym,
2162 doc: /* Non-nil means print uninterned symbols so they will read as uninterned.
2163 I.e., the value of (make-symbol \"foobar\") prints as #:foobar.
2164 When the uninterned symbol appears within a recursive data structure,
2165 and the symbol appears more than once, in addition use the #N# and #N=
2166 constructs as needed, so that multiple references to the same symbol are
2167 shared once again when the text is read back. */);
2168 Vprint_gensym = Qnil;
2169
2170 DEFVAR_LISP ("print-circle", &Vprint_circle,
2171 doc: /* *Non-nil means print recursive structures using #N= and #N# syntax.
2172 If nil, printing proceeds recursively and may lead to
2173 `max-lisp-eval-depth' being exceeded or an error may occur:
2174 \"Apparently circular structure being printed.\" Also see
2175 `print-length' and `print-level'.
2176 If non-nil, shared substructures anywhere in the structure are printed
2177 with `#N=' before the first occurrence (in the order of the print
2178 representation) and `#N#' in place of each subsequent occurrence,
2179 where N is a positive decimal integer. */);
2180 Vprint_circle = Qnil;
2181
2182 DEFVAR_LISP ("print-continuous-numbering", &Vprint_continuous_numbering,
2183 doc: /* *Non-nil means number continuously across print calls.
2184 This affects the numbers printed for #N= labels and #M# references.
2185 See also `print-circle', `print-gensym', and `print-number-table'.
2186 This variable should not be set with `setq'; bind it with a `let' instead. */);
2187 Vprint_continuous_numbering = Qnil;
2188
2189 DEFVAR_LISP ("print-number-table", &Vprint_number_table,
2190 doc: /* A vector used internally to produce `#N=' labels and `#N#' references.
2191 The Lisp printer uses this vector to detect Lisp objects referenced more
2192 than once.
2193
2194 When you bind `print-continuous-numbering' to t, you should probably
2195 also bind `print-number-table' to nil. This ensures that the value of
2196 `print-number-table' can be garbage-collected once the printing is
2197 done. If all elements of `print-number-table' are nil, it means that
2198 the printing done so far has not found any shared structure or objects
2199 that need to be recorded in the table. */);
2200 Vprint_number_table = Qnil;
2201
2202 /* prin1_to_string_buffer initialized in init_buffer_once in buffer.c */
2203 staticpro (&Vprin1_to_string_buffer);
2204
2205 defsubr (&Sprin1);
2206 defsubr (&Sprin1_to_string);
2207 defsubr (&Serror_message_string);
2208 defsubr (&Sprinc);
2209 defsubr (&Sprint);
2210 defsubr (&Sterpri);
2211 defsubr (&Swrite_char);
2212 defsubr (&Sexternal_debugging_output);
2213 #ifdef WITH_REDIRECT_DEBUGGING_OUTPUT
2214 defsubr (&Sredirect_debugging_output);
2215 #endif
2216
2217 Qexternal_debugging_output = intern ("external-debugging-output");
2218 staticpro (&Qexternal_debugging_output);
2219
2220 Qprint_escape_newlines = intern ("print-escape-newlines");
2221 staticpro (&Qprint_escape_newlines);
2222
2223 Qprint_escape_multibyte = intern ("print-escape-multibyte");
2224 staticpro (&Qprint_escape_multibyte);
2225
2226 Qprint_escape_nonascii = intern ("print-escape-nonascii");
2227 staticpro (&Qprint_escape_nonascii);
2228
2229 defsubr (&Swith_output_to_temp_buffer);
2230 }
2231
2232 /* arch-tag: bc797170-94ae-41de-86e3-75e20f8f7a39
2233 (do not change this comment) */