--- fhandler_console.cc	Tue Oct 17 11:31:17 2000
+++ fhandler_console.cc.mine	Tue Oct 17 10:49:13 2000
@@ -370,7 +370,7 @@
   set_r_no_interrupt (1);	// Handled explicitly in read code
 
   h = CreateFileA ("CONOUT$", GENERIC_READ|GENERIC_WRITE,
-		   FILE_SHARE_WRITE | FILE_SHARE_WRITE, &sec_none,
+		   FILE_SHARE_READ | FILE_SHARE_WRITE, &sec_none,
 		   OPEN_EXISTING, 0, 0);
 
   if (h == INVALID_HANDLE_VALUE)
@@ -630,6 +630,7 @@
 {
   set_cb (sizeof *this);
   state_ = normal;
+  altfont_ = 0;
   set_need_fork_fixup ();
 }
 
@@ -775,13 +776,16 @@
 void
 fhandler_console::char_command (char c)
 {
-  // Keep the background intensity with the colr since there doesn't seem
-  // to be a way to set this with termcap/terminfo.
   static int fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
 				   FOREGROUND_RED),
 	     bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
-				   BACKGROUND_RED | BACKGROUND_INTENSITY),
-			 bold = default_color & FOREGROUND_INTENSITY;
+				   BACKGROUND_RED);
+
+  static bool bold = (default_color & FOREGROUND_INTENSITY) ? true : false;
+  static bool underline = (default_color & BACKGROUND_INTENSITY) ? true : false;
+  static bool reverse = false;
+  static bool invis = false;
+
   int x, y;
   char buf[40];
 
@@ -793,60 +797,46 @@
        for (i = 0; i <= nargs_; i++)
 	 switch (args_[i])
 	   {
-	     case 0:    /* normal color */
+	     case 0:    /* default rendition */
 	       fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
 				     FOREGROUND_RED);
 	       bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
-				     BACKGROUND_RED | BACKGROUND_INTENSITY);
-	       bold = default_color & FOREGROUND_INTENSITY;
+				     BACKGROUND_RED);
+	       underline = (default_color & BACKGROUND_INTENSITY) ? true : false;
+	       reverse = false;
+	       bold = (default_color & FOREGROUND_INTENSITY) ? true : false;
+	       invis = false;
+	       altfont_ = 0;
 	       break;
 	     case 1:    /* bold */
-	       fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
-				     FOREGROUND_RED);
-	       bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
-				     BACKGROUND_RED | BACKGROUND_INTENSITY);
-	       bold = FOREGROUND_INTENSITY;
+	       bold = true;
 	       break;
-	     case 4:    /* underline - simulate with cyan */
-	       fg = FOREGROUND_BLUE | FOREGROUND_GREEN;
-	       bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
-				     BACKGROUND_RED | BACKGROUND_INTENSITY);
-	       bold = default_color & FOREGROUND_INTENSITY;
-	       break;
-	     case 5:    /* blink mode */
-	       fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
-				     FOREGROUND_RED);
-	       bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
-				     BACKGROUND_RED | BACKGROUND_INTENSITY);
-	       bold = default_color & FOREGROUND_INTENSITY;
+	     case 4:    /* underline */
+	       underline = true;
 	       break;
 	     case 7:    /* reverse */
-	       fg = (default_color & BACKGROUND_BLUE) ? FOREGROUND_BLUE : 0;
-	       fg |= (default_color & BACKGROUND_GREEN) ? FOREGROUND_GREEN : 0;
-	       fg |= (default_color & BACKGROUND_RED) ? FOREGROUND_RED : 0;
-	       fg |= (default_color & BACKGROUND_INTENSITY) ?
-					     FOREGROUND_INTENSITY : 0;
-	       bg = (default_color & FOREGROUND_BLUE) ? BACKGROUND_BLUE : 0;
-	       bg |= (default_color & FOREGROUND_GREEN) ? BACKGROUND_GREEN : 0;
-	       bg |= (default_color & FOREGROUND_RED) ? BACKGROUND_RED : 0;
-	       bg |= (default_color & FOREGROUND_INTENSITY) ?
-					     BACKGROUND_INTENSITY : 0;
+	       reverse = true;
 	       break;
 	     case 8:    /* invisible */
-	       fg = (default_color & BACKGROUND_BLUE) ? FOREGROUND_BLUE : 0;
-	       fg |= (default_color & BACKGROUND_GREEN) ? FOREGROUND_GREEN : 0;
-	       fg |= (default_color & BACKGROUND_RED) ? FOREGROUND_RED : 0;
-	       bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
-				     BACKGROUND_RED | BACKGROUND_INTENSITY);
-	       bold = (default_color & BACKGROUND_INTENSITY) ?
-						   FOREGROUND_INTENSITY : 0;
+	       invis = true;
 	       break;
-	     case 9:    /* dim */
-	       fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
-				     FOREGROUND_RED);
-	       bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
-				     BACKGROUND_RED | BACKGROUND_INTENSITY);
-	       bold = (fg == 0) ? FOREGROUND_INTENSITY : 0;
+	     case 10:   /* primary (default) font */
+	       altfont_ = 0;
+	       break;
+	     case 11:   /* first alternative font */
+	       altfont_ = 1;
+	       break;
+	     case 22:   /* non-bold */
+	       bold = false;
+	       break;
+	     case 24:   /* non-underline */
+	       underline = false;
+	       break;
+	     case 27:   /* non-reverse */
+	       reverse = false;
+	       break;
+	     case 28:   /* non-invisible */
+	       invis = false;
 	       break;
 	     case 30:		/* BLACK foreground */
 	       fg = 0;
@@ -872,6 +862,10 @@
 	     case 37:		/* WHITE foreg */
 	       fg = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
 	       break;
+	     case 39:		/* Default foreg */
+	       fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
+				     FOREGROUND_RED);
+	       break;
 	     case 40:		/* BLACK background */
 	       bg = 0;
 	       break;
@@ -896,15 +890,39 @@
 	     case 47:    /* WHITE background */
 	       bg = BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED;
 	       break;
-	     default:
-	       fg = default_color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
-				     FOREGROUND_RED);
+	     case 49:    /* Default background */
 	       bg = default_color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
-				     BACKGROUND_RED | BACKGROUND_INTENSITY);
-	       bold = default_color & FOREGROUND_INTENSITY;
+				     BACKGROUND_RED);
+	       break;
+	     default:
 	       break;
 	   }
-	 SetConsoleTextAttribute (get_output_handle (), fg | bg | bold);
+
+      {
+	WORD fg2 = fg;
+	WORD bg2 = bg;
+
+	if (reverse) {
+	  fg2 = ((bg & BACKGROUND_RED) ? FOREGROUND_RED : 0) |
+		((bg & BACKGROUND_GREEN) ? FOREGROUND_GREEN : 0) |
+		((bg & BACKGROUND_BLUE) ? FOREGROUND_BLUE : 0);
+	  bg2 = ((fg & FOREGROUND_RED) ? BACKGROUND_RED : 0) |
+		((fg & FOREGROUND_GREEN) ? BACKGROUND_GREEN : 0) |
+		((fg & FOREGROUND_BLUE) ? BACKGROUND_BLUE : 0);
+	}
+
+	if (bold) fg2 |= FOREGROUND_INTENSITY;
+	if (underline) bg2 |= BACKGROUND_INTENSITY;
+	if (invis) {
+	  fg2 = ((bg2 & BACKGROUND_RED) ? FOREGROUND_RED : 0) |
+		((bg2 & BACKGROUND_GREEN) ? FOREGROUND_GREEN : 0) |
+		((bg2 & BACKGROUND_BLUE) ? FOREGROUND_BLUE : 0) |
+		((bg2 & BACKGROUND_INTENSITY) ? FOREGROUND_INTENSITY : 0);
+	}
+
+	SetConsoleTextAttribute (get_output_handle (), fg2 | bg2);
+      }
+
       break;
     case 'h':
     case 'l':
@@ -1079,7 +1097,10 @@
       size_t len = found - src;
       do {
 	size_t l2 = min (sizeof (buf), len);
-	CharToOemBuff ((LPCSTR)src, buf, l2);
+	if (altfont_ == 0)
+	  CharToOemBuff ((LPCSTR)src, buf, l2);
+	else
+	  strncpy(buf, (const char *)src, l2);
 	if (! WriteFile (get_output_handle (), buf, l2, &done, 0))
 	{
 	  debug_printf ("write failed, handle %p", get_output_handle ());
