diff src/callint.c @ 13764:db7fb833ba03

(Fcall_interactively): Handle an arg of form (FCN ARGS...). (Fcall_interactively): Move have_prefix_arg label to 'p'.
author Karl Heuer <kwzh@gnu.org>
date Thu, 21 Dec 1995 16:57:00 +0000
parents 8310d6085087
children f5bd72a6fe48
line wrap: on
line diff
--- a/src/callint.c	Thu Dec 21 16:56:26 1995 +0000
+++ b/src/callint.c	Thu Dec 21 16:57:00 1995 +0000
@@ -174,13 +174,16 @@
 \n\
 Optional second arg RECORD-FLAG non-nil\n\
 means unconditionally put this command in the command-history.\n\
-Otherwise, this is done only if an arg is read using the minibuffer.")
+Otherwise, this is done only if an arg is read using the minibuffer.\n\n\
+FUNCTION may be a list (FUNCTION ARGS...), which means to provide\n\
+the arguments ARGS before the ones read by FUNCTION's interactive spec.")
   (function, record, keys)
      Lisp_Object function, record, keys;
 {
   Lisp_Object *args, *visargs;
   unsigned char **argstrings;
   Lisp_Object fun;
+  Lisp_Object given_args;
   Lisp_Object funcar;
   Lisp_Object specs;
   Lisp_Object teml;
@@ -219,6 +222,16 @@
   /* Save this now, since use of minibuffer will clobber it. */
   prefix_arg = Vcurrent_prefix_arg;
 
+  /* Separate out any initial args specified by the caller.  */
+  if (CONSP (function) && ! EQ (XCONS (function)->car, Qlambda)
+      && ! EQ (XCONS (function)->car, Qautoload))
+    {
+      given_args = XCONS (function)->cdr;
+      function = XCONS (function)->car;
+    }
+  else
+    given_args = Qnil;
+
  retry:
 
   if (SYMBOLP (function))
@@ -290,7 +303,7 @@
       i = num_input_chars;
       input = specs;
       /* Compute the arg values using the user's expression.  */
-      specs = Feval (specs);
+      specs = nconc2 (Fcopy_sequence (given_args), Feval (specs));
       if (i != num_input_chars || !NILP (record))
 	{
 	  /* We should record this command on the command history.  */
@@ -403,7 +416,8 @@
       else
 	tem = (unsigned char *) "";
     }
-  count = j;
+  /* Add in the number of args the caller specified.  */
+  count = j + XINT (Flength (given_args));
 
   args = (Lisp_Object *) alloca ((count + 1) * sizeof (Lisp_Object));
   visargs = (Lisp_Object *) alloca ((count + 1) * sizeof (Lisp_Object));
@@ -417,6 +431,16 @@
       varies[i] = 0;
     }
 
+  /* Put any args that the caller specified
+     into the vector.  */
+  i = 1;
+  while (!NILP (given_args))
+    {
+      visargs[i] = args[i] = XCONS (given_args)->car;
+      given_args = XCONS (given_args)->cdr;
+      i++;
+    }
+
   GCPRO4 (prefix_arg, function, *args, *visargs);
   gcpro3.nvars = (count + 1);
   gcpro4.nvars = (count + 1);
@@ -425,7 +449,7 @@
     specbind (Qenable_recursive_minibuffers, Qt);
 
   tem = string;
-  for (i = 1; *tem; i++)
+  for (; *tem; i++)
     {
       strncpy (prompt1, tem + 1, sizeof prompt1 - 1);
       prompt1[sizeof prompt1 - 1] = 0;
@@ -566,13 +590,13 @@
 	  break;
 
 	case 'P':		/* Prefix arg in raw form.  Does no I/O.  */
-	have_prefix_arg:
 	  args[i] = prefix_arg;
 	  /* visargs[i] = Qnil; */
 	  varies[i] = -1;
 	  break;
 
 	case 'p':		/* Prefix arg converted to number.  No I/O. */
+	have_prefix_arg:
 	  args[i] = Fprefix_numeric_value (prefix_arg);
 	  /* visargs[i] = Qnil; */
 	  varies[i] = -1;