emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/callint.c


From: Richard M. Stallman
Subject: [Emacs-diffs] Changes to emacs/src/callint.c
Date: Sun, 23 Feb 2003 10:13:41 -0500

Index: emacs/src/callint.c
diff -c emacs/src/callint.c:1.122 emacs/src/callint.c:1.123
*** emacs/src/callint.c:1.122   Tue Feb  4 09:03:11 2003
--- emacs/src/callint.c Sun Feb 23 10:13:41 2003
***************
*** 51,57 ****
  
  Lisp_Object Vmouse_leave_buffer_hook, Qmouse_leave_buffer_hook;
  
! Lisp_Object Qlist, Qlet, Qletx, Qsave_excursion, Qprogn;
  static Lisp_Object preserved_fns;
  
  /* Marker used within call-interactively to refer to point.  */
--- 51,57 ----
  
  Lisp_Object Vmouse_leave_buffer_hook, Qmouse_leave_buffer_hook;
  
! Lisp_Object Qlist, Qlet, Qletx, Qsave_excursion, Qprogn, Qif, Qwhen;
  static Lisp_Object preserved_fns;
  
  /* Marker used within call-interactively to refer to point.  */
***************
*** 315,358 ****
          /* 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));
!         /* If the list of args was produced with an explicit call to `list',
!            look for elements that were computed with (region-beginning)
!            or (region-end), and put those expressions into VALUES
!            instead of the present values.  */
!         if (CONSP (input))
!           {
!             car = XCAR (input);
!             /* Skip through certain special forms.  */
!             while (EQ (car, Qlet) || EQ (car, Qletx)
!                    || EQ (car, Qsave_excursion)
!                    || EQ (car, Qprogn))
!               {
!                 while (CONSP (XCDR (input)))
!                   input = XCDR (input);
!                 input = XCAR (input);
!                 if (!CONSP (input))
!                   break;
!                 car = XCAR (input);
!               }
!             if (EQ (car, Qlist))
!               {
!                 Lisp_Object intail, valtail;
!                 for (intail = Fcdr (input), valtail = values;
!                      CONSP (valtail);
!                      intail = Fcdr (intail), valtail = Fcdr (valtail))
!                   {
!                     Lisp_Object elt;
!                     elt = Fcar (intail);
!                     if (CONSP (elt))
!                       {
!                         Lisp_Object presflag;
!                         presflag = Fmemq (Fcar (elt), preserved_fns);
!                         if (!NILP (presflag))
!                           Fsetcar (valtail, Fcar (intail));
!                       }
!                   }
!               }
!           }
          Vcommand_history
            = Fcons (Fcons (function, values), Vcommand_history);
  
--- 315,321 ----
          /* 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);
  
***************
*** 822,827 ****
--- 785,854 ----
    }
  }
  
+ Lisp_Object
+ fix_command (input, values)
+      Lisp_Object input, values;
+ {
+   /* If the list of args was produced with an explicit call to `list',
+      look for elements that were computed with (region-beginning)
+      or (region-end), and put those expressions into VALUES
+      instead of the present values.  */
+   if (CONSP (input))
+     {
+       Lisp_Object car;
+ 
+       car = XCAR (input);
+       /* Skip through certain special forms.  */
+       while (EQ (car, Qlet) || EQ (car, Qletx)
+            || EQ (car, Qsave_excursion)
+            || EQ (car, Qprogn))
+       {
+         while (CONSP (XCDR (input)))
+           input = XCDR (input);
+         input = XCAR (input);
+         if (!CONSP (input))
+           break;
+         car = XCAR (input);
+       }
+       if (EQ (car, Qlist))
+       {
+         Lisp_Object intail, valtail;
+         for (intail = Fcdr (input), valtail = values;
+              CONSP (valtail);
+              intail = Fcdr (intail), valtail = Fcdr (valtail))
+           {
+             Lisp_Object elt;
+             elt = Fcar (intail);
+             if (CONSP (elt))
+               {
+                 Lisp_Object presflag, carelt;
+                 carelt = Fcar (elt);
+                 /* If it is (if X Y), look at Y.  */
+                 if (EQ (carelt, Qif)
+                     && EQ (Fnthcdr (make_number (3), elt), Qnil))
+                   elt = Fnth (make_number (2), elt);
+                 /* If it is (when ... Y), look at Y.  */
+                 else if (EQ (carelt, Qwhen))
+                   {
+                     while (CONSP (XCDR (elt)))
+                       elt = XCDR (elt);
+                     elt = Fcar (elt);
+                   }
+ 
+                 /* If the function call we're looking at
+                    is a special preserved one, copy the
+                    whole expression for this argument.  */
+                 if (CONSP (elt))
+                   {
+                     presflag = Fmemq (Fcar (elt), preserved_fns);
+                     if (!NILP (presflag))
+                       Fsetcar (valtail, Fcar (intail));
+                   }
+               }
+           }
+       }
+     }
+ }
  DEFUN ("prefix-numeric-value", Fprefix_numeric_value, Sprefix_numeric_value,
         1, 1, 0,
         doc: /* Return numeric meaning of raw prefix argument RAW.
***************
*** 862,867 ****
--- 889,898 ----
    staticpro (&Qlist);
    Qlet = intern ("let");
    staticpro (&Qlet);
+   Qif = intern ("if");
+   staticpro (&Qif);
+   Qwhen = intern ("when");
+   staticpro (&Qwhen);
    Qletx = intern ("let*");
    staticpro (&Qletx);
    Qsave_excursion = intern ("save-excursion");




reply via email to

[Prev in Thread] Current Thread [Next in Thread]