/* Lisp object printing and output streams.
- Copyright (C) 1985, 86, 88, 93, 94, 95, 97, 98, 1999, 2000, 01, 2003
- Free Software Foundation, Inc.
+ Copyright (C) 1985, 1986, 1988, 1993, 1994, 1995, 1997, 1998, 1999,
+ 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of GNU Emacs.
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA. */
#include <config.h>
} \
if (MARKERP (printcharfun)) \
{ \
- if (!(XMARKER (original)->buffer)) \
+ EMACS_INT marker_pos; \
+ if (!(XMARKER (printcharfun)->buffer)) \
error ("Marker does not point anywhere"); \
- if (XMARKER (original)->buffer != current_buffer) \
- set_buffer_internal (XMARKER (original)->buffer); \
+ 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_position (printcharfun), \
+ SET_PT_BOTH (marker_pos, \
marker_byte_position (printcharfun)); \
start_point = PT; \
start_point_byte = PT_BYTE; \
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);
to get the buffer displayed instead of just displaying the non-selected
buffer and calling the hook. It gets one argument, the buffer to display.
-usage: (with-output-to-temp-buffer BUFFNAME BODY ...) */)
+usage: (with-output-to-temp-buffer BUFNAME BODY ...) */)
(args)
Lisp_Object args;
{
if (SBYTES (object) == SCHARS (object))
STRING_SET_UNIBYTE (object);
- /* Note that this won't make prepare_to_modify_buffer call
+ /* Note that this won't make prepare_to_modify_buffer call
ask-user-about-supersession-threat because this buffer
does not visit a file. */
Ferase_buffer ();
doc: /* Redirect debugging output (stderr stream) to file FILE.
If FILE is nil, reset target to the initial stderr stream.
Optional arg APPEND non-nil (interactively, with prefix arg) means
-append to existing target file. */)
+append to existing target file. */)
(file, append)
Lisp_Object file, append;
{
register Lisp_Object printcharfun;
int escapeflag;
{
- print_depth = 0;
old_backquote_output = 0;
/* Reset print_number_index and Vprint_number_table only when
start = index = print_number_index;
/* Construct Vprint_number_table.
This increments print_number_index for the objects added. */
+ print_depth = 0;
print_preprocess (obj);
/* Remove unnecessary objects, which appear only once in OBJ;
print_number_index = index;
}
+ print_depth = 0;
print_object (obj, printcharfun, escapeflag);
}
print_preprocess (obj)
Lisp_Object obj;
{
- int i, size;
+ int i;
+ EMACS_INT size;
+ int loop_count = 0;
+ Lisp_Object halftail;
+
+ /* Give up if we go so deep that print_object will get an error. */
+ /* See similar code in print_object. */
+ if (print_depth >= PRINT_CIRCLE)
+ return;
+
+ /* Avoid infinite recursion for circular nested structure
+ in the case where Vprint_circle is nil. */
+ 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)
break;
case Lisp_Cons:
+ /* Use HALFTAIL and LOOP_COUNT to detect circular lists,
+ just as in print_object. */
+ 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 & PSEUDOVECTOR_SIZE_MASK;
+ 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;
break;
}
}
+ print_depth--;
}
static void
register Lisp_Object printcharfun;
int escapeflag;
{
- char buf[30];
+ char buf[40];
QUIT;
print_depth++;
+ /* See similar code in print_preprocess. */
if (print_depth > PRINT_CIRCLE)
error ("Apparently circular structure being printed");
#ifdef MAX_PRINT_CHARS
register unsigned char c;
struct gcpro gcpro1;
int size_in_chars
- = (XBOOL_VECTOR (obj)->size + BITS_PER_CHAR - 1) / BITS_PER_CHAR;
+ = ((XBOOL_VECTOR (obj)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
+ / BOOL_VECTOR_BITS_PER_CHAR);
GCPRO1 (obj);
PRINTCHAR ('#');
PRINTCHAR ('&');
- sprintf (buf, "%d", XBOOL_VECTOR (obj)->size);
+ sprintf (buf, "%ld", (long) XBOOL_VECTOR (obj)->size);
strout (buf, -1, -1, printcharfun, 0);
PRINTCHAR ('\"');
PRINTCHAR ('\\');
PRINTCHAR ('f');
}
+ else if (c > '\177')
+ {
+ /* Use octal escapes to avoid encoding issues. */
+ PRINTCHAR ('\\');
+ PRINTCHAR ('0' + ((c >> 6) & 3));
+ PRINTCHAR ('0' + ((c >> 3) & 7));
+ PRINTCHAR ('0' + (c & 7));
+ }
else
{
if (c == '\"' || c == '\\')
else if (WINDOWP (obj))
{
strout ("#<window ", -1, -1, printcharfun, 0);
- sprintf (buf, "%d", XFASTINT (XWINDOW (obj)->sequence_number));
+ sprintf (buf, "%ld", (long) XFASTINT (XWINDOW (obj)->sequence_number));
strout (buf, -1, -1, printcharfun, 0);
if (!NILP (XWINDOW (obj)->buffer))
{
PRINTCHAR (' ');
strout (SDATA (SYMBOL_NAME (h->weak)), -1, -1, printcharfun, 0);
PRINTCHAR (' ');
- sprintf (buf, "%d/%d", XFASTINT (h->count),
- XVECTOR (h->next)->size);
+ 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);
}
else
{
- int size = XVECTOR (obj)->size;
+ EMACS_INT size = XVECTOR (obj)->size;
if (COMPILEDP (obj))
{
PRINTCHAR ('#');
break;
case Lisp_Misc_Intfwd:
- sprintf (buf, "#<intfwd to %d>", *XINTFWD (obj)->intvar);
+ sprintf (buf, "#<intfwd to %ld>", (long) *XINTFWD (obj)->intvar);
strout (buf, -1, -1, printcharfun, 0);
break;
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;
}