]> code.delx.au - gnu-emacs/blobdiff - src/callint.c
(print_error_message): Print data of `end-of-file'
[gnu-emacs] / src / callint.c
index 479372a6c8c5a3b633a333f76f058d4ebc48d328..8efab94673b0eb42c872269eb584406ba7d3db25 100644 (file)
@@ -85,7 +85,7 @@ Just `(interactive)' means pass no args when calling interactively.\n\
 a -- Function name: symbol with a function definition.\n\
 b -- Name of existing buffer.\n\
 B -- Name of buffer, possibly nonexistent.\n\
-c -- Character.\n\
+c -- Character (no input method is used).\n\
 C -- Command name: symbol with interactive function definition.\n\
 d -- Value of point as number.  Does not do I/O.\n\
 D -- Directory name.\n\
@@ -148,11 +148,11 @@ quotify_args (exp)
      Lisp_Object exp;
 {
   register Lisp_Object tail;
-  register struct Lisp_Cons *ptr;
-  for (tail = exp; CONSP (tail); tail = ptr->cdr)
+  Lisp_Object next;
+  for (tail = exp; CONSP (tail); tail = next)
     {
-      ptr = XCONS (tail);
-      ptr->car = quotify_arg (ptr->car);
+      next = XCDR (tail);
+      XCAR (tail) = quotify_arg (XCAR (tail));
     }
   return exp;
 }
@@ -314,17 +314,17 @@ Otherwise, this is done only if an arg is read using the minibuffer.")
             instead of the present values.  */
          if (CONSP (input))
            {
-             car = XCONS (input)->car;
+             car = XCAR (input);
              /* Skip through certain special forms.  */
              while (EQ (car, Qlet) || EQ (car, Qletx)
                     || EQ (car, Qsave_excursion))
                {
-                 while (CONSP (XCONS (input)->cdr))
-                   input = XCONS (input)->cdr;
-                 input = XCONS (input)->car;
+                 while (CONSP (XCDR (input)))
+                   input = XCDR (input);
+                 input = XCAR (input);
                  if (!CONSP (input))
                    break;
-                 car = XCONS (input)->car;
+                 car = XCAR (input);
                }
              if (EQ (car, Qlist))
                {
@@ -353,7 +353,7 @@ Otherwise, this is done only if an arg is read using the minibuffer.")
            {
              teml = Fnthcdr (Vhistory_length, Vcommand_history);
              if (CONSP (teml))
-               XCONS (teml)->cdr = Qnil;
+               XCDR (teml) = Qnil;
            }
        }
       single_kboard_state ();
@@ -388,9 +388,9 @@ Otherwise, this is done only if an arg is read using the minibuffer.")
 
          event = XVECTOR (keys)->contents[next_event];
          if (EVENT_HAS_PARAMETERS (event)
-             && (event = XCONS (event)->cdr, CONSP (event))
-             && (event = XCONS (event)->car, CONSP (event))
-             && (event = XCONS (event)->car, WINDOWP (event)))
+             && (event = XCDR (event), CONSP (event))
+             && (event = XCAR (event), CONSP (event))
+             && (event = XCAR (event), WINDOWP (event)))
            {
              if (MINI_WINDOW_P (XWINDOW (event))
                  && ! (minibuf_level > 0 && EQ (event, minibuf_window)))
@@ -498,11 +498,7 @@ Otherwise, this is done only if an arg is read using the minibuffer.")
          break;
 
         case 'c':              /* Character */
-         /* Use message_with_string rather than message1_nolog here,
-            so that nothing bad happens if callint_message is changed
-            within Fread_char (by a timer, for example).  */
-         message_with_string ("%s", build_string (callint_message), 0);
-         args[i] = Fread_char ();
+         args[i] = Fread_char (build_string (callint_message), Qnil);
          message1_nolog ((char *) 0);
          /* Passing args[i] directly stimulates compiler bug */
          teml = args[i];
@@ -549,10 +545,26 @@ Otherwise, this is done only if an arg is read using the minibuffer.")
            int speccount1 = specpdl_ptr - specpdl;
            specbind (Qcursor_in_echo_area, Qt);
            args[i] = Fread_key_sequence (build_string (callint_message),
-                                         Qnil, Qnil, Qnil);
+                                         Qnil, Qnil, Qnil, Qnil);
            unbind_to (speccount1, Qnil);
            teml = args[i];
            visargs[i] = Fkey_description (teml);
+
+           /* If the key sequence ends with a down-event,
+              discard the following up-event.  */
+           teml = Faref (args[i], make_number (XINT (Flength (args[i])) - 1));
+           if (CONSP (teml))
+             teml = XCAR (teml);
+           if (SYMBOLP (teml))
+             {
+               Lisp_Object tem2;
+
+               teml = Fget (teml, intern ("event-symbol-elements"));
+               /* Ignore first element, which is the base key.  */
+               tem2 = Fmemq (intern ("down"), Fcdr (teml));
+               if (! NILP (tem2))
+                 Fread_event (Qnil, Qnil);
+             }
          }
          break;
 
@@ -561,10 +573,26 @@ Otherwise, this is done only if an arg is read using the minibuffer.")
            int speccount1 = specpdl_ptr - specpdl;
            specbind (Qcursor_in_echo_area, Qt);
            args[i] = Fread_key_sequence (build_string (callint_message),
-                                         Qnil, Qt, Qnil);
+                                         Qnil, Qt, Qnil, Qnil);
            teml = args[i];
            visargs[i] = Fkey_description (teml);
            unbind_to (speccount1, Qnil);
+
+           /* If the key sequence ends with a down-event,
+              discard the following up-event.  */
+           teml = Faref (args[i], make_number (XINT (Flength (args[i])) - 1));
+           if (CONSP (teml))
+             teml = XCAR (teml);
+           if (SYMBOLP (teml))
+             {
+               Lisp_Object tem2;
+
+               teml = Fget (teml, intern ("event-symbol-elements"));
+               /* Ignore first element, which is the base key.  */
+               tem2 = Fmemq (intern ("down"), Fcdr (teml));
+               if (! NILP (tem2))
+                 Fread_event (Qnil, Qnil);
+             }
          }
          break;
 
@@ -743,7 +771,7 @@ Otherwise, this is done only if an arg is read using the minibuffer.")
        {
          teml = Fnthcdr (Vhistory_length, Vcommand_history);
          if (CONSP (teml))
-           XCONS (teml)->cdr = Qnil;
+           XCDR (teml) = Qnil;
        }
     }
 
@@ -779,8 +807,8 @@ Its numeric meaning is what you would get from `(interactive \"p\")'.")
     XSETFASTINT (val, 1);
   else if (EQ (raw, Qminus))
     XSETINT (val, -1);
-  else if (CONSP (raw) && INTEGERP (XCONS (raw)->car))
-    XSETINT (val, XINT (XCONS (raw)->car));
+  else if (CONSP (raw) && INTEGERP (XCAR (raw)))
+    XSETINT (val, XINT (XCAR (raw)));
   else if (INTEGERP (raw))
     val = raw;
   else