changeset 43750:38729301823d

(echo_prompt, echo_char, echo_dash, echo_now) (cancel_echoing, echo_length, echo_truncate): Changed to work with new kboard definition. (echo_now): Use message3_nolog instead of message2_nolog.
author Gerd Moellmann <gerd@gnu.org>
date Wed, 06 Mar 2002 15:55:11 +0000
parents 0df5bec3cfdf
children c82e347557f1
files src/keyboard.c
diffstat 1 files changed, 70 insertions(+), 73 deletions(-) [+]
line wrap: on
line diff
--- a/src/keyboard.c	Wed Mar 06 15:54:43 2002 +0000
+++ b/src/keyboard.c	Wed Mar 06 15:55:11 2002 +0000
@@ -706,38 +706,8 @@
 echo_prompt (str)
      Lisp_Object str;
 {
-  int nbytes = STRING_BYTES (XSTRING (str));
-  int multibyte_p = STRING_MULTIBYTE (str);
-
-  if (nbytes > ECHOBUFSIZE - 4)
-    {
-      if (multibyte_p)
-	{
-	  /* Have to find the last character that fit's into the 
-	     echo buffer.  */
-	  unsigned char *p = XSTRING (str)->data;
-	  unsigned char *pend = p + ECHOBUFSIZE - 4;
-	  int char_len;
-
-	  do
-	    {
-	      PARSE_MULTIBYTE_SEQ (p, pend - p, char_len);
-	      p += char_len;
-	    }
-	  while (p < pend);
-
-	  nbytes = p - XSTRING (str)->data - char_len;
-	}
-      else
-	nbytes = ECHOBUFSIZE - 4;
-    }
-
-  nbytes = copy_text (XSTRING (str)->data, current_kboard->echobuf, nbytes,
-		      STRING_MULTIBYTE (str), 1);
-  current_kboard->echoptr = current_kboard->echobuf + nbytes;
-  *current_kboard->echoptr = '\0';
-  current_kboard->echo_after_prompt = nbytes;
-
+  current_kboard->echo_string = str;
+  current_kboard->echo_after_prompt = XSTRING (str)->size;
   echo_now ();
 }
 
@@ -751,43 +721,64 @@
 {
   if (current_kboard->immediate_echo)
     {
-      char *ptr = current_kboard->echoptr;
-
-      if (ptr != current_kboard->echobuf)
-	*ptr++ = ' ';
+      int size = KEY_DESCRIPTION_SIZE + 100;
+      char *buffer = (char *) alloca (size);
+      char *ptr = buffer;
+      Lisp_Object echo_string;
 
       /* If someone has passed us a composite event, use its head symbol.  */
       c = EVENT_HEAD (c);
 
       if (INTEGERP (c))
 	{
-	  int ch = XINT (c);
-
-	  if (ptr - current_kboard->echobuf
-	      > ECHOBUFSIZE - KEY_DESCRIPTION_SIZE)
-	    return;
-
-	  ptr = push_key_description (ch, ptr, 1);
+	  ptr = push_key_description (XINT (c), ptr, 1);
 	}
       else if (SYMBOLP (c))
 	{
 	  struct Lisp_String *name = XSYMBOL (c)->name;
-	  if ((ptr - current_kboard->echobuf) + STRING_BYTES (name) + 4
-	      > ECHOBUFSIZE)
-	    return;
+	  
+	  if (size - (ptr - buffer) < STRING_BYTES (name))
+	    {
+	      int offset = ptr - buffer;
+	      size = max (2 * size, size + STRING_BYTES (name));
+	      buffer = (char *) alloca (size);
+	      ptr = buffer + offset;
+	    }
+
 	  ptr += copy_text (name->data, ptr, STRING_BYTES (name),
 			    name->size_byte >= 0, 1);
 	}
 
-      if (current_kboard->echoptr == current_kboard->echobuf
+      if ((NILP (current_kboard->echo_string)
+	   || XSTRING (current_kboard->echo_string)->size == 0)
 	  && help_char_p (c))
 	{
-	  strcpy (ptr, " (Type ? for further options)");
-	  ptr += strlen (ptr);
-	}
-
-      *ptr = 0;
-      current_kboard->echoptr = ptr;
+	  const char *text = " (Type ? for further options)";
+	  int len = strlen (text);
+	  
+	  if (size - (ptr - buffer) < len)
+	    {
+	      int offset = ptr - buffer;
+	      size += len;
+	      buffer = (char *) alloca (size);
+	      ptr = buffer + offset;
+	    }
+
+	  bcopy (text, ptr, len);
+	  ptr += len;
+	}
+
+      echo_string = current_kboard->echo_string;
+      
+      /* Replace a dash from echo_dash with a space.  */
+      if (STRINGP (echo_string)
+	  && (size = STRING_BYTES (XSTRING (echo_string)),
+	      (size > 0
+	       && XSTRING (echo_string)->data[size - 1] == '-')))
+	XSTRING (echo_string)->data[size - 1] = ' ';
+
+      current_kboard->echo_string
+	= concat2 (echo_string, make_string (buffer, ptr - buffer));
 
       echo_now ();
     }
@@ -799,22 +790,23 @@
 void
 echo_dash ()
 {
+  /* Do nothing if not echoing at all.  */
+  if (NILP (current_kboard->echo_string))
+    return;
+
   if (!current_kboard->immediate_echo
-      && current_kboard->echoptr == current_kboard->echobuf)
+      && XSTRING (current_kboard->echo_string)->size == 0)
     return;
+      
   /* Do nothing if we just printed a prompt.  */
   if (current_kboard->echo_after_prompt
-      == current_kboard->echoptr - current_kboard->echobuf)
+      == XSTRING (current_kboard->echo_string)->size)
     return;
-  /* Do nothing if not echoing at all.  */
-  if (current_kboard->echoptr == 0)
-    return;
-
+      
   /* Put a dash at the end of the buffer temporarily,
      but make it go away when the next character is added.  */
-  current_kboard->echoptr[0] = '-';
-  current_kboard->echoptr[1] = 0;
-
+  current_kboard->echo_string = concat2 (current_kboard->echo_string,
+					 build_string ("-"));
   echo_now ();
 }
 
@@ -841,8 +833,9 @@
     }
 
   echoing = 1;
-  message2_nolog (current_kboard->echobuf, strlen (current_kboard->echobuf),
-		  1);
+  message3_nolog (current_kboard->echo_string,
+		  STRING_BYTES (XSTRING (current_kboard->echo_string)),
+		  STRING_MULTIBYTE (current_kboard->echo_string));
   echoing = 0;
 
   /* Record in what buffer we echoed, and from which kboard.  */
@@ -859,8 +852,8 @@
 cancel_echoing ()
 {
   current_kboard->immediate_echo = 0;
-  current_kboard->echoptr = current_kboard->echobuf;
   current_kboard->echo_after_prompt = -1;
+  current_kboard->echo_string = Qnil;
   ok_to_echo_at_next_pause = NULL;
   echo_kboard = NULL;
   echo_message_buffer = Qnil;
@@ -871,7 +864,9 @@
 static int
 echo_length ()
 {
-  return current_kboard->echoptr - current_kboard->echobuf;
+  return (STRINGP (current_kboard->echo_string)
+	  ? XSTRING (current_kboard->echo_string)->size
+	  : 0);
 }
 
 /* Truncate the current echo message to its first LEN chars.
@@ -879,12 +874,14 @@
    switches frames while entering a key sequence.  */
 
 static void
-echo_truncate (len)
-     int len;
-{
-  current_kboard->echobuf[len] = '\0';
-  current_kboard->echoptr = current_kboard->echobuf + len;
-  truncate_echo_area (len);
+echo_truncate (nchars)
+     int nchars;
+{
+  if (STRINGP (current_kboard->echo_string))
+    current_kboard->echo_string
+      = Fsubstring (current_kboard->echo_string,
+		    make_number (0), make_number (nchars));
+  truncate_echo_area (nchars);
 }
 
 
@@ -10130,7 +10127,7 @@
   kb->kbd_queue = Qnil;
   kb->kbd_queue_has_data = 0;
   kb->immediate_echo = 0;
-  kb->echoptr = kb->echobuf;
+  kb->echo_string = Qnil;
   kb->echo_after_prompt = -1;
   kb->kbd_macro_buffer = 0;
   kb->kbd_macro_bufsize = 0;