]> code.delx.au - gnu-emacs/blobdiff - src/print.c
(MINI_WINDOW_P): Use NILP.
[gnu-emacs] / src / print.c
index 1943ed4082f4ace4397e35483f735169d51c314c..4937660e5e6eef7b1fbc41eeb46f16d00a9f9eb3 100644 (file)
@@ -1,5 +1,5 @@
 /* Lisp object printing and output streams.
 /* Lisp object printing and output streams.
-   Copyright (C) 1985, 86, 88, 93, 94, 95, 97, 98, 1999
+   Copyright (C) 1985, 86, 88, 93, 94, 95, 97, 98, 1999, 2000, 2001
        Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
        Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -25,12 +25,12 @@ Boston, MA 02111-1307, USA.  */
 #include "lisp.h"
 #include "buffer.h"
 #include "charset.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 "frame.h"
 #include "window.h"
 #include "process.h"
 #include "dispextern.h"
 #include "termchar.h"
-#include "keyboard.h"
 #include "intervals.h"
 
 Lisp_Object Vstandard_output, Qstandard_output;
 #include "intervals.h"
 
 Lisp_Object Vstandard_output, Qstandard_output;
@@ -190,8 +190,8 @@ void print_interval ();
 
 #define PRINTDECLARE                                                   \
    struct buffer *old = current_buffer;                                        \
 
 #define PRINTDECLARE                                                   \
    struct buffer *old = current_buffer;                                        \
-   int old_point = -1, start_point;                                    \
-   int old_point_byte, start_point_byte;                               \
+   int old_point = -1, start_point = -1;                               \
+   int old_point_byte = -1, start_point_byte = -1;                     \
    int specpdl_count = specpdl_ptr - specpdl;                          \
    int free_print_buffer = 0;                                          \
    int multibyte = !NILP (current_buffer->enable_multibyte_characters);        \
    int specpdl_count = specpdl_ptr - specpdl;                          \
    int free_print_buffer = 0;                                          \
    int multibyte = !NILP (current_buffer->enable_multibyte_characters);        \
@@ -291,6 +291,7 @@ print_unwind (saved_text)
      Lisp_Object saved_text;
 {
   bcopy (XSTRING (saved_text)->data, print_buffer, XSTRING (saved_text)->size);
      Lisp_Object saved_text;
 {
   bcopy (XSTRING (saved_text)->data, print_buffer, XSTRING (saved_text)->size);
+  return Qnil;
 }
 
 
 }
 
 
@@ -400,7 +401,7 @@ strout (ptr, size, size_byte, printcharfun, multibyte)
       if (size == size_byte)
        {
          for (i = 0; i < size; ++i)
       if (size == size_byte)
        {
          for (i = 0; i < size; ++i)
-           insert_char (*ptr++);
+           insert_char ((unsigned char )*ptr++);
        }
       else
        {
        }
       else
        {
@@ -464,8 +465,23 @@ print_string (string, printcharfun)
       else if (EQ (printcharfun, Qt)
               ? ! NILP (buffer_defaults.enable_multibyte_characters)
               : ! NILP (current_buffer->enable_multibyte_characters))
       else if (EQ (printcharfun, Qt)
               ? ! NILP (buffer_defaults.enable_multibyte_characters)
               : ! NILP (current_buffer->enable_multibyte_characters))
-       chars = multibyte_chars_in_text (XSTRING (string)->data,
-                                        STRING_BYTES (XSTRING (string)));
+       {
+         /* If unibyte string STRING contains 8-bit codes, we must
+            convert STRING to a multibyte string containing the same
+            character codes.  */
+         Lisp_Object newstr;
+         int bytes;
+
+         chars = STRING_BYTES (XSTRING (string));
+         bytes = parse_str_to_multibyte (XSTRING (string)->data, chars);
+         if (chars < bytes)
+           {
+             newstr = make_uninit_multibyte_string (chars, bytes);
+             bcopy (XSTRING (string)->data, XSTRING (newstr)->data, chars);
+             str_to_multibyte (XSTRING (newstr)->data, bytes, chars);
+             string = newstr;
+           }
+       }
       else
        chars = STRING_BYTES (XSTRING (string));
 
       else
        chars = STRING_BYTES (XSTRING (string));
 
@@ -583,7 +599,8 @@ temp_output_buffer_setup (bufname)
   Ferase_buffer ();
   XSETBUFFER (buf, current_buffer);
 
   Ferase_buffer ();
   XSETBUFFER (buf, current_buffer);
 
-  call1 (Vrun_hooks, Qtemp_buffer_setup_hook);
+  if (!NILP (Vrun_hooks))
+    call1 (Vrun_hooks, Qtemp_buffer_setup_hook);
 
   unbind_to (count, Qnil);
 
 
   unbind_to (count, Qnil);
 
@@ -682,7 +699,24 @@ DEFUN ("prin1", Fprin1, Sprin1, 1, 2, 0,
   "Output the printed representation of OBJECT, any Lisp object.\n\
 Quoting characters are printed when needed to make output that `read'\n\
 can handle, whenever this is possible.\n\
   "Output the printed representation of OBJECT, any Lisp object.\n\
 Quoting characters are printed when needed to make output that `read'\n\
 can handle, whenever this is possible.\n\
-Output stream is PRINTCHARFUN, or value of `standard-output' (which see).")
+\n\
+OBJECT is any of the Lisp data types: a number, a string, a symbol,\n\
+a list, a buffer, a window, a frame, etc.\n\
+\n\
+A printed representation of an object is text which describes that object.\n\
+\n\
+Optional argument PRINTCHARFUN is the output stream, which can be one\n\
+of these:\n\
+\n\
+   - a buffer, in which case output is inserted into that buffer at point;\n\
+   - a marker, in which case output is inserted at marker's position;\n\
+   - a function, in which case that function is called once for each\n\
+     character of OBJECT's printed representation;\n\
+   - a symbol, in which case that symbol's function definition is called; or\n\
+   - t, in which case the output is displayed in the echo area.\n\
+\n\
+If PRINTCHARFUN is omitted, the value of `standard-output' (which see)\n\
+is used instead.")
   (object, printcharfun)
      Lisp_Object object, printcharfun;
 {
   (object, printcharfun)
      Lisp_Object object, printcharfun;
 {
@@ -706,7 +740,12 @@ DEFUN ("prin1-to-string", Fprin1_to_string, Sprin1_to_string, 1, 2, 0,
   "Return a string containing the printed representation of OBJECT,\n\
 any Lisp object.  Quoting characters are used when needed to make output\n\
 that `read' can handle, whenever this is possible, unless the optional\n\
   "Return a string containing the printed representation of OBJECT,\n\
 any Lisp object.  Quoting characters are used when needed to make output\n\
 that `read' can handle, whenever this is possible, unless the optional\n\
-second argument NOESCAPE is non-nil.")
+second argument NOESCAPE is non-nil.\n\
+\n\
+OBJECT is any of the Lisp data types: a number, a string, a symbol,\n\
+a list, a buffer, a window, a frame, etc.\n\
+\n\
+A printed representation of an object is text which describes that object.")
   (object, noescape)
      Lisp_Object object, noescape;
 {
   (object, noescape)
      Lisp_Object object, noescape;
 {
@@ -742,7 +781,24 @@ DEFUN ("princ", Fprinc, Sprinc, 1, 2, 0,
   "Output the printed representation of OBJECT, any Lisp object.\n\
 No quoting characters are used; no delimiters are printed around\n\
 the contents of strings.\n\
   "Output the printed representation of OBJECT, any Lisp object.\n\
 No quoting characters are used; no delimiters are printed around\n\
 the contents of strings.\n\
-Output stream is PRINTCHARFUN, or value of standard-output (which see).")
+\n\
+OBJECT is any of the Lisp data types: a number, a string, a symbol,\n\
+a list, a buffer, a window, a frame, etc.\n\
+\n\
+A printed representation of an object is text which describes that object.\n\
+\n\
+Optional argument PRINTCHARFUN is the output stream, which can be one\n\
+of these:\n\
+\n\
+   - a buffer, in which case output is inserted into that buffer at point;\n\
+   - a marker, in which case output is inserted at marker's position;\n\
+   - a function, in which case that function is called once for each\n\
+     character of OBJECT's printed representation;\n\
+   - a symbol, in which case that symbol's function definition is called; or\n\
+   - t, in which case the output is displayed in the echo area.\n\
+\n\
+If PRINTCHARFUN is omitted, the value of `standard-output' (which see)\n\
+is used instead.")
   (object, printcharfun)
      Lisp_Object object, printcharfun;
 {
   (object, printcharfun)
      Lisp_Object object, printcharfun;
 {
@@ -760,7 +816,24 @@ DEFUN ("print", Fprint, Sprint, 1, 2, 0,
   "Output the printed representation of OBJECT, with newlines around it.\n\
 Quoting characters are printed when needed to make output that `read'\n\
 can handle, whenever this is possible.\n\
   "Output the printed representation of OBJECT, with newlines around it.\n\
 Quoting characters are printed when needed to make output that `read'\n\
 can handle, whenever this is possible.\n\
-Output stream is PRINTCHARFUN, or value of `standard-output' (which see).")
+\n\
+OBJECT is any of the Lisp data types: a number, a string, a symbol,\n\
+a list, a buffer, a window, a frame, etc.\n\
+\n\
+A printed representation of an object is text which describes that object.\n\
+\n\
+Optional argument PRINTCHARFUN is the output stream, which can be one\n\
+of these:\n\
+\n\
+   - a buffer, in which case output is inserted into that buffer at point;\n\
+   - a marker, in which case output is inserted at marker's position;\n\
+   - a function, in which case that function is called once for each\n\
+     character of OBJECT's printed representation;\n\
+   - a symbol, in which case that symbol's function definition is called; or\n\
+   - t, in which case the output is displayed in the echo area.\n\
+\n\
+If PRINTCHARFUN is omitted, the value of `standard-output' (which see)\n\
+is used instead.")
   (object, printcharfun)
      Lisp_Object object, printcharfun;
 {
   (object, printcharfun)
      Lisp_Object object, printcharfun;
 {
@@ -888,6 +961,16 @@ print_error_message (data, stream)
   tail = Fcdr_safe (data);
   GCPRO1 (tail);
 
   tail = Fcdr_safe (data);
   GCPRO1 (tail);
 
+  /* If we know from where the error was signaled, show it in
+     *Messages*.  */
+  if (!NILP (Vsignaling_function) && SYMBOLP (Vsignaling_function))
+    {
+      char *name = XSYMBOL (Vsignaling_function)->name->data;
+      message_dolog (name, strlen (name), 0, 0);
+      message_dolog (": ", 2, 0, 0);
+      Vsignaling_function = Qnil;
+    }
+
   /* For file-error, make error message by concatenating
      all the data items.  They are all strings.  */
   if (!NILP (file_error) && CONSP (tail))
   /* For file-error, make error message by concatenating
      all the data items.  They are all strings.  */
   if (!NILP (file_error) && CONSP (tail))
@@ -1114,7 +1197,8 @@ print_preprocess (obj)
   if (STRINGP (obj) || CONSP (obj) || VECTORP (obj)
       || COMPILEDP (obj) || CHAR_TABLE_P (obj)
       || (! NILP (Vprint_gensym)
   if (STRINGP (obj) || CONSP (obj) || VECTORP (obj)
       || COMPILEDP (obj) || CHAR_TABLE_P (obj)
       || (! NILP (Vprint_gensym)
-         && SYMBOLP (obj) && NILP (XSYMBOL (obj)->obarray)))
+         && SYMBOLP (obj)
+         && !SYMBOL_INTERNED_P (obj)))
     {
       /* In case print-circle is nil and print-gensym is t,
         add OBJ to Vprint_number_table only when OBJ is a symbol.  */
     {
       /* In case print-circle is nil and print-gensym is t,
         add OBJ to Vprint_number_table only when OBJ is a symbol.  */
@@ -1152,8 +1236,9 @@ print_preprocess (obj)
          /* If Vprint_continuous_numbering is non-nil and OBJ is a gensym,
             always print the gensym with a number.  This is a special for
             the lisp function byte-compile-output-docform.  */
          /* If Vprint_continuous_numbering is non-nil and OBJ is a gensym,
             always print the gensym with a number.  This is a special for
             the lisp function byte-compile-output-docform.  */
-         if (! NILP (Vprint_continuous_numbering) && SYMBOLP (obj)
-             && NILP (XSYMBOL (obj)->obarray))
+         if (!NILP (Vprint_continuous_numbering)
+             && SYMBOLP (obj)
+             && !SYMBOL_INTERNED_P (obj))
            PRINT_NUMBER_STATUS (Vprint_number_table, print_number_index) = Qt;
          print_number_index++;
        }
            PRINT_NUMBER_STATUS (Vprint_number_table, print_number_index) = Qt;
          print_number_index++;
        }
@@ -1175,6 +1260,10 @@ print_preprocess (obj)
          size = XVECTOR (obj)->size & PSEUDOVECTOR_SIZE_MASK;
          for (i = 0; i < size; i++)
            print_preprocess (XVECTOR (obj)->contents[i]);
          size = XVECTOR (obj)->size & PSEUDOVECTOR_SIZE_MASK;
          for (i = 0; i < size; i++)
            print_preprocess (XVECTOR (obj)->contents[i]);
+         break;
+
+       default:
+         break;
        }
     }
 }
        }
     }
 }
@@ -1201,7 +1290,8 @@ print_object (obj, printcharfun, escapeflag)
   if (STRINGP (obj) || CONSP (obj) || VECTORP (obj)
       || COMPILEDP (obj) || CHAR_TABLE_P (obj)
       || (! NILP (Vprint_gensym)
   if (STRINGP (obj) || CONSP (obj) || VECTORP (obj)
       || COMPILEDP (obj) || CHAR_TABLE_P (obj)
       || (! NILP (Vprint_gensym)
-         && SYMBOLP (obj) && NILP (XSYMBOL (obj)->obarray)))
+         && SYMBOLP (obj)
+         && !SYMBOL_INTERNED_P (obj)))
     {
       if (NILP (Vprint_circle) && NILP (Vprint_gensym))
        {
     {
       if (NILP (Vprint_circle) && NILP (Vprint_gensym))
        {
@@ -1418,7 +1508,7 @@ print_object (obj, printcharfun, escapeflag)
        else
          confusing = 0;
 
        else
          confusing = 0;
 
-       if (! NILP (Vprint_gensym) && NILP (XSYMBOL (obj)->obarray))
+       if (! NILP (Vprint_gensym) && !SYMBOL_INTERNED_P (obj))
          {
            PRINTCHAR ('#');
            PRINTCHAR (':');
          {
            PRINTCHAR ('#');
            PRINTCHAR (':');
@@ -1707,6 +1797,7 @@ print_object (obj, printcharfun, escapeflag)
          {
            register int i;
            register Lisp_Object tem;
          {
            register int i;
            register Lisp_Object tem;
+           int real_size = size;
 
            /* Don't print more elements than the specified maximum.  */
            if (NATNUMP (Vprint_length)
 
            /* Don't print more elements than the specified maximum.  */
            if (NATNUMP (Vprint_length)
@@ -1719,6 +1810,8 @@ print_object (obj, printcharfun, escapeflag)
                tem = XVECTOR (obj)->contents[i];
                print_object (tem, printcharfun, escapeflag);
              }
                tem = XVECTOR (obj)->contents[i];
                print_object (tem, printcharfun, escapeflag);
              }
+           if (size < real_size)
+             strout (" ...", 4, 4, printcharfun, 0);
          }
          PRINTCHAR (']');
        }
          }
          PRINTCHAR (']');
        }
@@ -1914,17 +2007,17 @@ that represents the number without losing information.");
 
   DEFVAR_LISP ("print-length", &Vprint_length,
     "Maximum length of list to print before abbreviating.\n\
 
   DEFVAR_LISP ("print-length", &Vprint_length,
     "Maximum length of list to print before abbreviating.\n\
-A value of nil means no limit.");
+A value of nil means no limit.  See also `eval-expression-print-length'.");
   Vprint_length = Qnil;
 
   DEFVAR_LISP ("print-level", &Vprint_level,
     "Maximum depth of list nesting to print before abbreviating.\n\
   Vprint_length = Qnil;
 
   DEFVAR_LISP ("print-level", &Vprint_level,
     "Maximum depth of list nesting to print before abbreviating.\n\
-A value of nil means no limit.");
+A value of nil means no limit.  See also `eval-expression-print-level'.");
   Vprint_level = Qnil;
 
   DEFVAR_BOOL ("print-escape-newlines", &print_escape_newlines,
   Vprint_level = Qnil;
 
   DEFVAR_BOOL ("print-escape-newlines", &print_escape_newlines,
-    "Non-nil means print newlines in strings as backslash-n.\n\
-Also print formfeeds as backslash-f.");
+    "Non-nil means print newlines in strings as `\\n'.\n\
+Also print formfeeds as `\\f'.");
   print_escape_newlines = 0;
 
   DEFVAR_BOOL ("print-escape-nonascii", &print_escape_nonascii,
   print_escape_newlines = 0;
 
   DEFVAR_BOOL ("print-escape-nonascii", &print_escape_nonascii,
@@ -1935,20 +2028,20 @@ Only single-byte characters are affected, and only in `prin1'.");
 
   DEFVAR_BOOL ("print-escape-multibyte", &print_escape_multibyte,
     "Non-nil means print multibyte characters in strings as \\xXXXX.\n\
 
   DEFVAR_BOOL ("print-escape-multibyte", &print_escape_multibyte,
     "Non-nil means print multibyte characters in strings as \\xXXXX.\n\
-\(XXX is the hex representation of the character code.)\n\
+\(XXXX is the hex representation of the character code.)\n\
 This affects only `prin1'.");
   print_escape_multibyte = 0;
 
   DEFVAR_BOOL ("print-quoted", &print_quoted,
     "Non-nil means print quoted forms with reader syntax.\n\
 This affects only `prin1'.");
   print_escape_multibyte = 0;
 
   DEFVAR_BOOL ("print-quoted", &print_quoted,
     "Non-nil means print quoted forms with reader syntax.\n\
-I.e., (quote foo) prints as 'foo, (function foo) as #'foo, and, backquoted\n\
-forms print in the new syntax.");
+I.e., (quote foo) prints as 'foo, (function foo) as #'foo, and backquoted\n\
+forms print as in the new syntax.");
   print_quoted = 0;
 
   DEFVAR_LISP ("print-gensym", &Vprint_gensym,
     "Non-nil means print uninterned symbols so they will read as uninterned.\n\
 I.e., the value of (make-symbol \"foobar\") prints as #:foobar.\n\
   print_quoted = 0;
 
   DEFVAR_LISP ("print-gensym", &Vprint_gensym,
     "Non-nil means print uninterned symbols so they will read as uninterned.\n\
 I.e., the value of (make-symbol \"foobar\") prints as #:foobar.\n\
-When the uninterned symbol appears within a recursive data structure\n\
+When the uninterned symbol appears within a recursive data structure,\n\
 and the symbol appears more than once, in addition use the #N# and #N=\n\
 constructs as needed, so that multiple references to the same symbol are\n\
 shared once again when the text is read back.");
 and the symbol appears more than once, in addition use the #N# and #N=\n\
 constructs as needed, so that multiple references to the same symbol are\n\
 shared once again when the text is read back.");
@@ -1967,15 +2060,19 @@ where N is a positive decimal integer.");
   Vprint_circle = Qnil;
 
   DEFVAR_LISP ("print-continuous-numbering", &Vprint_continuous_numbering,
   Vprint_circle = Qnil;
 
   DEFVAR_LISP ("print-continuous-numbering", &Vprint_continuous_numbering,
-  "*Non-nil means keep numbering between several print functions.\n\
-See `print-gensym' nad `print-circle'.  See also `print-number-table'.");
+  "*Non-nil means number continuously across print calls.\n\
+This affects the numbers printed for #N= labels and #M# references.\n\
+See also `print-circle', `print-gensym', and `print-number-table'.\n\
+This variable should not be set with `setq'; bind it with a `let' instead.");
   Vprint_continuous_numbering = Qnil;
 
   DEFVAR_LISP ("print-number-table", &Vprint_number_table,
   Vprint_continuous_numbering = Qnil;
 
   DEFVAR_LISP ("print-number-table", &Vprint_number_table,
-  "A vector keeping the information of the current printed object.\n\
-This variable shouldn't be modified in Lisp level, but should be binded\n\
-with nil using let at the same position with `print-continuous-numbering',\n\
-so that the value of this variable can be freed after printing.");
+  "A vector used internally to produce `#N=' labels and `#N#' references.\n\
+The Lisp printer uses this vector to detect Lisp objects referenced more\n\
+than once.  When `print-continuous-numbering' is bound to t, you should\n\
+probably also bind `print-number-table' to nil.  This ensures that the\n\
+value of `print-number-table' can be garbage-collected once the printing\n\
+is done.");
   Vprint_number_table = Qnil;
 
   /* prin1_to_string_buffer initialized in init_buffer_once in buffer.c */
   Vprint_number_table = Qnil;
 
   /* prin1_to_string_buffer initialized in init_buffer_once in buffer.c */