X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/41e962982dfe424c69ed99f0bd26a6e4eb67107f..2ea2a2f1a5b5b2e1b20f1ee8c86058334d0a2652:/src/callint.c diff --git a/src/callint.c b/src/callint.c index 9a4573c77b..053ee6cdaa 100644 --- a/src/callint.c +++ b/src/callint.c @@ -1,13 +1,13 @@ /* Call a Lisp function interactively. - Copyright (C) 1985-1986, 1993-1995, 1997, 2000-2014 Free Software + Copyright (C) 1985-1986, 1993-1995, 1997, 2000-2016 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. +the Free Software Foundation, either version 3 of the License, or (at +your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -23,23 +23,9 @@ along with GNU Emacs. If not, see . */ #include "lisp.h" #include "character.h" #include "buffer.h" -#include "commands.h" #include "keyboard.h" #include "window.h" -#include "keymap.h" -Lisp_Object Qminus, Qplus; -static Lisp_Object Qfuncall_interactively; -static Lisp_Object Qcommand_debug_status; -static Lisp_Object Qenable_recursive_minibuffers; - -static Lisp_Object Qhandle_shift_selection; -static Lisp_Object Qread_number; - -Lisp_Object Qmouse_leave_buffer_hook; - -static Lisp_Object Qlist, Qlet, Qletx, Qsave_excursion, Qif; -Lisp_Object Qwhen, Qprogn; static Lisp_Object preserved_fns; /* Marker used within call-interactively to refer to point. */ @@ -55,20 +41,24 @@ For example, write (defun foo (arg buf) "Doc string" (interactive "P\\nbbuffer: ") .... ) to make ARG be the raw prefix argument, and set BUF to an existing buffer, when `foo' is called as a command. -The "call" to `interactive' is actually a declaration rather than a function; - it tells `call-interactively' how to read arguments - to pass to the function. -When actually called, `interactive' just returns nil. - -Usually the argument of `interactive' is a string containing a code letter - followed optionally by a prompt. (Some code letters do not use I/O to get - the argument and do not use prompts.) To get several arguments, concatenate - the individual strings, separating them by newline characters. -Prompts are passed to format, and may use % escapes to print the + +The "call" to `interactive' is actually a declaration rather than a + function; it tells `call-interactively' how to read arguments to pass + to the function. When actually called, `interactive' just returns + nil. + +Usually the argument of `interactive' is a string containing a code + letter followed optionally by a prompt. (Some code letters do not + use I/O to get the argument and do not use prompts.) To pass several + arguments to the command, concatenate the individual strings, + separating them by newline characters. + +Prompts are passed to `format', and may use % escapes to print the arguments that have already been read. If the argument is not a string, it is evaluated to get a list of - arguments to pass to the function. -Just `(interactive)' means pass no args when calling interactively. + arguments to pass to the command. +Just `(interactive)' means pass no arguments to the command when + calling interactively. Code letters available are: a -- Function name: symbol with a function definition. @@ -113,7 +103,8 @@ If the string begins with `^' and `shift-select-mode' is non-nil, 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) */) +usage: (interactive &optional ARG-DESCRIPTOR) */ + attributes: const) (Lisp_Object args) { return Qnil; @@ -239,18 +230,9 @@ static Lisp_Object read_file_name (Lisp_Object default_filename, Lisp_Object mustmatch, Lisp_Object initial, Lisp_Object predicate) { - struct gcpro gcpro1; - Lisp_Object args[7]; - - GCPRO1 (default_filename); - args[0] = intern ("read-file-name"); - args[1] = callint_message; - args[2] = Qnil; - args[3] = default_filename; - args[4] = mustmatch; - args[5] = initial; - args[6] = predicate; - RETURN_UNGCPRO (Ffuncall (7, args)); + return CALLN (Ffuncall, intern ("read-file-name"), + callint_message, Qnil, default_filename, + mustmatch, initial, predicate); } /* BEWARE: Calling this directly from C would defeat the purpose! */ @@ -290,7 +272,7 @@ invoke it. If KEYS is omitted or nil, the return value of { /* `args' will contain the array of arguments to pass to the function. `visargs' will contain the same list but in a nicer form, so that if we - pass it to `Fformat' it will be understandable to a human. */ + pass it to `Fformat_message' it will be understandable to a human. */ Lisp_Object *args, *visargs; Lisp_Object specs; Lisp_Object filter_specs; @@ -316,7 +298,6 @@ invoke it. If KEYS is omitted or nil, the return value of ptrdiff_t i, nargs; ptrdiff_t mark; bool arg_from_tty = 0; - struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5; ptrdiff_t key_count; bool record_then_fail = 0; @@ -358,9 +339,7 @@ invoke it. If KEYS is omitted or nil, the return value of /* Set SPECS to the interactive form, or barf if not interactive. */ { Lisp_Object form; - GCPRO2 (function, prefix_arg); form = Finteractive_form (function); - UNGCPRO; if (CONSP (form)) specs = filter_specs = Fcar (XCDR (form)); else @@ -375,11 +354,9 @@ invoke it. If KEYS is omitted or nil, the return value of uintmax_t events = num_input_events; input = specs; /* Compute the arg values using the user's expression. */ - GCPRO2 (input, filter_specs); specs = Feval (specs, CONSP (funval) && EQ (Qclosure, XCAR (funval)) ? CAR_SAFE (XCDR (funval)) : Qnil); - UNGCPRO; if (events != num_input_events || !NILP (record_flag)) { /* We should record this command on the command history. */ @@ -408,15 +385,11 @@ invoke it. If KEYS is omitted or nil, the return value of Vreal_this_command = save_real_this_command; kset_last_command (current_kboard, save_last_command); - { - Lisp_Object args[3]; - args[0] = Qfuncall_interactively; - args[1] = function; - args[2] = specs; - Lisp_Object result = unbind_to (speccount, Fapply (3, args)); - SAFE_FREE (); - return result; - } + Lisp_Object result + = unbind_to (speccount, CALLN (Fapply, Qfuncall_interactively, + function, specs)); + SAFE_FREE (); + return result; } /* SPECS is set to a string; use it as an interactive prompt. @@ -448,13 +421,13 @@ invoke it. If KEYS is omitted or nil, the return value of { if (! (*p == 'r' || *p == 'p' || *p == 'P' || *p == '\n')) - Fbarf_if_buffer_read_only (); + Fbarf_if_buffer_read_only (Qnil); p++; } record_then_fail = 1; } else - Fbarf_if_buffer_read_only (); + Fbarf_if_buffer_read_only (Qnil); } } /* Ignore this for semi-compatibility with Lucid. */ @@ -477,7 +450,7 @@ invoke it. If KEYS is omitted or nil, the return value of error ("Attempt to select inactive minibuffer window"); /* If the current buffer wants to clean up, let it. */ - Frun_hooks (1, &Qmouse_leave_buffer_hook); + run_hook (Qmouse_leave_buffer_hook); Fselect_window (w, Qnil); } @@ -520,16 +493,7 @@ invoke it. If KEYS is omitted or nil, the return value of visargs = args + nargs; varies = (signed char *) (visargs + nargs); - for (i = 0; i < nargs; i++) - { - args[i] = Qnil; - visargs[i] = Qnil; - varies[i] = 0; - } - - GCPRO5 (prefix_arg, function, *args, *visargs, up_event); - gcpro3.nvars = nargs; - gcpro4.nvars = nargs; + memclear (args, nargs * (2 * word_size + 1)); if (!NILP (enable)) specbind (Qenable_recursive_minibuffers, Qt); @@ -539,7 +503,7 @@ invoke it. If KEYS is omitted or nil, the return value of { visargs[1] = make_string (tem + 1, strcspn (tem + 1, "\n")); if (strchr (SSDATA (visargs[1]), '%')) - callint_message = Fformat (i - 1, visargs + 1); + callint_message = Fformat_message (i - 1, visargs + 1); else callint_message = visargs[1]; @@ -558,13 +522,13 @@ invoke it. If KEYS is omitted or nil, the return value of args[i] = Fcurrent_buffer (); if (EQ (selected_window, minibuf_window)) args[i] = Fother_buffer (args[i], Qnil, Qnil); - args[i] = Fread_buffer (callint_message, args[i], Qt); + args[i] = Fread_buffer (callint_message, args[i], Qt, Qnil); break; case 'B': /* Name of buffer, possibly nonexistent. */ args[i] = Fread_buffer (callint_message, Fother_buffer (Fcurrent_buffer (), Qnil, Qnil), - Qnil); + Qnil, Qnil); break; case 'c': /* Character. */ @@ -642,9 +606,9 @@ invoke it. If KEYS is omitted or nil, the return value of { Lisp_Object tem2; - teml = Fget (teml, intern ("event-symbol-elements")); + teml = Fget (teml, Qevent_symbol_elements); /* Ignore first element, which is the base key. */ - tem2 = Fmemq (intern ("down"), Fcdr (teml)); + tem2 = Fmemq (Qdown, Fcdr (teml)); if (! NILP (tem2)) up_event = Fread_event (Qnil, Qnil, Qnil); } @@ -674,9 +638,9 @@ invoke it. If KEYS is omitted or nil, the return value of { Lisp_Object tem2; - teml = Fget (teml, intern ("event-symbol-elements")); + teml = Fget (teml, Qevent_symbol_elements); /* Ignore first element, which is the base key. */ - tem2 = Fmemq (intern ("down"), Fcdr (teml)); + tem2 = Fmemq (Qdown, Fcdr (teml)); if (! NILP (tem2)) up_event = Fread_event (Qnil, Qnil, Qnil); } @@ -792,7 +756,7 @@ invoke it. If KEYS is omitted or nil, the return value of argument if no prefix. */ if (NILP (prefix_arg)) { - args[i] = Qnil; + /* args[i] = Qnil; */ varies[i] = -1; } else @@ -865,7 +829,7 @@ invoke it. If KEYS is omitted or nil, the return value of XSETINT (args[i], marker_position (args[i])); if (record_then_fail) - Fbarf_if_buffer_read_only (); + Fbarf_if_buffer_read_only (Qnil); Vthis_command = save_this_command; Vthis_original_command = save_this_original_command; @@ -874,7 +838,6 @@ invoke it. If KEYS is omitted or nil, the return value of { Lisp_Object val = Ffuncall (nargs, args); - UNGCPRO; val = unbind_to (speccount, val); SAFE_FREE (); return val; @@ -931,7 +894,6 @@ syms_of_callint (void) DEFSYM (Qhandle_shift_selection, "handle-shift-selection"); DEFSYM (Qread_number, "read-number"); DEFSYM (Qfuncall_interactively, "funcall-interactively"); - DEFSYM (Qcommand_debug_status, "command-debug-status"); DEFSYM (Qenable_recursive_minibuffers, "enable-recursive-minibuffers"); DEFSYM (Qmouse_leave_buffer_hook, "mouse-leave-buffer-hook");