#include <config.h>
#include <stdio.h>
#include "lisp.h"
#include "buffer.h"
#include "charset.h"
#include "keyboard.h"
#include "frame.h"
#include "window.h"
#include "process.h"
#include "dispextern.h"
#include "termchar.h"
#include "intervals.h"
#include "blockinput.h"
Lisp_Object Vstandard_output, Qstandard_output;
Lisp_Object Qtemp_buffer_setup_hook;
extern Lisp_Object Qbackquote, Qcomma, Qcomma_at, Qcomma_dot, Qfunction;
Lisp_Object Vfloat_output_format, Qfloat_output_format;
#if defined (HPUX) && !defined (HPUX8)
#define _MAXLDBL print_maxldbl
#define _NMAXLDBL print_nmaxldbl
#endif
#include <math.h>
#if STDC_HEADERS
#include <float.h>
#endif
#ifndef FLT_RADIX
#define FLT_RADIX 2
#endif
#ifndef DBL_MANT_DIG
#define DBL_MANT_DIG 53
#endif
#ifndef DBL_DIG
#define DBL_DIG 15
#endif
#ifndef DBL_MIN
#define DBL_MIN 2.2250738585072014e-308
#endif
#ifdef DBL_MIN_REPLACEMENT
#undef DBL_MIN
#define DBL_MIN DBL_MIN_REPLACEMENT
#endif
#if FLT_RADIX == 2 && DBL_MANT_DIG == 53
#define DOUBLE_DIGITS_BOUND 17
#else
#define DOUBLE_DIGITS_BOUND ((int) ceil (log10 (pow (FLT_RADIX, DBL_MANT_DIG))))
#endif
int print_depth;
int old_backquote_output;
#define PRINT_CIRCLE 200
Lisp_Object being_printed[PRINT_CIRCLE];
char *print_buffer;
int print_buffer_size;
int print_buffer_pos;
int print_buffer_pos_byte;
Lisp_Object Vprint_length;
Lisp_Object Vprint_level;
int print_escape_newlines;
int print_escape_nonascii;
int print_escape_multibyte;
Lisp_Object Qprint_escape_newlines;
Lisp_Object Qprint_escape_multibyte, Qprint_escape_nonascii;
int print_quoted;
Lisp_Object Vprint_gensym;
Lisp_Object Vprint_circle;
Lisp_Object Vprint_continuous_numbering;
int print_number_index;
Lisp_Object Vprint_number_table;
#define PRINT_NUMBER_OBJECT(table,i) XVECTOR ((table))->contents[(i) * 2]
#define PRINT_NUMBER_STATUS(table,i) XVECTOR ((table))->contents[(i) * 2 + 1]
extern int noninteractive_need_newline;
extern int minibuffer_auto_raise;
#ifdef MAX_PRINT_CHARS
static int print_chars;
static int max_print;
#endif
void print_interval ();
int print_output_debug_flag = 1;
#define PRINTDECLARE \
struct buffer *old = current_buffer; \
int old_point = -1, start_point = -1; \
int old_point_byte = -1, start_point_byte = -1; \
int specpdl_count = SPECPDL_INDEX (); \
int free_print_buffer = 0; \
int multibyte = !NILP (current_buffer->enable_multibyte_characters); \
Lisp_Object original
#define PRINTPREPARE \
original = printcharfun; \
if (NILP (printcharfun)) printcharfun = Qt; \
if (BUFFERP (printcharfun)) \
{ \
if (XBUFFER (printcharfun) != current_buffer) \
Fset_buffer (printcharfun); \
printcharfun = Qnil; \
} \
if (MARKERP (printcharfun)) \
{ \
EMACS_INT marker_pos; \
if (! XMARKER (printcharfun)->buffer) \
error ("Marker does not point anywhere"); \
if (XMARKER (printcharfun)->buffer != current_buffer) \
set_buffer_internal (XMARKER (printcharfun)->buffer); \
marker_pos = marker_position (printcharfun); \
if (marker_pos < BEGV || marker_pos > ZV) \
error ("Marker is outside the accessible part of the buffer"); \
old_point = PT; \
old_point_byte = PT_BYTE; \
SET_PT_BOTH (marker_pos, \
marker_byte_position (printcharfun)); \
start_point = PT; \
start_point_byte = PT_BYTE; \
printcharfun = Qnil; \
} \
if (NILP (printcharfun)) \
{ \
Lisp_Object string; \
if (NILP (current_buffer->enable_multibyte_characters) \
&& ! print_escape_multibyte) \
specbind (Qprint_escape_multibyte, Qt); \
if (! NILP (current_buffer->enable_multibyte_characters) \
&& ! print_escape_nonascii) \
specbind (Qprint_escape_nonascii, Qt); \
if (print_buffer != 0) \
{ \
string = make_string_from_bytes (print_buffer, \
print_buffer_pos, \
print_buffer_pos_byte); \
record_unwind_protect (print_unwind, string); \
} \
else \
{ \
print_buffer_size = 1000; \
print_buffer = (char *) xmalloc (print_buffer_size); \
free_print_buffer = 1; \
} \
print_buffer_pos = 0; \
print_buffer_pos_byte = 0; \
} \
if (EQ (printcharfun, Qt) && ! noninteractive) \
setup_echo_area_for_printing (multibyte);
#define PRINTFINISH \
if (NILP (printcharfun)) \
{ \
if (print_buffer_pos != print_buffer_pos_byte \
&& NILP (current_buffer->enable_multibyte_characters)) \
{ \
unsigned char *temp \
= (unsigned char *) alloca (print_buffer_pos + 1); \
copy_text (print_buffer, temp, print_buffer_pos_byte, \
1, 0); \
insert_1_both (temp, print_buffer_pos, \
print_buffer_pos, 0, 1, 0); \
} \
else \
insert_1_both (print_buffer, print_buffer_pos, \
print_buffer_pos_byte, 0, 1, 0); \
signal_after_change (PT - print_buffer_pos, 0, print_buffer_pos);\
} \
if (free_print_buffer) \
{ \
xfree (print_buffer); \
print_buffer = 0; \
} \
unbind_to (specpdl_count, Qnil); \
if (MARKERP (original)) \
set_marker_both (original, Qnil, PT, PT_BYTE); \
if (old_point >= 0) \
SET_PT_BOTH (old_point + (old_point >= start_point \
? PT - start_point : 0), \
old_point_byte + (old_point_byte >= start_point_byte \
? PT_BYTE - start_point_byte : 0)); \
if (old != current_buffer) \
set_buffer_internal (old);
#define PRINTCHAR(ch) printchar (ch, printcharfun)
static Lisp_Object
print_unwind (saved_text)
Lisp_Object saved_text;
{
bcopy (SDATA (saved_text), print_buffer, SCHARS (saved_text));
return Qnil;
}
static void
printchar (ch, fun)
unsigned int ch;
Lisp_Object fun;
{
#ifdef MAX_PRINT_CHARS
if (max_print)
print_chars++;
#endif
if (!NILP (fun) && !EQ (fun, Qt))
call1 (fun, make_number (ch));
else
{
unsigned char str[MAX_MULTIBYTE_LENGTH];
int len = CHAR_STRING (ch, str);
QUIT;
if (NILP (fun))
{
if (print_buffer_pos_byte + len >= print_buffer_size)
print_buffer = (char *) xrealloc (print_buffer,
print_buffer_size *= 2);
bcopy (str, print_buffer + print_buffer_pos_byte, len);
print_buffer_pos += 1;
print_buffer_pos_byte += len;
}
else if (noninteractive)
{
fwrite (str, 1, len, stdout);
noninteractive_need_newline = 1;
}
else
{
int multibyte_p
= !NILP (current_buffer->enable_multibyte_characters);
setup_echo_area_for_printing (multibyte_p);
insert_char (ch);
message_dolog (str, len, 0, multibyte_p);
}
}
}
static void
strout (ptr, size, size_byte, printcharfun, multibyte)
char *ptr;
int size, size_byte;
Lisp_Object printcharfun;
int multibyte;
{
if (size < 0)
size_byte = size = strlen (ptr);
if (NILP (printcharfun))
{
if (print_buffer_pos_byte + size_byte > print_buffer_size)
{
print_buffer_size = print_buffer_size * 2 + size_byte;
print_buffer = (char *) xrealloc (print_buffer,
print_buffer_size);
}
bcopy (ptr, print_buffer + print_buffer_pos_byte, size_byte);
print_buffer_pos += size;
print_buffer_pos_byte += size_byte;
#ifdef MAX_PRINT_CHARS
if (max_print)
print_chars += size;
#endif
}
else if (noninteractive && EQ (printcharfun, Qt))
{
fwrite (ptr, 1, size_byte, stdout);
noninteractive_need_newline = 1;
}
else if (EQ (printcharfun, Qt))
{
int i;
int multibyte_p
= !NILP (current_buffer->enable_multibyte_characters);
setup_echo_area_for_printing (multibyte_p);
message_dolog (ptr, size_byte, 0, multibyte_p);
if (size == size_byte)
{
for (i = 0; i < size; ++i)
insert_char ((unsigned char) *ptr++);
}
else
{
int len;
for (i = 0; i < size_byte; i += len)
{
int ch = STRING_CHAR_AND_LENGTH (ptr + i, size_byte - i, len);
insert_char (ch);
}
}
#ifdef MAX_PRINT_CHARS
if (max_print)
print_chars += size;
#endif
}
else
{
int i = 0;
if (size == size_byte)
{
while (i < size_byte)
{
int ch = ptr[i++];
PRINTCHAR (ch);
}
}
else
{
while (i < size_byte)
{
int len;
int ch = STRING_CHAR_AND_LENGTH (ptr + i, size_byte - i, len);
PRINTCHAR (ch);
i += len;
}
}
}
}
static void
print_string (string, printcharfun)
Lisp_Object string;
Lisp_Object printcharfun;
{
if (EQ (printcharfun, Qt) || NILP (printcharfun))
{
int chars;
if (STRING_MULTIBYTE (string))
chars = SCHARS (string);
else if (EQ (printcharfun, Qt)
? ! NILP (buffer_defaults.enable_multibyte_characters)
: ! NILP (current_buffer->enable_multibyte_characters))
{
Lisp_Object newstr;
int bytes;
chars = SBYTES (string);
bytes = parse_str_to_multibyte (SDATA (string), chars);
if (chars < bytes)
{
newstr = make_uninit_multibyte_string (chars, bytes);
bcopy (SDATA (string), SDATA (newstr), chars);
str_to_multibyte (SDATA (newstr), bytes, chars);
string = newstr;
}
}
else
chars = SBYTES (string);
if (EQ (printcharfun, Qt))
{
int nbytes = SBYTES (string);
char *buffer;
USE_SAFE_ALLOCA;
SAFE_ALLOCA (buffer, char *, nbytes);
bcopy (SDATA (string), buffer, nbytes);
strout (buffer, chars, SBYTES (string),
printcharfun, STRING_MULTIBYTE (string));
SAFE_FREE ();
}
else
strout (SDATA (string),
chars, SBYTES (string),
printcharfun, STRING_MULTIBYTE (string));
}
else
{
int i;
int size = SCHARS (string);
int size_byte = SBYTES (string);
struct gcpro gcpro1;
GCPRO1 (string);
if (size == size_byte)
for (i = 0; i < size; i++)
PRINTCHAR (SREF (string, i));
else
for (i = 0; i < size_byte; )
{
int len;
int ch = STRING_CHAR_AND_LENGTH (SDATA (string) + i,
size_byte - i, len);
if (!CHAR_VALID_P (ch, 0))
{
ch = SREF (string, i);
len = 1;
}
PRINTCHAR (ch);
i += len;
}
UNGCPRO;
}
}
DEFUN ("write-char", Fwrite_char, Swrite_char, 1, 2, 0,
doc: )
(character, printcharfun)
Lisp_Object character, printcharfun;
{
PRINTDECLARE;
if (NILP (printcharfun))
printcharfun = Vstandard_output;
CHECK_NUMBER (character);
PRINTPREPARE;
PRINTCHAR (XINT (character));
PRINTFINISH;
return character;
}
void
write_string (data, size)
char *data;
int size;
{
PRINTDECLARE;
Lisp_Object printcharfun;
printcharfun = Vstandard_output;
PRINTPREPARE;
strout (data, size, size, printcharfun, 0);
PRINTFINISH;
}
void
write_string_1 (data, size, printcharfun)
char *data;
int size;
Lisp_Object printcharfun;
{
PRINTDECLARE;
PRINTPREPARE;
strout (data, size, size, printcharfun, 0);
PRINTFINISH;
}
void
temp_output_buffer_setup (bufname)
const char *bufname;
{
int count = SPECPDL_INDEX ();
register struct buffer *old = current_buffer;
register Lisp_Object buf;
record_unwind_protect (set_buffer_if_live, Fcurrent_buffer ());
Fset_buffer (Fget_buffer_create (build_string (bufname)));
Fkill_all_local_variables ();
delete_all_overlays (current_buffer);
current_buffer->directory = old->directory;
current_buffer->read_only = Qnil;
current_buffer->filename = Qnil;
current_buffer->undo_list = Qt;
eassert (current_buffer->overlays_before == NULL);
eassert (current_buffer->overlays_after == NULL);
current_buffer->enable_multibyte_characters
= buffer_defaults.enable_multibyte_characters;
specbind (Qinhibit_read_only, Qt);
specbind (Qinhibit_modification_hooks, Qt);
Ferase_buffer ();
XSETBUFFER (buf, current_buffer);
Frun_hooks (1, &Qtemp_buffer_setup_hook);
unbind_to (count, Qnil);
specbind (Qstandard_output, buf);
}
Lisp_Object
internal_with_output_to_temp_buffer (bufname, function, args)
const char *bufname;
Lisp_Object (*function) P_ ((Lisp_Object));
Lisp_Object args;
{
int count = SPECPDL_INDEX ();
Lisp_Object buf, val;
struct gcpro gcpro1;
GCPRO1 (args);
record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
temp_output_buffer_setup (bufname);
buf = Vstandard_output;
UNGCPRO;
val = (*function) (args);
GCPRO1 (val);
temp_output_buffer_show (buf);
UNGCPRO;
return unbind_to (count, val);
}
DEFUN ("with-output-to-temp-buffer",
Fwith_output_to_temp_buffer, Swith_output_to_temp_buffer,
1, UNEVALLED, 0,
doc: )
(args)
Lisp_Object args;
{
struct gcpro gcpro1;
Lisp_Object name;
int count = SPECPDL_INDEX ();
Lisp_Object buf, val;
GCPRO1(args);
name = Feval (Fcar (args));
CHECK_STRING (name);
temp_output_buffer_setup (SDATA (name));
buf = Vstandard_output;
UNGCPRO;
val = Fprogn (XCDR (args));
GCPRO1 (val);
temp_output_buffer_show (buf);
UNGCPRO;
return unbind_to (count, val);
}
static void print ();
static void print_preprocess ();
static void print_preprocess_string ();
static void print_object ();
DEFUN ("terpri", Fterpri, Sterpri, 0, 1, 0,
doc: )
(printcharfun)
Lisp_Object printcharfun;
{
PRINTDECLARE;
if (NILP (printcharfun))
printcharfun = Vstandard_output;
PRINTPREPARE;
PRINTCHAR ('\n');
PRINTFINISH;
return Qt;
}
DEFUN ("prin1", Fprin1, Sprin1, 1, 2, 0,
doc: )
(object, printcharfun)
Lisp_Object object, printcharfun;
{
PRINTDECLARE;
#ifdef MAX_PRINT_CHARS
max_print = 0;
#endif
if (NILP (printcharfun))
printcharfun = Vstandard_output;
PRINTPREPARE;
print (object, printcharfun, 1);
PRINTFINISH;
return object;
}
Lisp_Object Vprin1_to_string_buffer;
DEFUN ("prin1-to-string", Fprin1_to_string, Sprin1_to_string, 1, 2, 0,
doc: )
(object, noescape)
Lisp_Object object, noescape;
{
Lisp_Object printcharfun;
Lisp_Object save_deactivate_mark;
int count = SPECPDL_INDEX ();
struct buffer *previous;
specbind (Qinhibit_modification_hooks, Qt);
{
PRINTDECLARE;
save_deactivate_mark = Vdeactivate_mark;
abort_on_gc++;
printcharfun = Vprin1_to_string_buffer;
PRINTPREPARE;
print (object, printcharfun, NILP (noescape));
PRINTFINISH;
}
previous = current_buffer;
set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
object = Fbuffer_string ();
if (SBYTES (object) == SCHARS (object))
STRING_SET_UNIBYTE (object);
Ferase_buffer ();
set_buffer_internal (previous);
Vdeactivate_mark = save_deactivate_mark;
abort_on_gc--;
return unbind_to (count, object);
}
DEFUN ("princ", Fprinc, Sprinc, 1, 2, 0,
doc: )
(object, printcharfun)
Lisp_Object object, printcharfun;
{
PRINTDECLARE;
if (NILP (printcharfun))
printcharfun = Vstandard_output;
PRINTPREPARE;
print (object, printcharfun, 0);
PRINTFINISH;
return object;
}
DEFUN ("print", Fprint, Sprint, 1, 2, 0,
doc: )
(object, printcharfun)
Lisp_Object object, printcharfun;
{
PRINTDECLARE;
struct gcpro gcpro1;
#ifdef MAX_PRINT_CHARS
print_chars = 0;
max_print = MAX_PRINT_CHARS;
#endif
if (NILP (printcharfun))
printcharfun = Vstandard_output;
GCPRO1 (object);
PRINTPREPARE;
PRINTCHAR ('\n');
print (object, printcharfun, 1);
PRINTCHAR ('\n');
PRINTFINISH;
#ifdef MAX_PRINT_CHARS
max_print = 0;
print_chars = 0;
#endif
UNGCPRO;
return object;
}
Lisp_Object Qexternal_debugging_output;
DEFUN ("external-debugging-output", Fexternal_debugging_output, Sexternal_debugging_output, 1, 1, 0,
doc: )
(character)
Lisp_Object character;
{
CHECK_NUMBER (character);
putc (XINT (character), stderr);
#ifdef WINDOWSNT
if (print_output_debug_flag)
{
char buf[2] = {(char) XINT (character), '\0'};
OutputDebugString (buf);
}
#endif
return character;
}
void
debug_output_compilation_hack (x)
int x;
{
print_output_debug_flag = x;
}
#if defined (GNU_LINUX)
#define WITH_REDIRECT_DEBUGGING_OUTPUT 1
FILE *initial_stderr_stream = NULL;
DEFUN ("redirect-debugging-output", Fredirect_debugging_output, Sredirect_debugging_output,
1, 2,
"FDebug output file: \nP",
doc: )
(file, append)
Lisp_Object file, append;
{
if (initial_stderr_stream != NULL)
{
BLOCK_INPUT;
fclose (stderr);
UNBLOCK_INPUT;
}
stderr = initial_stderr_stream;
initial_stderr_stream = NULL;
if (STRINGP (file))
{
file = Fexpand_file_name (file, Qnil);
initial_stderr_stream = stderr;
stderr = fopen (SDATA (file), NILP (append) ? "w" : "a");
if (stderr == NULL)
{
stderr = initial_stderr_stream;
initial_stderr_stream = NULL;
report_file_error ("Cannot open debugging output stream",
Fcons (file, Qnil));
}
}
return Qnil;
}
#endif
void
debug_print (arg)
Lisp_Object arg;
{
Fprin1 (arg, Qexternal_debugging_output);
fprintf (stderr, "\r\n");
}
void
safe_debug_print (arg)
Lisp_Object arg;
{
int valid = valid_lisp_object_p (arg);
if (valid > 0)
debug_print (arg);
else
fprintf (stderr, "#<%s_LISP_OBJECT 0x%08lx>\r\n",
!valid ? "INVALID" : "SOME",
#ifdef NO_UNION_TYPE
(unsigned long) arg
#else
(unsigned long) arg.i
#endif
);
}
DEFUN ("error-message-string", Ferror_message_string, Serror_message_string,
1, 1, 0,
doc: )
(obj)
Lisp_Object obj;
{
struct buffer *old = current_buffer;
Lisp_Object value;
struct gcpro gcpro1;
if (CONSP (obj) && EQ (XCAR (obj), Qerror)
&& CONSP (XCDR (obj))
&& STRINGP (XCAR (XCDR (obj)))
&& NILP (XCDR (XCDR (obj))))
return XCAR (XCDR (obj));
print_error_message (obj, Vprin1_to_string_buffer, 0, Qnil);
set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
value = Fbuffer_string ();
GCPRO1 (value);
Ferase_buffer ();
set_buffer_internal (old);
UNGCPRO;
return value;
}
void
print_error_message (data, stream, context, caller)
Lisp_Object data, stream;
char *context;
Lisp_Object caller;
{
Lisp_Object errname, errmsg, file_error, tail;
struct gcpro gcpro1;
int i;
if (context != 0)
write_string_1 (context, -1, stream);
if (!NILP (caller) && SYMBOLP (caller))
{
Lisp_Object cname = SYMBOL_NAME (caller);
char *name = alloca (SBYTES (cname));
bcopy (SDATA (cname), name, SBYTES (cname));
message_dolog (name, SBYTES (cname), 0, 0);
message_dolog (": ", 2, 0, 0);
}
errname = Fcar (data);
if (EQ (errname, Qerror))
{
data = Fcdr (data);
if (!CONSP (data))
data = Qnil;
errmsg = Fcar (data);
file_error = Qnil;
}
else
{
Lisp_Object error_conditions;
errmsg = Fget (errname, Qerror_message);
error_conditions = Fget (errname, Qerror_conditions);
file_error = Fmemq (Qfile_error, error_conditions);
}
tail = Fcdr_safe (data);
GCPRO1 (tail);
if (!NILP (file_error) && CONSP (tail))
errmsg = XCAR (tail), tail = XCDR (tail);
if (STRINGP (errmsg))
Fprinc (errmsg, stream);
else
write_string_1 ("peculiar error", -1, stream);
for (i = 0; CONSP (tail); tail = XCDR (tail), i++)
{
Lisp_Object obj;
write_string_1 (i ? ", " : ": ", 2, stream);
obj = XCAR (tail);
if (!NILP (file_error) || EQ (errname, Qend_of_file))
Fprinc (obj, stream);
else
Fprin1 (obj, stream);
}
UNGCPRO;
}
void
float_to_string (buf, data)
unsigned char *buf;
double data;
{
unsigned char *cp;
int width;
if (data == data / 2 && data > 1.0)
{
strcpy (buf, "1.0e+INF");
return;
}
if (data == data / 2 && data < -1.0)
{
strcpy (buf, "-1.0e+INF");
return;
}
if (! (data * 0.0 >= 0.0))
{
int i;
union { double d; char c[sizeof (double)]; } u_data, u_minus_zero;
u_data.d = data;
u_minus_zero.d = - 0.0;
for (i = 0; i < sizeof (double); i++)
if (u_data.c[i] & u_minus_zero.c[i])
{
*buf++ = '-';
break;
}
strcpy (buf, "0.0e+NaN");
return;
}
if (NILP (Vfloat_output_format)
|| !STRINGP (Vfloat_output_format))
lose:
{
width = fabs (data) < DBL_MIN ? 1 : DBL_DIG;
do
sprintf (buf, "%.*g", width, data);
while (width++ < DOUBLE_DIGITS_BOUND && atof (buf) != data);
}
else
{
cp = SDATA (Vfloat_output_format);
if (cp[0] != '%')
goto lose;
if (cp[1] != '.')
goto lose;
cp += 2;
width = -1;
if ('0' <= *cp && *cp <= '9')
{
width = 0;
do
width = (width * 10) + (*cp++ - '0');
while (*cp >= '0' && *cp <= '9');
if (width > DBL_DIG
|| (width == 0 && *cp != 'f'))
goto lose;
}
if (*cp != 'e' && *cp != 'f' && *cp != 'g')
goto lose;
if (cp[1] != 0)
goto lose;
sprintf (buf, SDATA (Vfloat_output_format), data);
}
if (width != 0)
{
for (cp = buf; *cp; cp++)
if ((*cp < '0' || *cp > '9') && *cp != '-')
break;
if (*cp == '.' && cp[1] == 0)
{
cp[1] = '0';
cp[2] = 0;
}
if (*cp == 0)
{
*cp++ = '.';
*cp++ = '0';
*cp++ = 0;
}
}
}
static void
print (obj, printcharfun, escapeflag)
Lisp_Object obj;
register Lisp_Object printcharfun;
int escapeflag;
{
old_backquote_output = 0;
if (NILP (Vprint_continuous_numbering)
|| NILP (Vprint_number_table))
{
print_number_index = 0;
Vprint_number_table = Qnil;
}
if (!NILP (Vprint_gensym) || !NILP (Vprint_circle))
{
int i, start, index;
start = index = print_number_index;
print_depth = 0;
print_preprocess (obj);
for (i = start; i < print_number_index; i++)
if (!NILP (PRINT_NUMBER_STATUS (Vprint_number_table, i)))
{
PRINT_NUMBER_OBJECT (Vprint_number_table, index)
= PRINT_NUMBER_OBJECT (Vprint_number_table, i);
index++;
}
for (i = index; i < print_number_index; i++)
PRINT_NUMBER_OBJECT (Vprint_number_table, i) = Qnil;
for (i = start; i < print_number_index; i++)
PRINT_NUMBER_STATUS (Vprint_number_table, i) = Qnil;
print_number_index = index;
}
print_depth = 0;
print_object (obj, printcharfun, escapeflag);
}
static void
print_preprocess (obj)
Lisp_Object obj;
{
int i;
EMACS_INT size;
int loop_count = 0;
Lisp_Object halftail;
if (print_depth >= PRINT_CIRCLE)
error ("Apparently circular structure being printed");
if (NILP (Vprint_circle))
{
for (i = 0; i < print_depth; i++)
if (EQ (obj, being_printed[i]))
return;
being_printed[print_depth] = obj;
}
print_depth++;
halftail = obj;
loop:
if (STRINGP (obj) || CONSP (obj) || VECTORP (obj)
|| COMPILEDP (obj) || CHAR_TABLE_P (obj)
|| (! NILP (Vprint_gensym)
&& SYMBOLP (obj)
&& !SYMBOL_INTERNED_P (obj)))
{
if (! NILP (Vprint_circle) || SYMBOLP (obj))
{
for (i = 0; i < print_number_index; i++)
if (EQ (PRINT_NUMBER_OBJECT (Vprint_number_table, i), obj))
{
PRINT_NUMBER_STATUS (Vprint_number_table, i) = Qt;
print_depth--;
return;
}
if (print_number_index == 0)
{
Vprint_number_table = Fmake_vector (make_number (40), Qnil);
}
else if (XVECTOR (Vprint_number_table)->size == print_number_index * 2)
{
int i = print_number_index * 4;
Lisp_Object old_table = Vprint_number_table;
Vprint_number_table = Fmake_vector (make_number (i), Qnil);
for (i = 0; i < print_number_index; i++)
{
PRINT_NUMBER_OBJECT (Vprint_number_table, i)
= PRINT_NUMBER_OBJECT (old_table, i);
PRINT_NUMBER_STATUS (Vprint_number_table, i)
= PRINT_NUMBER_STATUS (old_table, i);
}
}
PRINT_NUMBER_OBJECT (Vprint_number_table, print_number_index) = obj;
if (!NILP (Vprint_continuous_numbering)
&& SYMBOLP (obj)
&& !SYMBOL_INTERNED_P (obj))
PRINT_NUMBER_STATUS (Vprint_number_table, print_number_index) = Qt;
print_number_index++;
}
switch (XGCTYPE (obj))
{
case Lisp_String:
traverse_intervals_noorder (STRING_INTERVALS (obj),
print_preprocess_string, Qnil);
break;
case Lisp_Cons:
if (loop_count && EQ (obj, halftail))
break;
print_preprocess (XCAR (obj));
obj = XCDR (obj);
loop_count++;
if (!(loop_count & 1))
halftail = XCDR (halftail);
goto loop;
case Lisp_Vectorlike:
size = XVECTOR (obj)->size;
if (size & PSEUDOVECTOR_FLAG)
size &= PSEUDOVECTOR_SIZE_MASK;
for (i = 0; i < size; i++)
print_preprocess (XVECTOR (obj)->contents[i]);
break;
default:
break;
}
}
print_depth--;
}
static void
print_preprocess_string (interval, arg)
INTERVAL interval;
Lisp_Object arg;
{
print_preprocess (interval->plist);
}
static void
print_object (obj, printcharfun, escapeflag)
Lisp_Object obj;
register Lisp_Object printcharfun;
int escapeflag;
{
char buf[40];
QUIT;
if (STRINGP (obj) || CONSP (obj) || VECTORP (obj)
|| COMPILEDP (obj) || CHAR_TABLE_P (obj)
|| (! NILP (Vprint_gensym)
&& SYMBOLP (obj)
&& !SYMBOL_INTERNED_P (obj)))
{
if (NILP (Vprint_circle) && NILP (Vprint_gensym))
{
int i;
for (i = 0; i < print_depth; i++)
if (EQ (obj, being_printed[i]))
{
sprintf (buf, "#%d", i);
strout (buf, -1, -1, printcharfun, 0);
return;
}
being_printed[print_depth] = obj;
}
else
{
int i;
for (i = 0; i < print_number_index; i++)
if (EQ (PRINT_NUMBER_OBJECT (Vprint_number_table, i), obj))
{
if (NILP (PRINT_NUMBER_STATUS (Vprint_number_table, i)))
{
sprintf (buf, "#%d=", i + 1);
strout (buf, -1, -1, printcharfun, 0);
PRINT_NUMBER_STATUS (Vprint_number_table, i) = Qt;
break;
}
else
{
sprintf (buf, "#%d#", i + 1);
strout (buf, -1, -1, printcharfun, 0);
return;
}
}
}
}
print_depth++;
if (print_depth > PRINT_CIRCLE)
error ("Apparently circular structure being printed");
#ifdef MAX_PRINT_CHARS
if (max_print && print_chars > max_print)
{
PRINTCHAR ('\n');
print_chars = 0;
}
#endif
switch (XGCTYPE (obj))
{
case Lisp_Int:
if (sizeof (int) == sizeof (EMACS_INT))
sprintf (buf, "%d", XINT (obj));
else if (sizeof (long) == sizeof (EMACS_INT))
sprintf (buf, "%ld", (long) XINT (obj));
else
abort ();
strout (buf, -1, -1, printcharfun, 0);
break;
case Lisp_Float:
{
char pigbuf[350];
float_to_string (pigbuf, XFLOAT_DATA (obj));
strout (pigbuf, -1, -1, printcharfun, 0);
}
break;
case Lisp_String:
if (!escapeflag)
print_string (obj, printcharfun);
else
{
register int i, i_byte;
struct gcpro gcpro1;
unsigned char *str;
int size_byte;
int need_nonhex = 0;
int multibyte = STRING_MULTIBYTE (obj);
GCPRO1 (obj);
if (!NULL_INTERVAL_P (STRING_INTERVALS (obj)))
{
PRINTCHAR ('#');
PRINTCHAR ('(');
}
PRINTCHAR ('\"');
str = SDATA (obj);
size_byte = SBYTES (obj);
for (i = 0, i_byte = 0; i_byte < size_byte;)
{
int len;
int c;
if (multibyte)
{
c = STRING_CHAR_AND_LENGTH (str + i_byte,
size_byte - i_byte, len);
if (CHAR_VALID_P (c, 0))
i_byte += len;
else
c = str[i_byte++];
}
else
c = str[i_byte++];
QUIT;
if (c == '\n' && print_escape_newlines)
{
PRINTCHAR ('\\');
PRINTCHAR ('n');
}
else if (c == '\f' && print_escape_newlines)
{
PRINTCHAR ('\\');
PRINTCHAR ('f');
}
else if (multibyte
&& ! ASCII_BYTE_P (c)
&& (SINGLE_BYTE_CHAR_P (c) || print_escape_multibyte))
{
unsigned char outbuf[50];
sprintf (outbuf, "\\x%x", c);
strout (outbuf, -1, -1, printcharfun, 0);
need_nonhex = 1;
}
else if (! multibyte
&& SINGLE_BYTE_CHAR_P (c) && ! ASCII_BYTE_P (c)
&& print_escape_nonascii)
{
unsigned char outbuf[5];
sprintf (outbuf, "\\%03o", c);
strout (outbuf, -1, -1, printcharfun, 0);
}
else
{
if (need_nonhex)
{
need_nonhex = 0;
if ((c >= 'a' && c <= 'f')
|| (c >= 'A' && c <= 'F')
|| (c >= '0' && c <= '9'))
strout ("\\ ", -1, -1, printcharfun, 0);
}
if (c == '\"' || c == '\\')
PRINTCHAR ('\\');
PRINTCHAR (c);
}
}
PRINTCHAR ('\"');
if (!NULL_INTERVAL_P (STRING_INTERVALS (obj)))
{
traverse_intervals (STRING_INTERVALS (obj),
0, print_interval, printcharfun);
PRINTCHAR (')');
}
UNGCPRO;
}
break;
case Lisp_Symbol:
{
register int confusing;
register unsigned char *p = SDATA (SYMBOL_NAME (obj));
register unsigned char *end = p + SBYTES (SYMBOL_NAME (obj));
register int c;
int i, i_byte, size_byte;
Lisp_Object name;
name = SYMBOL_NAME (obj);
if (p != end && (*p == '-' || *p == '+')) p++;
if (p == end)
confusing = 0;
else if (*p >= '0' && *p <= '9'
&& end[-1] >= '0' && end[-1] <= '9')
{
while (p != end && ((*p >= '0' && *p <= '9')
|| *p == 'e'))
p++;
confusing = (end == p);
}
else
confusing = 0;
if (! NILP (Vprint_gensym) && !SYMBOL_INTERNED_P (obj))
{
PRINTCHAR ('#');
PRINTCHAR (':');
}
size_byte = SBYTES (name);
for (i = 0, i_byte = 0; i_byte < size_byte;)
{
FETCH_STRING_CHAR_ADVANCE (c, name, i, i_byte);
QUIT;
if (escapeflag)
{
if (c == '\"' || c == '\\' || c == '\''
|| c == ';' || c == '#' || c == '(' || c == ')'
|| c == ',' || c =='.' || c == '`'
|| c == '[' || c == ']' || c == '?' || c <= 040
|| confusing)
PRINTCHAR ('\\'), confusing = 0;
}
PRINTCHAR (c);
}
}
break;
case Lisp_Cons:
if (INTEGERP (Vprint_level)
&& print_depth > XINT (Vprint_level))
strout ("...", -1, -1, printcharfun, 0);
else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
&& (EQ (XCAR (obj), Qquote)))
{
PRINTCHAR ('\'');
print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
}
else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
&& (EQ (XCAR (obj), Qfunction)))
{
PRINTCHAR ('#');
PRINTCHAR ('\'');
print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
}
else if (print_quoted && CONSP (XCDR (obj)) && NILP (XCDR (XCDR (obj)))
&& ! old_backquote_output
&& ((EQ (XCAR (obj), Qbackquote)
|| EQ (XCAR (obj), Qcomma)
|| EQ (XCAR (obj), Qcomma_at)
|| EQ (XCAR (obj), Qcomma_dot))))
{
print_object (XCAR (obj), printcharfun, 0);
print_object (XCAR (XCDR (obj)), printcharfun, escapeflag);
}
else
{
PRINTCHAR ('(');
if (print_quoted && CONSP (XCAR (obj))
&& CONSP (XCDR (XCAR (obj)))
&& NILP (XCDR (XCDR (XCAR (obj))))
&& EQ (XCAR (XCAR (obj)), Qbackquote))
{
Lisp_Object tem;
tem = XCAR (obj);
PRINTCHAR ('(');
print_object (Qbackquote, printcharfun, 0);
PRINTCHAR (' ');
++old_backquote_output;
print_object (XCAR (XCDR (tem)), printcharfun, 0);
--old_backquote_output;
PRINTCHAR (')');
obj = XCDR (obj);
}
{
int print_length, i;
Lisp_Object halftail = obj;
if (NATNUMP (Vprint_length))
print_length = XFASTINT (Vprint_length);
else
print_length = 0;
i = 0;
while (CONSP (obj))
{
if (NILP (Vprint_circle))
{
if (i != 0 && EQ (obj, halftail))
{
sprintf (buf, " . #%d", i / 2);
strout (buf, -1, -1, printcharfun, 0);
goto end_of_list;
}
}
else
{
if (i != 0)
{
int i;
for (i = 0; i < print_number_index; i++)
if (EQ (PRINT_NUMBER_OBJECT (Vprint_number_table, i),
obj))
{
if (NILP (PRINT_NUMBER_STATUS (Vprint_number_table, i)))
{
strout (" . ", 3, 3, printcharfun, 0);
print_object (obj, printcharfun, escapeflag);
}
else
{
sprintf (buf, " . #%d#", i + 1);
strout (buf, -1, -1, printcharfun, 0);
}
goto end_of_list;
}
}
}
if (i++)
PRINTCHAR (' ');
if (print_length && i > print_length)
{
strout ("...", 3, 3, printcharfun, 0);
goto end_of_list;
}
print_object (XCAR (obj), printcharfun, escapeflag);
obj = XCDR (obj);
if (!(i & 1))
halftail = XCDR (halftail);
}
}
if (!NILP (obj))
{
strout (" . ", 3, 3, printcharfun, 0);
print_object (obj, printcharfun, escapeflag);
}
end_of_list:
PRINTCHAR (')');
}
break;
case Lisp_Vectorlike:
if (PROCESSP (obj))
{
if (escapeflag)
{
strout ("#<process ", -1, -1, printcharfun, 0);
print_string (XPROCESS (obj)->name, printcharfun);
PRINTCHAR ('>');
}
else
print_string (XPROCESS (obj)->name, printcharfun);
}
else if (BOOL_VECTOR_P (obj))
{
register int i;
register unsigned char c;
struct gcpro gcpro1;
int size_in_chars
= ((XBOOL_VECTOR (obj)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
/ BOOL_VECTOR_BITS_PER_CHAR);
GCPRO1 (obj);
PRINTCHAR ('#');
PRINTCHAR ('&');
sprintf (buf, "%ld", (long) XBOOL_VECTOR (obj)->size);
strout (buf, -1, -1, printcharfun, 0);
PRINTCHAR ('\"');
if (NATNUMP (Vprint_length)
&& XFASTINT (Vprint_length) < size_in_chars)
size_in_chars = XFASTINT (Vprint_length);
for (i = 0; i < size_in_chars; i++)
{
QUIT;
c = XBOOL_VECTOR (obj)->data[i];
if (c == '\n' && print_escape_newlines)
{
PRINTCHAR ('\\');
PRINTCHAR ('n');
}
else if (c == '\f' && print_escape_newlines)
{
PRINTCHAR ('\\');
PRINTCHAR ('f');
}
else if (c > '\177')
{
PRINTCHAR ('\\');
PRINTCHAR ('0' + ((c >> 6) & 3));
PRINTCHAR ('0' + ((c >> 3) & 7));
PRINTCHAR ('0' + (c & 7));
}
else
{
if (c == '\"' || c == '\\')
PRINTCHAR ('\\');
PRINTCHAR (c);
}
}
PRINTCHAR ('\"');
UNGCPRO;
}
else if (SUBRP (obj))
{
strout ("#<subr ", -1, -1, printcharfun, 0);
strout (XSUBR (obj)->symbol_name, -1, -1, printcharfun, 0);
PRINTCHAR ('>');
}
else if (WINDOWP (obj))
{
strout ("#<window ", -1, -1, printcharfun, 0);
sprintf (buf, "%ld", (long) XFASTINT (XWINDOW (obj)->sequence_number));
strout (buf, -1, -1, printcharfun, 0);
if (!NILP (XWINDOW (obj)->buffer))
{
strout (" on ", -1, -1, printcharfun, 0);
print_string (XBUFFER (XWINDOW (obj)->buffer)->name, printcharfun);
}
PRINTCHAR ('>');
}
else if (HASH_TABLE_P (obj))
{
struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
strout ("#<hash-table", -1, -1, printcharfun, 0);
if (SYMBOLP (h->test))
{
PRINTCHAR (' ');
PRINTCHAR ('\'');
strout (SDATA (SYMBOL_NAME (h->test)), -1, -1, printcharfun, 0);
PRINTCHAR (' ');
strout (SDATA (SYMBOL_NAME (h->weak)), -1, -1, printcharfun, 0);
PRINTCHAR (' ');
sprintf (buf, "%ld/%ld", (long) XFASTINT (h->count),
(long) XVECTOR (h->next)->size);
strout (buf, -1, -1, printcharfun, 0);
}
sprintf (buf, " 0x%lx", (unsigned long) h);
strout (buf, -1, -1, printcharfun, 0);
PRINTCHAR ('>');
}
else if (BUFFERP (obj))
{
if (NILP (XBUFFER (obj)->name))
strout ("#<killed buffer>", -1, -1, printcharfun, 0);
else if (escapeflag)
{
strout ("#<buffer ", -1, -1, printcharfun, 0);
print_string (XBUFFER (obj)->name, printcharfun);
PRINTCHAR ('>');
}
else
print_string (XBUFFER (obj)->name, printcharfun);
}
else if (WINDOW_CONFIGURATIONP (obj))
{
strout ("#<window-configuration>", -1, -1, printcharfun, 0);
}
else if (FRAMEP (obj))
{
strout ((FRAME_LIVE_P (XFRAME (obj))
? "#<frame " : "#<dead frame "),
-1, -1, printcharfun, 0);
print_string (XFRAME (obj)->name, printcharfun);
sprintf (buf, " 0x%lx", (unsigned long) (XFRAME (obj)));
strout (buf, -1, -1, printcharfun, 0);
PRINTCHAR ('>');
}
else
{
EMACS_INT size = XVECTOR (obj)->size;
if (COMPILEDP (obj))
{
PRINTCHAR ('#');
size &= PSEUDOVECTOR_SIZE_MASK;
}
if (CHAR_TABLE_P (obj))
{
PRINTCHAR ('#');
PRINTCHAR ('^');
if (SUB_CHAR_TABLE_P (obj))
PRINTCHAR ('^');
size &= PSEUDOVECTOR_SIZE_MASK;
}
if (size & PSEUDOVECTOR_FLAG)
goto badtype;
PRINTCHAR ('[');
{
register int i;
register Lisp_Object tem;
int real_size = size;
if (NATNUMP (Vprint_length)
&& XFASTINT (Vprint_length) < size)
size = XFASTINT (Vprint_length);
for (i = 0; i < size; i++)
{
if (i) PRINTCHAR (' ');
tem = XVECTOR (obj)->contents[i];
print_object (tem, printcharfun, escapeflag);
}
if (size < real_size)
strout (" ...", 4, 4, printcharfun, 0);
}
PRINTCHAR (']');
}
break;
case Lisp_Misc:
switch (XMISCTYPE (obj))
{
case Lisp_Misc_Marker:
strout ("#<marker ", -1, -1, printcharfun, 0);
if (XMARKER (obj)->insertion_type != 0)
strout ("(moves after insertion) ", -1, -1, printcharfun, 0);
if (! XMARKER (obj)->buffer)
strout ("in no buffer", -1, -1, printcharfun, 0);
else
{
sprintf (buf, "at %d", marker_position (obj));
strout (buf, -1, -1, printcharfun, 0);
strout (" in ", -1, -1, printcharfun, 0);
print_string (XMARKER (obj)->buffer->name, printcharfun);
}
PRINTCHAR ('>');
break;
case Lisp_Misc_Overlay:
strout ("#<overlay ", -1, -1, printcharfun, 0);
if (! XMARKER (OVERLAY_START (obj))->buffer)
strout ("in no buffer", -1, -1, printcharfun, 0);
else
{
sprintf (buf, "from %d to %d in ",
marker_position (OVERLAY_START (obj)),
marker_position (OVERLAY_END (obj)));
strout (buf, -1, -1, printcharfun, 0);
print_string (XMARKER (OVERLAY_START (obj))->buffer->name,
printcharfun);
}
PRINTCHAR ('>');
break;
case Lisp_Misc_Free:
strout ("#<misc free cell>", -1, -1, printcharfun, 0);
break;
case Lisp_Misc_Intfwd:
sprintf (buf, "#<intfwd to %ld>", (long) *XINTFWD (obj)->intvar);
strout (buf, -1, -1, printcharfun, 0);
break;
case Lisp_Misc_Boolfwd:
sprintf (buf, "#<boolfwd to %s>",
(*XBOOLFWD (obj)->boolvar ? "t" : "nil"));
strout (buf, -1, -1, printcharfun, 0);
break;
case Lisp_Misc_Objfwd:
strout ("#<objfwd to ", -1, -1, printcharfun, 0);
print_object (*XOBJFWD (obj)->objvar, printcharfun, escapeflag);
PRINTCHAR ('>');
break;
case Lisp_Misc_Buffer_Objfwd:
strout ("#<buffer_objfwd to ", -1, -1, printcharfun, 0);
print_object (PER_BUFFER_VALUE (current_buffer,
XBUFFER_OBJFWD (obj)->offset),
printcharfun, escapeflag);
PRINTCHAR ('>');
break;
case Lisp_Misc_Kboard_Objfwd:
strout ("#<kboard_objfwd to ", -1, -1, printcharfun, 0);
print_object (*(Lisp_Object *) ((char *) current_kboard
+ XKBOARD_OBJFWD (obj)->offset),
printcharfun, escapeflag);
PRINTCHAR ('>');
break;
case Lisp_Misc_Buffer_Local_Value:
strout ("#<buffer_local_value ", -1, -1, printcharfun, 0);
goto do_buffer_local;
case Lisp_Misc_Some_Buffer_Local_Value:
strout ("#<some_buffer_local_value ", -1, -1, printcharfun, 0);
do_buffer_local:
strout ("[realvalue] ", -1, -1, printcharfun, 0);
print_object (XBUFFER_LOCAL_VALUE (obj)->realvalue,
printcharfun, escapeflag);
if (XBUFFER_LOCAL_VALUE (obj)->found_for_buffer)
strout ("[local in buffer] ", -1, -1, printcharfun, 0);
else
strout ("[buffer] ", -1, -1, printcharfun, 0);
print_object (XBUFFER_LOCAL_VALUE (obj)->buffer,
printcharfun, escapeflag);
if (XBUFFER_LOCAL_VALUE (obj)->check_frame)
{
if (XBUFFER_LOCAL_VALUE (obj)->found_for_frame)
strout ("[local in frame] ", -1, -1, printcharfun, 0);
else
strout ("[frame] ", -1, -1, printcharfun, 0);
print_object (XBUFFER_LOCAL_VALUE (obj)->frame,
printcharfun, escapeflag);
}
strout ("[alist-elt] ", -1, -1, printcharfun, 0);
print_object (XCAR (XBUFFER_LOCAL_VALUE (obj)->cdr),
printcharfun, escapeflag);
strout ("[default-value] ", -1, -1, printcharfun, 0);
print_object (XCDR (XBUFFER_LOCAL_VALUE (obj)->cdr),
printcharfun, escapeflag);
PRINTCHAR ('>');
break;
case Lisp_Misc_Save_Value:
strout ("#<save_value ", -1, -1, printcharfun, 0);
sprintf(buf, "ptr=0x%08lx int=%d",
(unsigned long) XSAVE_VALUE (obj)->pointer,
XSAVE_VALUE (obj)->integer);
strout (buf, -1, -1, printcharfun, 0);
PRINTCHAR ('>');
break;
default:
goto badtype;
}
break;
default:
badtype:
{
strout ("#<EMACS BUG: INVALID DATATYPE ", -1, -1, printcharfun, 0);
if (MISCP (obj))
sprintf (buf, "(MISC 0x%04x)", (int) XMISCTYPE (obj));
else if (VECTORLIKEP (obj))
sprintf (buf, "(PVEC 0x%08x)", (int) XVECTOR (obj)->size);
else
sprintf (buf, "(0x%02x)", (int) XTYPE (obj));
strout (buf, -1, -1, printcharfun, 0);
strout (" Save your buffers immediately and please report this bug>",
-1, -1, printcharfun, 0);
}
}
print_depth--;
}
void
print_interval (interval, printcharfun)
INTERVAL interval;
Lisp_Object printcharfun;
{
PRINTCHAR (' ');
print_object (make_number (interval->position), printcharfun, 1);
PRINTCHAR (' ');
print_object (make_number (interval->position + LENGTH (interval)),
printcharfun, 1);
PRINTCHAR (' ');
print_object (interval->plist, printcharfun, 1);
}
void
syms_of_print ()
{
Qtemp_buffer_setup_hook = intern ("temp-buffer-setup-hook");
staticpro (&Qtemp_buffer_setup_hook);
DEFVAR_LISP ("standard-output", &Vstandard_output,
doc: );
Vstandard_output = Qt;
Qstandard_output = intern ("standard-output");
staticpro (&Qstandard_output);
DEFVAR_LISP ("float-output-format", &Vfloat_output_format,
doc: );
Vfloat_output_format = Qnil;
Qfloat_output_format = intern ("float-output-format");
staticpro (&Qfloat_output_format);
DEFVAR_LISP ("print-length", &Vprint_length,
doc: );
Vprint_length = Qnil;
DEFVAR_LISP ("print-level", &Vprint_level,
doc: );
Vprint_level = Qnil;
DEFVAR_BOOL ("print-escape-newlines", &print_escape_newlines,
doc: );
print_escape_newlines = 0;
DEFVAR_BOOL ("print-escape-nonascii", &print_escape_nonascii,
doc: );
print_escape_nonascii = 0;
DEFVAR_BOOL ("print-escape-multibyte", &print_escape_multibyte,
doc: );
print_escape_multibyte = 0;
DEFVAR_BOOL ("print-quoted", &print_quoted,
doc: );
print_quoted = 0;
DEFVAR_LISP ("print-gensym", &Vprint_gensym,
doc: );
Vprint_gensym = Qnil;
DEFVAR_LISP ("print-circle", &Vprint_circle,
doc: );
Vprint_circle = Qnil;
DEFVAR_LISP ("print-continuous-numbering", &Vprint_continuous_numbering,
doc: );
Vprint_continuous_numbering = Qnil;
DEFVAR_LISP ("print-number-table", &Vprint_number_table,
doc: );
Vprint_number_table = Qnil;
staticpro (&Vprin1_to_string_buffer);
defsubr (&Sprin1);
defsubr (&Sprin1_to_string);
defsubr (&Serror_message_string);
defsubr (&Sprinc);
defsubr (&Sprint);
defsubr (&Sterpri);
defsubr (&Swrite_char);
defsubr (&Sexternal_debugging_output);
#ifdef WITH_REDIRECT_DEBUGGING_OUTPUT
defsubr (&Sredirect_debugging_output);
#endif
Qexternal_debugging_output = intern ("external-debugging-output");
staticpro (&Qexternal_debugging_output);
Qprint_escape_newlines = intern ("print-escape-newlines");
staticpro (&Qprint_escape_newlines);
Qprint_escape_multibyte = intern ("print-escape-multibyte");
staticpro (&Qprint_escape_multibyte);
Qprint_escape_nonascii = intern ("print-escape-nonascii");
staticpro (&Qprint_escape_nonascii);
defsubr (&Swith_output_to_temp_buffer);
}