changeset 90062:e1efd2496a29

Sync to the change in HEAD on 2004-12-01.
author Kenichi Handa <handa@m17n.org>
date Sat, 11 Dec 2004 02:13:31 +0000
parents 48210be97b12
children cd540ce7f0fc
files src/w32console.c
diffstat 1 files changed, 35 insertions(+), 64 deletions(-) [+]
line wrap: on
line diff
--- a/src/w32console.c	Sat Dec 11 02:12:49 2004 +0000
+++ b/src/w32console.c	Sat Dec 11 02:13:31 2004 +0000
@@ -294,8 +294,6 @@
     }
 }
 
-extern unsigned char *terminal_encode_buffer;
-
 extern unsigned char *encode_terminal_code P_ ((struct glyph *, int, 
 						struct coding_system *));
 
@@ -306,10 +304,17 @@
   DWORD r;
   struct frame * f = PICK_FRAME ();
   WORD char_attr;
+  unsigned char *conversion_buffer;
+  struct coding_system *coding;
 
   if (len <= 0)
     return;
 
+  /* If terminal_coding does any conversion, use it, otherwise use
+     safe_terminal_coding.  We can't use CODING_REQUIRE_ENCODING here
+     because it always return 1 if the member src_multibyte is 1.  */
+  coding = (terminal_coding.common_flags & CODING_REQUIRE_ENCODING_MASK
+	    ? &terminal_coding : &safe_terminal_coding);
   /* The mode bit CODING_MODE_LAST_BLOCK should be set to 1 only at
      the tail.  */
   terminal_coding.mode &= ~CODING_MODE_LAST_BLOCK;
@@ -327,71 +332,37 @@
       /* Turn appearance modes of the face of the run on.  */
       char_attr = w32_face_attributes (f, face_id);
 
-      while (n > 0)
-        {
-	  produced = encode_terminal_code (string,
-					   n,
-					   &consumed);
-	  if (produced > 0)
+      if (n == len)
+	/* This is the last run.  */
+	coding->mode |= CODING_MODE_LAST_BLOCK;
+      conversion_buffer = encode_terminal_code (string, n, coding);
+      if (coding->produced > 0)
+	{
+	  /* Set the attribute for these characters.  */
+	  if (!FillConsoleOutputAttribute (cur_screen, char_attr,
+					   coding->produced, cursor_coords,
+					   &r))
 	    {
-              /* Set the attribute for these characters.  */
-              if (!FillConsoleOutputAttribute (cur_screen, char_attr,
-                                               produced, cursor_coords, &r))
-                {
-                  printf ("Failed writing console attributes: %d\n",
-                          GetLastError ());
-                  fflush (stdout);
-                }
-
-              /* Write the characters.  */
-              if (!WriteConsoleOutputCharacter (cur_screen, terminal_encode_buffer,
-                                                produced, cursor_coords, &r))
-                {
-                  printf ("Failed writing console characters: %d\n",
-                          GetLastError ());
-                  fflush (stdout);
-                }
+	      printf ("Failed writing console attributes: %d\n",
+		      GetLastError ());
+	      fflush (stdout);
+	    }
 
-              cursor_coords.X += produced;
-              w32con_move_cursor (cursor_coords.Y, cursor_coords.X);
-            }
-          len -= consumed;
-          n -= consumed;
-          string += consumed;
-        }
-    }
-
-  /* We may have to output some codes to terminate the writing.  */
-  if (CODING_REQUIRE_FLUSHING (&terminal_coding))
-    {
-      Lisp_Object blank_string = build_string ("");
-      int conversion_buffer_size = 1024;
+	  /* Write the characters.  */
+	  if (!WriteConsoleOutputCharacter (cur_screen, terminal_encode_buffer,
+					    coding->produced, cursor_coords,
+					    &r))
+	    {
+	      printf ("Failed writing console characters: %d\n",
+		      GetLastError ());
+	      fflush (stdout);
+	    }
 
-      terminal_coding.mode |= CODING_MODE_LAST_BLOCK;
-      terminal_coding.destination = (unsigned char *) xmalloc (conversion_buffer_size);
-      encode_coding_object (&terminal_coding, blank_string, 0, 0,
-			    0, conversion_buffer_size, Qnil);
-      if (terminal_coding.produced > 0)
-        {
-          if (!FillConsoleOutputAttribute (cur_screen, char_attr_normal,
-                                           terminal_coding.produced,
-                                           cursor_coords, &r))
-            {
-              printf ("Failed writing console attributes: %d\n",
-                      GetLastError ());
-              fflush (stdout);
-            }
-
-          /* Write the characters.  */
-          if (!WriteConsoleOutputCharacter (cur_screen, terminal_coding.destination,
-                                            produced, cursor_coords, &r))
-            {
-              printf ("Failed writing console characters: %d\n",
-                      GetLastError ());
-              fflush (stdout);
-            }
-        }
-      xfree (terminal_coding.destination);
+	  cursor_coords.X += coding->produced;
+	  w32con_move_cursor (cursor_coords.Y, cursor_coords.X);
+	}
+      len -= n;
+      string += n;
     }
 }