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