]> code.delx.au - gnu-emacs/commitdiff
Sync to the change in HEAD on 2004-12-01.
authorKenichi Handa <handa@m17n.org>
Sat, 11 Dec 2004 02:13:31 +0000 (02:13 +0000)
committerKenichi Handa <handa@m17n.org>
Sat, 11 Dec 2004 02:13:31 +0000 (02:13 +0000)
src/w32console.c

index 170ce5508be8e10d9b92cb9960ae60f10e00def9..e16a89e52a95edd530415d19a1f47e43548c59d3 100644 (file)
@@ -294,8 +294,6 @@ w32con_insert_glyphs (register struct glyph *start, register int len)
     }
 }
 
-extern unsigned char *terminal_encode_buffer;
-
 extern unsigned char *encode_terminal_code P_ ((struct glyph *, int, 
                                                struct coding_system *));
 
@@ -306,10 +304,17 @@ w32con_write_glyphs (register struct glyph *string, register int len)
   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 @@ w32con_write_glyphs (register struct glyph *string, register int len)
       /* 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);
-                }
-
-              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;
-
-      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);
+             printf ("Failed writing console attributes: %d\n",
+                     GetLastError ());
+             fflush (stdout);
+           }
+
+         /* 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);
+           }
+
+         cursor_coords.X += coding->produced;
+         w32con_move_cursor (cursor_coords.Y, cursor_coords.X);
+       }
+      len -= n;
+      string += n;
     }
 }