(SMBP): Deleted. All uses changed to STRING_MULTIBYTE.
[bpt/emacs.git] / src / callint.c
CommitLineData
ec28a64d 1/* Call a Lisp function interactively.
b9f0b172 2 Copyright (C) 1985, 86, 93, 94, 95, 1997, 2000, 2002
4f895918 3 Free Software Foundation, Inc.
ec28a64d
MB
4
5This file is part of GNU Emacs.
6
7GNU Emacs is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
dbc4e1c1 9the Free Software Foundation; either version 2, or (at your option)
ec28a64d
MB
10any later version.
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU Emacs; see the file COPYING. If not, write to
3b7ad313
EN
19the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA. */
ec28a64d
MB
21
22
18160b98 23#include <config.h>
fdb82f93 24
ec28a64d
MB
25#include "lisp.h"
26#include "buffer.h"
27#include "commands.h"
760cbdd3 28#include "keyboard.h"
ec28a64d 29#include "window.h"
8feddab4 30#include "keymap.h"
ec28a64d 31
8892f40b
GM
32#ifdef HAVE_INDEX
33extern char *index P_ ((const char *, int));
a847af86 34#endif
ec28a64d 35
c631c234 36extern Lisp_Object Qcursor_in_echo_area;
93ed5f9d 37extern Lisp_Object Qfile_directory_p;
c631c234 38
1e0c5826 39Lisp_Object Vcurrent_prefix_arg, Qminus, Qplus;
ec28a64d
MB
40Lisp_Object Qcall_interactively;
41Lisp_Object Vcommand_history;
42
225c2157
RS
43extern Lisp_Object Vhistory_length;
44
ec28a64d 45Lisp_Object Vcommand_debug_status, Qcommand_debug_status;
52614803 46Lisp_Object Qenable_recursive_minibuffers;
ec28a64d 47
9f315aeb
RS
48/* Non-nil means treat the mark as active
49 even if mark_active is 0. */
50Lisp_Object Vmark_even_if_inactive;
51
ef2515c0
RS
52Lisp_Object Vmouse_leave_buffer_hook, Qmouse_leave_buffer_hook;
53
8450690a 54Lisp_Object Qlist, Qlet, Qletx, Qsave_excursion;
824977b6
RS
55static Lisp_Object preserved_fns;
56
57/* Marker used within call-interactively to refer to point. */
58static Lisp_Object point_marker;
03e130d5 59
df31bc64
RS
60/* Buffer for the prompt text used in Fcall_interactively. */
61static char *callint_message;
62
63/* Allocated length of that buffer. */
64static int callint_message_size;
1cf9cfc6 65
ec28a64d
MB
66/* ARGSUSED */
67DEFUN ("interactive", Finteractive, Sinteractive, 0, UNEVALLED, 0,
fdb82f93
PJ
68 doc: /* Specify a way of parsing arguments for interactive use of a function.
69For example, write
70 (defun foo (arg) "Doc string" (interactive "p") ...use arg...)
71to make ARG be the prefix argument when `foo' is called as a command.
72The "call" to `interactive' is actually a declaration rather than a function;
73 it tells `call-interactively' how to read arguments
74 to pass to the function.
75When actually called, `interactive' just returns nil.
76
77The argument of `interactive' is usually a string containing a code letter
78 followed by a prompt. (Some code letters do not use I/O to get
79 the argument and do not need prompts.) To prompt for multiple arguments,
80 give a code letter, its prompt, a newline, and another code letter, etc.
81 Prompts are passed to format, and may use % escapes to print the
82 arguments that have already been read.
83If the argument is not a string, it is evaluated to get a list of
84 arguments to pass to the function.
85Just `(interactive)' means pass no args when calling interactively.
86
87Code letters available are:
88a -- Function name: symbol with a function definition.
89b -- Name of existing buffer.
90B -- Name of buffer, possibly nonexistent.
91c -- Character (no input method is used).
92C -- Command name: symbol with interactive function definition.
93d -- Value of point as number. Does not do I/O.
94D -- Directory name.
95e -- Parametrized event (i.e., one that's a list) that invoked this command.
96 If used more than once, the Nth `e' returns the Nth parameterized event.
97 This skips events that are integers or symbols.
98f -- Existing file name.
99F -- Possibly nonexistent file name.
100i -- Ignored, i.e. always nil. Does not do I/O.
101k -- Key sequence (downcase the last event if needed to get a definition).
102K -- Key sequence to be redefined (do not downcase the last event).
103m -- Value of mark as number. Does not do I/O.
104M -- Any string. Inherits the current input method.
105n -- Number read using minibuffer.
106N -- Raw prefix arg, or if none, do like code `n'.
107p -- Prefix arg converted to number. Does not do I/O.
108P -- Prefix arg in raw form. Does not do I/O.
109r -- Region: point and mark as 2 numeric args, smallest first. Does no I/O.
110s -- Any string. Does not inherit the current input method.
111S -- Any symbol.
112v -- Variable name: symbol that is user-variable-p.
113x -- Lisp expression read but not evaluated.
114X -- Lisp expression read and evaluated.
115z -- Coding system.
116Z -- Coding system, nil if no prefix arg.
117In addition, if the string begins with `*'
118 then an error is signaled if the buffer is read-only.
119 This happens before reading any arguments.
120If the string begins with `@', then Emacs searches the key sequence
121 which invoked the command for its first mouse click (or any other
122 event which specifies a window), and selects that window before
123 reading any arguments. You may use both `@' and `*'; they are
84cc45a7
PJ
124 processed in the order that they appear.
125usage: (interactive ARGS) */)
fdb82f93 126 (args)
ec28a64d
MB
127 Lisp_Object args;
128{
129 return Qnil;
130}
131
132/* Quotify EXP: if EXP is constant, return it.
133 If EXP is not constant, return (quote EXP). */
134Lisp_Object
135quotify_arg (exp)
136 register Lisp_Object exp;
137{
6e54b3de 138 if (!INTEGERP (exp) && !STRINGP (exp)
265a9e55 139 && !NILP (exp) && !EQ (exp, Qt))
ec28a64d
MB
140 return Fcons (Qquote, Fcons (exp, Qnil));
141
142 return exp;
143}
144
145/* Modify EXP by quotifying each element (except the first). */
146Lisp_Object
147quotify_args (exp)
148 Lisp_Object exp;
149{
150 register Lisp_Object tail;
7539e11f
KR
151 Lisp_Object next;
152 for (tail = exp; CONSP (tail); tail = next)
ec28a64d 153 {
7539e11f 154 next = XCDR (tail);
f3fbd155 155 XSETCAR (tail, quotify_arg (XCAR (tail)));
ec28a64d
MB
156 }
157 return exp;
158}
159
160char *callint_argfuns[]
161 = {"", "point", "mark", "region-beginning", "region-end"};
162
163static void
f203cf07
RS
164check_mark (for_region)
165 int for_region;
ec28a64d 166{
86c1cf23
KH
167 Lisp_Object tem;
168 tem = Fmarker_buffer (current_buffer->mark);
265a9e55 169 if (NILP (tem) || (XBUFFER (tem) != current_buffer))
f203cf07
RS
170 error (for_region ? "The mark is not set now, so there is no region"
171 : "The mark is not set now");
6497d2d8
RM
172 if (!NILP (Vtransient_mark_mode) && NILP (Vmark_even_if_inactive)
173 && NILP (current_buffer->mark_active))
174 Fsignal (Qmark_inactive, Qnil);
ec28a64d
MB
175}
176
177
d455db8e 178DEFUN ("call-interactively", Fcall_interactively, Scall_interactively, 1, 3, 0,
fdb82f93
PJ
179 doc: /* Call FUNCTION, reading args according to its interactive calling specs.
180Return the value FUNCTION returns.
181The function contains a specification of how to do the argument reading.
182In the case of user-defined functions, this is specified by placing a call
183to the function `interactive' at the top level of the function body.
184See `interactive'.
185
186Optional second arg RECORD-FLAG non-nil
187means unconditionally put this command in the command-history.
188Otherwise, this is done only if an arg is read using the minibuffer.
189Optional third arg KEYS, if given, specifies the sequence of events to
190supply if the command inquires which events were used to invoke it. */)
191 (function, record_flag, keys)
7868a977 192 Lisp_Object function, record_flag, keys;
ec28a64d
MB
193{
194 Lisp_Object *args, *visargs;
195 unsigned char **argstrings;
196 Lisp_Object fun;
197 Lisp_Object funcar;
198 Lisp_Object specs;
199 Lisp_Object teml;
52614803 200 Lisp_Object enable;
aed13378 201 int speccount = SPECPDL_INDEX ();
ec28a64d 202
bc78232c
JB
203 /* The index of the next element of this_command_keys to examine for
204 the 'e' interactive code. */
dbc4e1c1 205 int next_event;
bc78232c 206
ec28a64d
MB
207 Lisp_Object prefix_arg;
208 unsigned char *string;
209 unsigned char *tem;
63007de2
JB
210
211 /* If varies[i] > 0, the i'th argument shouldn't just have its value
212 in this call quoted in the command history. It should be
213 recorded as a call to the function named callint_argfuns[varies[i]]. */
ec28a64d 214 int *varies;
63007de2 215
ec28a64d
MB
216 register int i, j;
217 int count, foo;
ec28a64d
MB
218 char prompt1[100];
219 char *tem1;
220 int arg_from_tty = 0;
221 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
d455db8e
RS
222 int key_count;
223
224 if (NILP (keys))
225 keys = this_command_keys, key_count = this_command_key_count;
226 else
227 {
b7826503 228 CHECK_VECTOR (keys);
d455db8e
RS
229 key_count = XVECTOR (keys)->size;
230 }
ec28a64d 231
e5d77022 232 /* Save this now, since use of minibuffer will clobber it. */
8c917bf2 233 prefix_arg = Vcurrent_prefix_arg;
ec28a64d 234
46947372 235 retry:
ec28a64d 236
6e54b3de 237 if (SYMBOLP (function))
afa4c0f3 238 enable = Fget (function, Qenable_recursive_minibuffers);
4f895918
GM
239 else
240 enable = Qnil;
52614803 241
ffd56f97 242 fun = indirect_function (function);
ec28a64d
MB
243
244 specs = Qnil;
245 string = 0;
246
247 /* Decode the kind of function. Either handle it and return,
248 or go to `lose' if not interactive, or go to `retry'
249 to specify a different function, or set either STRING or SPECS. */
250
6e54b3de 251 if (SUBRP (fun))
ec28a64d
MB
252 {
253 string = (unsigned char *) XSUBR (fun)->prompt;
254 if (!string)
255 {
256 lose:
b37902c8 257 function = wrong_type_argument (Qcommandp, function);
ec28a64d
MB
258 goto retry;
259 }
ec28a64d 260 }
6e54b3de 261 else if (COMPILEDP (fun))
ec28a64d 262 {
f9b4aacf 263 if ((XVECTOR (fun)->size & PSEUDOVECTOR_SIZE_MASK) <= COMPILED_INTERACTIVE)
ec28a64d
MB
264 goto lose;
265 specs = XVECTOR (fun)->contents[COMPILED_INTERACTIVE];
266 }
267 else if (!CONSP (fun))
268 goto lose;
01e85d61 269 else if (funcar = XCAR (fun), EQ (funcar, Qautoload))
ec28a64d
MB
270 {
271 GCPRO2 (function, prefix_arg);
272 do_autoload (fun, function);
273 UNGCPRO;
274 goto retry;
275 }
276 else if (EQ (funcar, Qlambda))
277 {
01e85d61 278 specs = Fassq (Qinteractive, Fcdr (XCDR (fun)));
265a9e55 279 if (NILP (specs))
ec28a64d
MB
280 goto lose;
281 specs = Fcar (Fcdr (specs));
282 }
ec28a64d
MB
283 else
284 goto lose;
285
46947372 286 /* If either specs or string is set to a string, use it. */
6e54b3de 287 if (STRINGP (specs))
46947372
JB
288 {
289 /* Make a copy of string so that if a GC relocates specs,
290 `string' will still be valid. */
fc932ac6
RS
291 string = (unsigned char *) alloca (STRING_BYTES (XSTRING (specs)) + 1);
292 bcopy (XSTRING (specs)->data, string,
293 STRING_BYTES (XSTRING (specs)) + 1);
46947372 294 }
ec28a64d
MB
295 else if (string == 0)
296 {
03e130d5 297 Lisp_Object input;
91a6ba78 298 i = num_input_events;
03e130d5
RS
299 input = specs;
300 /* Compute the arg values using the user's expression. */
6bc1abf2 301 specs = Feval (specs);
91a6ba78 302 if (i != num_input_events || !NILP (record_flag))
03e130d5
RS
303 {
304 /* We should record this command on the command history. */
305 Lisp_Object values, car;
306 /* Make a copy of the list of values, for the command history,
307 and turn them into things we can eval. */
308 values = quotify_args (Fcopy_sequence (specs));
309 /* If the list of args was produced with an explicit call to `list',
310 look for elements that were computed with (region-beginning)
311 or (region-end), and put those expressions into VALUES
312 instead of the present values. */
8450690a 313 if (CONSP (input))
03e130d5 314 {
70949dac 315 car = XCAR (input);
8450690a
RS
316 /* Skip through certain special forms. */
317 while (EQ (car, Qlet) || EQ (car, Qletx)
318 || EQ (car, Qsave_excursion))
03e130d5 319 {
70949dac
KR
320 while (CONSP (XCDR (input)))
321 input = XCDR (input);
322 input = XCAR (input);
8450690a
RS
323 if (!CONSP (input))
324 break;
70949dac 325 car = XCAR (input);
8450690a
RS
326 }
327 if (EQ (car, Qlist))
328 {
329 Lisp_Object intail, valtail;
330 for (intail = Fcdr (input), valtail = values;
331 CONSP (valtail);
332 intail = Fcdr (intail), valtail = Fcdr (valtail))
03e130d5 333 {
8450690a
RS
334 Lisp_Object elt;
335 elt = Fcar (intail);
336 if (CONSP (elt))
337 {
338 Lisp_Object presflag;
339 presflag = Fmemq (Fcar (elt), preserved_fns);
340 if (!NILP (presflag))
341 Fsetcar (valtail, Fcar (intail));
342 }
03e130d5
RS
343 }
344 }
345 }
346 Vcommand_history
347 = Fcons (Fcons (function, values), Vcommand_history);
225c2157
RS
348
349 /* Don't keep command history around forever. */
b9f0b172 350 if (INTEGERP (Vhistory_length) && XINT (Vhistory_length) > 0)
225c2157
RS
351 {
352 teml = Fnthcdr (Vhistory_length, Vcommand_history);
353 if (CONSP (teml))
f3fbd155 354 XSETCDR (teml, Qnil);
225c2157 355 }
03e130d5 356 }
652e2240 357 single_kboard_state ();
ec28a64d
MB
358 return apply1 (function, specs);
359 }
360
361 /* Here if function specifies a string to control parsing the defaults */
362
dbc4e1c1 363 /* Set next_event to point to the first event with parameters. */
d455db8e
RS
364 for (next_event = 0; next_event < key_count; next_event++)
365 if (EVENT_HAS_PARAMETERS (XVECTOR (keys)->contents[next_event]))
dbc4e1c1
JB
366 break;
367
42bb2790 368 /* Handle special starting chars `*' and `@'. Also `-'. */
e92d107b 369 /* Note that `+' is reserved for user extensions. */
ec28a64d
MB
370 while (1)
371 {
fb775602 372 if (*string == '+')
e92d107b
RS
373 error ("`+' is not used in `interactive' for ordinary commands");
374 else if (*string == '*')
ec28a64d
MB
375 {
376 string++;
265a9e55 377 if (!NILP (current_buffer->read_only))
ec28a64d
MB
378 Fbarf_if_buffer_read_only ();
379 }
42bb2790
RS
380 /* Ignore this for semi-compatibility with Lucid. */
381 else if (*string == '-')
382 string++;
ec28a64d
MB
383 else if (*string == '@')
384 {
86c1cf23 385 Lisp_Object event;
dbc4e1c1 386
d455db8e 387 event = XVECTOR (keys)->contents[next_event];
dbc4e1c1 388 if (EVENT_HAS_PARAMETERS (event)
70949dac
KR
389 && (event = XCDR (event), CONSP (event))
390 && (event = XCAR (event), CONSP (event))
391 && (event = XCAR (event), WINDOWP (event)))
d1fa2e8a 392 {
d68807fc 393 if (MINI_WINDOW_P (XWINDOW (event))
42bb2790 394 && ! (minibuf_level > 0 && EQ (event, minibuf_window)))
d1fa2e8a 395 error ("Attempt to select inactive minibuffer window");
ef2515c0
RS
396
397 /* If the current buffer wants to clean up, let it. */
398 if (!NILP (Vmouse_leave_buffer_hook))
399 call1 (Vrun_hooks, Qmouse_leave_buffer_hook);
400
d1fa2e8a
KH
401 Fselect_window (event);
402 }
ec28a64d 403 string++;
ec28a64d
MB
404 }
405 else break;
406 }
407
408 /* Count the number of arguments the interactive spec would have
409 us give to the function. */
410 tem = string;
411 for (j = 0; *tem; j++)
412 {
413 /* 'r' specifications ("point and mark as 2 numeric args")
414 produce *two* arguments. */
415 if (*tem == 'r') j++;
416 tem = (unsigned char *) index (tem, '\n');
417 if (tem)
418 tem++;
419 else
420 tem = (unsigned char *) "";
421 }
6bc1abf2 422 count = j;
ec28a64d
MB
423
424 args = (Lisp_Object *) alloca ((count + 1) * sizeof (Lisp_Object));
425 visargs = (Lisp_Object *) alloca ((count + 1) * sizeof (Lisp_Object));
426 argstrings = (unsigned char **) alloca ((count + 1) * sizeof (char *));
427 varies = (int *) alloca ((count + 1) * sizeof (int));
428
429 for (i = 0; i < (count + 1); i++)
430 {
431 args[i] = Qnil;
432 visargs[i] = Qnil;
433 varies[i] = 0;
434 }
435
436 GCPRO4 (prefix_arg, function, *args, *visargs);
437 gcpro3.nvars = (count + 1);
438 gcpro4.nvars = (count + 1);
439
52614803
RS
440 if (!NILP (enable))
441 specbind (Qenable_recursive_minibuffers, Qt);
442
ec28a64d 443 tem = string;
6bc1abf2 444 for (i = 1; *tem; i++)
ec28a64d
MB
445 {
446 strncpy (prompt1, tem + 1, sizeof prompt1 - 1);
447 prompt1[sizeof prompt1 - 1] = 0;
a847af86 448 tem1 = (char *) index (prompt1, '\n');
ec28a64d
MB
449 if (tem1) *tem1 = 0;
450 /* Fill argstrings with a vector of C strings
451 corresponding to the Lisp strings in visargs. */
452 for (j = 1; j < i; j++)
453 argstrings[j]
dc330139
RS
454 = (EQ (visargs[j], Qnil)
455 ? (unsigned char *) ""
456 : XSTRING (visargs[j])->data);
ec28a64d 457
df31bc64
RS
458 /* Process the format-string in prompt1, putting the output
459 into callint_message. Make callint_message bigger if necessary.
460 We don't use a buffer on the stack, because the contents
461 need to stay stable for a while. */
462 while (1)
463 {
464 int nchars = doprnt (callint_message, callint_message_size,
465 prompt1, (char *)0,
dc330139 466 j - 1, (char **) argstrings + 1);
c2b736ca 467 if (nchars < callint_message_size - 1)
df31bc64
RS
468 break;
469 callint_message_size *= 2;
470 callint_message
471 = (char *) xrealloc (callint_message, callint_message_size);
472 }
ec28a64d
MB
473
474 switch (*tem)
475 {
476 case 'a': /* Symbol defined as a function */
df31bc64 477 visargs[i] = Fcompleting_read (build_string (callint_message),
ff9cd111 478 Vobarray, Qfboundp, Qt,
93fb51ae 479 Qnil, Qnil, Qnil, Qnil);
ec28a64d
MB
480 /* Passing args[i] directly stimulates compiler bug */
481 teml = visargs[i];
482 args[i] = Fintern (teml, Qnil);
483 break;
484
485 case 'b': /* Name of existing buffer */
486 args[i] = Fcurrent_buffer ();
487 if (EQ (selected_window, minibuf_window))
34c5d0ed 488 args[i] = Fother_buffer (args[i], Qnil, Qnil);
df31bc64 489 args[i] = Fread_buffer (build_string (callint_message), args[i], Qt);
ec28a64d
MB
490 break;
491
492 case 'B': /* Name of buffer, possibly nonexistent */
df31bc64 493 args[i] = Fread_buffer (build_string (callint_message),
34c5d0ed 494 Fother_buffer (Fcurrent_buffer (), Qnil, Qnil),
9262fcb6 495 Qnil);
ec28a64d
MB
496 break;
497
498 case 'c': /* Character */
562e4a4f 499 args[i] = Fread_char (build_string (callint_message), Qnil);
453ed650 500 message1_nolog ((char *) 0);
ec28a64d
MB
501 /* Passing args[i] directly stimulates compiler bug */
502 teml = args[i];
503 visargs[i] = Fchar_to_string (teml);
504 break;
505
506 case 'C': /* Command: symbol with interactive function */
df31bc64 507 visargs[i] = Fcompleting_read (build_string (callint_message),
ff9cd111 508 Vobarray, Qcommandp,
93fb51ae 509 Qt, Qnil, Qnil, Qnil, Qnil);
ec28a64d
MB
510 /* Passing args[i] directly stimulates compiler bug */
511 teml = visargs[i];
512 args[i] = Fintern (teml, Qnil);
513 break;
514
515 case 'd': /* Value of point. Does not do I/O. */
dc330139 516 set_marker_both (point_marker, Qnil, PT, PT_BYTE);
824977b6 517 args[i] = point_marker;
ec28a64d
MB
518 /* visargs[i] = Qnil; */
519 varies[i] = 1;
520 break;
521
ec28a64d 522 case 'D': /* Directory name. */
df31bc64 523 args[i] = Fread_file_name (build_string (callint_message), Qnil,
93ed5f9d
KS
524 current_buffer->directory, Qlambda, Qnil,
525 Qfile_directory_p);
ec28a64d
MB
526 break;
527
528 case 'f': /* Existing file name. */
df31bc64 529 args[i] = Fread_file_name (build_string (callint_message),
93ed5f9d 530 Qnil, Qnil, Qlambda, Qnil, Qnil);
ec28a64d
MB
531 break;
532
533 case 'F': /* Possibly nonexistent file name. */
df31bc64 534 args[i] = Fread_file_name (build_string (callint_message),
93ed5f9d 535 Qnil, Qnil, Qnil, Qnil, Qnil);
ec28a64d
MB
536 break;
537
40b2421c
KH
538 case 'i': /* Ignore an argument -- Does not do I/O */
539 varies[i] = -1;
540 break;
541
1989e7bc 542 case 'k': /* Key sequence. */
c631c234 543 {
aed13378 544 int speccount1 = SPECPDL_INDEX ();
c631c234
RS
545 specbind (Qcursor_in_echo_area, Qt);
546 args[i] = Fread_key_sequence (build_string (callint_message),
ad4ac475 547 Qnil, Qnil, Qnil, Qnil);
c631c234
RS
548 unbind_to (speccount1, Qnil);
549 teml = args[i];
550 visargs[i] = Fkey_description (teml);
cdfac812
RS
551
552 /* If the key sequence ends with a down-event,
553 discard the following up-event. */
554 teml = Faref (args[i], make_number (XINT (Flength (args[i])) - 1));
555 if (CONSP (teml))
70949dac 556 teml = XCAR (teml);
cdfac812
RS
557 if (SYMBOLP (teml))
558 {
559 Lisp_Object tem2;
560
561 teml = Fget (teml, intern ("event-symbol-elements"));
4b27f17c
AS
562 /* Ignore first element, which is the base key. */
563 tem2 = Fmemq (intern ("down"), Fcdr (teml));
cdfac812 564 if (! NILP (tem2))
7a983715 565 Fread_event (Qnil, Qnil);
cdfac812 566 }
c631c234 567 }
1989e7bc
RS
568 break;
569
570 case 'K': /* Key sequence to be defined. */
c631c234 571 {
aed13378 572 int speccount1 = SPECPDL_INDEX ();
c631c234
RS
573 specbind (Qcursor_in_echo_area, Qt);
574 args[i] = Fread_key_sequence (build_string (callint_message),
ad4ac475 575 Qnil, Qt, Qnil, Qnil);
c631c234
RS
576 teml = args[i];
577 visargs[i] = Fkey_description (teml);
578 unbind_to (speccount1, Qnil);
cdfac812
RS
579
580 /* If the key sequence ends with a down-event,
581 discard the following up-event. */
582 teml = Faref (args[i], make_number (XINT (Flength (args[i])) - 1));
583 if (CONSP (teml))
70949dac 584 teml = XCAR (teml);
cdfac812
RS
585 if (SYMBOLP (teml))
586 {
587 Lisp_Object tem2;
588
589 teml = Fget (teml, intern ("event-symbol-elements"));
4b27f17c
AS
590 /* Ignore first element, which is the base key. */
591 tem2 = Fmemq (intern ("down"), Fcdr (teml));
cdfac812 592 if (! NILP (tem2))
7a983715 593 Fread_event (Qnil, Qnil);
cdfac812 594 }
c631c234 595 }
ec28a64d
MB
596 break;
597
bc78232c 598 case 'e': /* The invoking event. */
d455db8e 599 if (next_event >= key_count)
bc78232c 600 error ("%s must be bound to an event with parameters",
6e54b3de 601 (SYMBOLP (function)
2f445366 602 ? (char *) XSTRING (SYMBOL_NAME (function))->data
bc78232c 603 : "command"));
d455db8e 604 args[i] = XVECTOR (keys)->contents[next_event++];
e5d77022 605 varies[i] = -1;
dbc4e1c1
JB
606
607 /* Find the next parameterized event. */
d455db8e 608 while (next_event < key_count
dbc4e1c1 609 && ! (EVENT_HAS_PARAMETERS
d455db8e 610 (XVECTOR (keys)->contents[next_event])))
dbc4e1c1
JB
611 next_event++;
612
63007de2
JB
613 break;
614
ec28a64d 615 case 'm': /* Value of mark. Does not do I/O. */
f203cf07 616 check_mark (0);
ec28a64d 617 /* visargs[i] = Qnil; */
824977b6 618 args[i] = current_buffer->mark;
ec28a64d
MB
619 varies[i] = 2;
620 break;
621
93fb51ae
KH
622 case 'M': /* String read via minibuffer with
623 inheriting the current input method. */
624 args[i] = Fread_string (build_string (callint_message),
625 Qnil, Qnil, Qnil, Qt);
626 break;
627
ec28a64d 628 case 'N': /* Prefix arg, else number from minibuffer */
265a9e55 629 if (!NILP (prefix_arg))
ec28a64d
MB
630 goto have_prefix_arg;
631 case 'n': /* Read number from minibuffer. */
f0490a0b
RS
632 {
633 int first = 1;
634 do
635 {
636 Lisp_Object tem;
637 if (! first)
638 {
639 message ("Please enter a number.");
56fe6fc0 640 sit_for (1, 0, 0, 0, 0);
f0490a0b
RS
641 }
642 first = 0;
643
644 tem = Fread_from_minibuffer (build_string (callint_message),
93fb51ae
KH
645 Qnil, Qnil, Qnil, Qnil, Qnil,
646 Qnil);
f0490a0b
RS
647 if (! STRINGP (tem) || XSTRING (tem)->size == 0)
648 args[i] = Qnil;
649 else
650 args[i] = Fread (tem);
651 }
652 while (! NUMBERP (args[i]));
653 }
ec28a64d
MB
654 visargs[i] = last_minibuf_string;
655 break;
656
657 case 'P': /* Prefix arg in raw form. Does no I/O. */
ec28a64d
MB
658 args[i] = prefix_arg;
659 /* visargs[i] = Qnil; */
660 varies[i] = -1;
661 break;
662
663 case 'p': /* Prefix arg converted to number. No I/O. */
71eda2d5 664 have_prefix_arg:
ec28a64d
MB
665 args[i] = Fprefix_numeric_value (prefix_arg);
666 /* visargs[i] = Qnil; */
667 varies[i] = -1;
668 break;
669
670 case 'r': /* Region, point and mark as 2 args. */
f203cf07 671 check_mark (1);
dc330139 672 set_marker_both (point_marker, Qnil, PT, PT_BYTE);
ec28a64d
MB
673 /* visargs[i+1] = Qnil; */
674 foo = marker_position (current_buffer->mark);
675 /* visargs[i] = Qnil; */
6ec8bbd2 676 args[i] = PT < foo ? point_marker : current_buffer->mark;
ec28a64d 677 varies[i] = 3;
6ec8bbd2 678 args[++i] = PT > foo ? point_marker : current_buffer->mark;
ec28a64d
MB
679 varies[i] = 4;
680 break;
681
93fb51ae
KH
682 case 's': /* String read via minibuffer without
683 inheriting the current input method. */
55c4d99f 684 args[i] = Fread_string (build_string (callint_message),
93fb51ae 685 Qnil, Qnil, Qnil, Qnil);
ec28a64d
MB
686 break;
687
688 case 'S': /* Any symbol. */
df31bc64 689 visargs[i] = Fread_string (build_string (callint_message),
93fb51ae 690 Qnil, Qnil, Qnil, Qnil);
ec28a64d
MB
691 /* Passing args[i] directly stimulates compiler bug */
692 teml = visargs[i];
693 args[i] = Fintern (teml, Qnil);
694 break;
695
696 case 'v': /* Variable name: symbol that is
697 user-variable-p. */
ff9cd111 698 args[i] = Fread_variable (build_string (callint_message), Qnil);
ec28a64d
MB
699 visargs[i] = last_minibuf_string;
700 break;
701
702 case 'x': /* Lisp expression read but not evaluated */
df31bc64 703 args[i] = Fread_minibuffer (build_string (callint_message), Qnil);
ec28a64d
MB
704 visargs[i] = last_minibuf_string;
705 break;
706
707 case 'X': /* Lisp expression read and evaluated */
df31bc64 708 args[i] = Feval_minibuffer (build_string (callint_message), Qnil);
ec28a64d
MB
709 visargs[i] = last_minibuf_string;
710 break;
711
40b2421c
KH
712 case 'Z': /* Coding-system symbol, or ignore the
713 argument if no prefix */
714 if (NILP (prefix_arg))
715 {
716 args[i] = Qnil;
717 varies[i] = -1;
718 }
719 else
720 {
721 args[i]
722 = Fread_non_nil_coding_system (build_string (callint_message));
723 visargs[i] = last_minibuf_string;
724 }
725 break;
726
727 case 'z': /* Coding-system symbol or nil */
024d8713 728 args[i] = Fread_coding_system (build_string (callint_message), Qnil);
40b2421c
KH
729 visargs[i] = last_minibuf_string;
730 break;
731
e92d107b
RS
732 /* We have a case for `+' so we get an error
733 if anyone tries to define one here. */
734 case '+':
ec28a64d 735 default:
e92d107b 736 error ("Invalid control letter `%c' (%03o) in interactive calling string",
ec28a64d
MB
737 *tem, *tem);
738 }
739
740 if (varies[i] == 0)
741 arg_from_tty = 1;
742
6e54b3de 743 if (NILP (visargs[i]) && STRINGP (args[i]))
ec28a64d
MB
744 visargs[i] = args[i];
745
746 tem = (unsigned char *) index (tem, '\n');
747 if (tem) tem++;
748 else tem = (unsigned char *) "";
749 }
52614803 750 unbind_to (speccount, Qnil);
ec28a64d
MB
751
752 QUIT;
753
754 args[0] = function;
755
7868a977 756 if (arg_from_tty || !NILP (record_flag))
ec28a64d
MB
757 {
758 visargs[0] = function;
63007de2 759 for (i = 1; i < count + 1; i++)
824977b6
RS
760 {
761 if (varies[i] > 0)
762 visargs[i] = Fcons (intern (callint_argfuns[varies[i]]), Qnil);
763 else
764 visargs[i] = quotify_arg (args[i]);
765 }
ec28a64d
MB
766 Vcommand_history = Fcons (Flist (count + 1, visargs),
767 Vcommand_history);
225c2157 768 /* Don't keep command history around forever. */
b9f0b172 769 if (INTEGERP (Vhistory_length) && XINT (Vhistory_length) > 0)
225c2157
RS
770 {
771 teml = Fnthcdr (Vhistory_length, Vcommand_history);
772 if (CONSP (teml))
f3fbd155 773 XSETCDR (teml, Qnil);
225c2157 774 }
ec28a64d
MB
775 }
776
824977b6
RS
777 /* If we used a marker to hold point, mark, or an end of the region,
778 temporarily, convert it to an integer now. */
f4c8ded2 779 for (i = 1; i <= count; i++)
824977b6
RS
780 if (varies[i] >= 1 && varies[i] <= 4)
781 XSETINT (args[i], marker_position (args[i]));
782
652e2240 783 single_kboard_state ();
ebfbe249 784
ec28a64d
MB
785 {
786 Lisp_Object val;
ec28a64d
MB
787 specbind (Qcommand_debug_status, Qnil);
788
789 val = Ffuncall (count + 1, args);
790 UNGCPRO;
791 return unbind_to (speccount, val);
792 }
793}
794
795DEFUN ("prefix-numeric-value", Fprefix_numeric_value, Sprefix_numeric_value,
fdb82f93
PJ
796 1, 1, 0,
797 doc: /* Return numeric meaning of raw prefix argument RAW.
798A raw prefix argument is what you get from `(interactive "P")'.
799Its numeric meaning is what you would get from `(interactive "p")'. */)
800 (raw)
ec28a64d
MB
801 Lisp_Object raw;
802{
803 Lisp_Object val;
804
265a9e55 805 if (NILP (raw))
acab6442 806 XSETFASTINT (val, 1);
fd5285f3 807 else if (EQ (raw, Qminus))
ec28a64d 808 XSETINT (val, -1);
70949dac
KR
809 else if (CONSP (raw) && INTEGERP (XCAR (raw)))
810 XSETINT (val, XINT (XCAR (raw)));
6e54b3de 811 else if (INTEGERP (raw))
ec28a64d
MB
812 val = raw;
813 else
acab6442 814 XSETFASTINT (val, 1);
ec28a64d
MB
815
816 return val;
817}
818
dfcf069d 819void
ec28a64d
MB
820syms_of_callint ()
821{
824977b6
RS
822 point_marker = Fmake_marker ();
823 staticpro (&point_marker);
824
03e130d5
RS
825 preserved_fns = Fcons (intern ("region-beginning"),
826 Fcons (intern ("region-end"),
827 Fcons (intern ("point"),
828 Fcons (intern ("mark"), Qnil))));
829 staticpro (&preserved_fns);
830
831 Qlist = intern ("list");
832 staticpro (&Qlist);
8450690a
RS
833 Qlet = intern ("let");
834 staticpro (&Qlet);
835 Qletx = intern ("let*");
836 staticpro (&Qletx);
837 Qsave_excursion = intern ("save-excursion");
838 staticpro (&Qsave_excursion);
03e130d5 839
ec28a64d
MB
840 Qminus = intern ("-");
841 staticpro (&Qminus);
842
fdb4a38c
RS
843 Qplus = intern ("+");
844 staticpro (&Qplus);
845
ec28a64d
MB
846 Qcall_interactively = intern ("call-interactively");
847 staticpro (&Qcall_interactively);
848
849 Qcommand_debug_status = intern ("command-debug-status");
850 staticpro (&Qcommand_debug_status);
851
52614803
RS
852 Qenable_recursive_minibuffers = intern ("enable-recursive-minibuffers");
853 staticpro (&Qenable_recursive_minibuffers);
854
ef2515c0
RS
855 Qmouse_leave_buffer_hook = intern ("mouse-leave-buffer-hook");
856 staticpro (&Qmouse_leave_buffer_hook);
857
df31bc64
RS
858 callint_message_size = 100;
859 callint_message = (char *) xmalloc (callint_message_size);
860
861
1e0c5826 862 DEFVAR_KBOARD ("prefix-arg", Vprefix_arg,
fdb82f93
PJ
863 doc: /* The value of the prefix argument for the next editing command.
864It may be a number, or the symbol `-' for just a minus sign as arg,
865or a list whose car is a number for just one or more C-u's
866or nil if no argument has been specified.
867
868You cannot examine this variable to find the argument for this command
869since it has been set to nil by the time you can look.
870Instead, you should use the variable `current-prefix-arg', although
871normally commands can get this prefix argument with (interactive "P"). */);
8c917bf2 872
fe3fbdcc 873 DEFVAR_KBOARD ("last-prefix-arg", Vlast_prefix_arg,
fdb82f93
PJ
874 doc: /* The value of the prefix argument for the previous editing command.
875See `prefix-arg' for the meaning of the value. */);
fe3fbdcc 876
8c917bf2 877 DEFVAR_LISP ("current-prefix-arg", &Vcurrent_prefix_arg,
fdb82f93
PJ
878 doc: /* The value of the prefix argument for this editing command.
879It may be a number, or the symbol `-' for just a minus sign as arg,
880or a list whose car is a number for just one or more C-u's
881or nil if no argument has been specified.
882This is what `(interactive \"P\")' returns. */);
8c917bf2
KH
883 Vcurrent_prefix_arg = Qnil;
884
ec28a64d 885 DEFVAR_LISP ("command-history", &Vcommand_history,
fdb82f93
PJ
886 doc: /* List of recent commands that read arguments from terminal.
887Each command is represented as a form to evaluate. */);
ec28a64d
MB
888 Vcommand_history = Qnil;
889
890 DEFVAR_LISP ("command-debug-status", &Vcommand_debug_status,
fdb82f93
PJ
891 doc: /* Debugging status of current interactive command.
892Bound each time `call-interactively' is called;
893may be set by the debugger as a reminder for itself. */);
ec28a64d
MB
894 Vcommand_debug_status = Qnil;
895
2ad6c959 896 DEFVAR_LISP ("mark-even-if-inactive", &Vmark_even_if_inactive,
fdb82f93
PJ
897 doc: /* *Non-nil means you can use the mark even when inactive.
898This option makes a difference in Transient Mark mode.
899When the option is non-nil, deactivation of the mark
900turns off region highlighting, but commands that use the mark
901behave as if the mark were still active. */);
9f315aeb
RS
902 Vmark_even_if_inactive = Qnil;
903
ef2515c0 904 DEFVAR_LISP ("mouse-leave-buffer-hook", &Vmouse_leave_buffer_hook,
fdb82f93
PJ
905 doc: /* Hook to run when about to switch windows with a mouse command.
906Its purpose is to give temporary modes such as Isearch mode
907a way to turn themselves off when a mouse command switches windows. */);
ef2515c0
RS
908 Vmouse_leave_buffer_hook = Qnil;
909
ec28a64d
MB
910 defsubr (&Sinteractive);
911 defsubr (&Scall_interactively);
912 defsubr (&Sprefix_numeric_value);
913}