MAINTAINERS: Update Eli Zaretskii's responsibilities.
[bpt/emacs.git] / src / callint.c
index 3641fbc..4a011b5 100644 (file)
@@ -1,6 +1,6 @@
 /* Call a Lisp function interactively.
    Copyright (C) 1985, 1986, 1993, 1994, 1995, 1997, 2000, 2001, 2002,
-                 2003, 2004, 2005, 2006, 2007, 2008, 2009
+                 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
                  Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -20,6 +20,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
 #include <config.h>
+#include <setjmp.h>
 
 #include "lisp.h"
 #include "buffer.h"
@@ -29,7 +30,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include "keymap.h"
 
 #ifdef HAVE_INDEX
-extern char *index P_ ((const char *, int));
+extern char *index (const char *, int);
 #endif
 
 extern Lisp_Object Qcursor_in_echo_area;
@@ -42,6 +43,7 @@ Lisp_Object Vcommand_history;
 
 extern Lisp_Object Vhistory_length;
 extern Lisp_Object Vthis_original_command, real_this_command;
+extern int history_delete_duplicates;
 
 Lisp_Object Vcommand_debug_status, Qcommand_debug_status;
 Lisp_Object Qenable_recursive_minibuffers;
@@ -125,7 +127,7 @@ If the string begins with `@', Emacs searches the key sequence which
  invoked the command for its first mouse click (or any other event
  which specifies a window).
 If the string begins with `^' and `shift-select-mode' is non-nil,
- Emacs first calls the function `handle-shift-select'.
+ Emacs first calls the function `handle-shift-selection'.
 You may use `@', `*', and `^' together.  They are processed in the
  order that they appear, before reading any arguments.
 usage: (interactive &optional ARGS)  */)
@@ -138,8 +140,7 @@ usage: (interactive &optional ARGS)  */)
 /* Quotify EXP: if EXP is constant, return it.
    If EXP is not constant, return (quote EXP).  */
 Lisp_Object
-quotify_arg (exp)
-     register Lisp_Object exp;
+quotify_arg (register Lisp_Object exp)
 {
   if (!INTEGERP (exp) && !STRINGP (exp)
       && !NILP (exp) && !EQ (exp, Qt))
@@ -150,8 +151,7 @@ quotify_arg (exp)
 
 /* Modify EXP by quotifying each element (except the first).  */
 Lisp_Object
-quotify_args (exp)
-     Lisp_Object exp;
+quotify_args (Lisp_Object exp)
 {
   register Lisp_Object tail;
   Lisp_Object next;
@@ -167,8 +167,7 @@ char *callint_argfuns[]
     = {"", "point", "mark", "region-beginning", "region-end"};
 
 static void
-check_mark (for_region)
-     int for_region;
+check_mark (int for_region)
 {
   Lisp_Object tem;
   tem = Fmarker_buffer (current_buffer->mark);
@@ -189,8 +188,7 @@ check_mark (for_region)
    of VALUES to do its job.  */
 
 static void
-fix_command (input, values)
-     Lisp_Object input, values;
+fix_command (Lisp_Object input, Lisp_Object values)
 {
   if (CONSP (input))
     {
@@ -350,8 +348,7 @@ invoke it.  If KEYS is omitted or nil, the return value of
       /* Make a copy of string so that if a GC relocates specs,
         `string' will still be valid.  */
       string = (unsigned char *) alloca (SBYTES (specs) + 1);
-      bcopy (SDATA (specs), string,
-            SBYTES (specs) + 1);
+      memcpy (string, SDATA (specs), SBYTES (specs) + 1);
     }
   else
     {
@@ -366,12 +363,15 @@ invoke it.  If KEYS is omitted or nil, the return value of
        {
          /* We should record this command on the command history.  */
          Lisp_Object values;
+         Lisp_Object this_cmd;
          /* Make a copy of the list of values, for the command history,
             and turn them into things we can eval.  */
          values = quotify_args (Fcopy_sequence (specs));
          fix_command (input, values);
-         Vcommand_history
-           = Fcons (Fcons (function, values), Vcommand_history);
+         this_cmd = Fcons (function, values);
+         if (history_delete_duplicates)
+           Vcommand_history = Fdelete (this_cmd, Vcommand_history);
+         Vcommand_history = Fcons (this_cmd, Vcommand_history);
 
          /* Don't keep command history around forever.  */
          if (INTEGERP (Vhistory_length) && XINT (Vhistory_length) > 0)
@@ -892,7 +892,7 @@ Its numeric meaning is what you would get from `(interactive "p")'.  */)
 }
 
 void
-syms_of_callint ()
+syms_of_callint (void)
 {
   point_marker = Fmake_marker ();
   staticpro (&point_marker);
@@ -900,46 +900,45 @@ syms_of_callint ()
   callint_message = Qnil;
   staticpro (&callint_message);
 
-  preserved_fns = Fcons (intern ("region-beginning"),
-                        Fcons (intern ("region-end"),
-                               Fcons (intern ("point"),
-                                      Fcons (intern ("mark"), Qnil))));
-  staticpro (&preserved_fns);
+  preserved_fns = pure_cons (intern_c_string ("region-beginning"),
+                        pure_cons (intern_c_string ("region-end"),
+                               pure_cons (intern_c_string ("point"),
+                                      pure_cons (intern_c_string ("mark"), Qnil))));
 
-  Qlist = intern ("list");
+  Qlist = intern_c_string ("list");
   staticpro (&Qlist);
-  Qlet = intern ("let");
+  Qlet = intern_c_string ("let");
   staticpro (&Qlet);
-  Qif = intern ("if");
+  Qif = intern_c_string ("if");
   staticpro (&Qif);
-  Qwhen = intern ("when");
+  Qwhen = intern_c_string ("when");
   staticpro (&Qwhen);
-  Qletx = intern ("let*");
+  Qletx = intern_c_string ("let*");
   staticpro (&Qletx);
-  Qsave_excursion = intern ("save-excursion");
+  Qsave_excursion = intern_c_string ("save-excursion");
   staticpro (&Qsave_excursion);
-  Qprogn = intern ("progn");
+  Qprogn = intern_c_string ("progn");
   staticpro (&Qprogn);
 
-  Qminus = intern ("-");
+  Qminus = intern_c_string ("-");
   staticpro (&Qminus);
 
-  Qplus = intern ("+");
+  Qplus = intern_c_string ("+");
   staticpro (&Qplus);
 
-  Qhandle_shift_selection = intern ("handle-shift-selection");
+  Qhandle_shift_selection = intern_c_string ("handle-shift-selection");
   staticpro (&Qhandle_shift_selection);
 
-  Qcall_interactively = intern ("call-interactively");
+  Qcall_interactively = intern_c_string ("call-interactively");
   staticpro (&Qcall_interactively);
 
-  Qcommand_debug_status = intern ("command-debug-status");
+  Qcommand_debug_status = intern_c_string ("command-debug-status");
   staticpro (&Qcommand_debug_status);
 
-  Qenable_recursive_minibuffers = intern ("enable-recursive-minibuffers");
+  Qenable_recursive_minibuffers = intern_c_string ("enable-recursive-minibuffers");
   staticpro (&Qenable_recursive_minibuffers);
 
-  Qmouse_leave_buffer_hook = intern ("mouse-leave-buffer-hook");
+  Qmouse_leave_buffer_hook = intern_c_string ("mouse-leave-buffer-hook");
   staticpro (&Qmouse_leave_buffer_hook);
 
   DEFVAR_KBOARD ("prefix-arg", Vprefix_arg,