# HG changeset patch # User Karl Heuer # Date 819565020 0 # Node ID db7fb833ba037fd3cb4a566d72a431580da0a974 # Parent 89bb535d206d31cfd8ec5c5b651b9aa24fe1d196 (Fcall_interactively): Handle an arg of form (FCN ARGS...). (Fcall_interactively): Move have_prefix_arg label to 'p'. diff -r 89bb535d206d -r db7fb833ba03 src/callint.c --- 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;