This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] fix for diagnostic/84034


Hi,

as PR diagnostic/84034 shows, source files with
dos style line endings can cause a glitch in the
terminal emulation that erases the source line that
is supposed to be shown.

That happens when the colorizing escape sequences are
printed between the CR and the LF.  Apparently the LF is
being ignored and thus the following line overwrites
everything from the last source line.


The following patch fixes the visual glitch by handling
a CR '\r' like a TAB '\t' character.


Bootstrapped and reg-rested in x86_64-pc-linux-gnu.
OK for trunk?


Thanks
Bernd.
2018-01-25  Bernd Edlinger  <bernd.edlinger@hotmail.de>

	PR diagnostic/84034
	* diagnostic-show-locus.c (get_line_width_without_trailing_whitespace):
	Handle CR like TAB.
	(layout::print_source_line): Likewise.
	(test_get_line_width_without_trailing_whitespace): Add test cases.

Index: gcc/diagnostic-show-locus.c
===================================================================
--- gcc/diagnostic-show-locus.c	(revision 257048)
+++ gcc/diagnostic-show-locus.c	(working copy)
@@ -639,7 +639,7 @@ get_line_width_without_trailing_whitespace (const
   while (result > 0)
     {
       char ch = line[result - 1];
-      if (ch == ' ' || ch == '\t')
+      if (ch == ' ' || ch == '\t' || ch == '\r')
 	result--;
       else
 	break;
@@ -648,7 +648,8 @@ get_line_width_without_trailing_whitespace (const
   gcc_assert (result <= line_width);
   gcc_assert (result == 0 ||
 	      (line[result - 1] != ' '
-	       && line[result -1] != '\t'));
+	       && line[result -1] != '\t'
+	       && line[result -1] != '\r'));
   return result;
 }
 
@@ -673,9 +674,11 @@ test_get_line_width_without_trailing_whitespace ()
   assert_eq ("", 0);
   assert_eq (" ", 0);
   assert_eq ("\t", 0);
+  assert_eq ("\r", 0);
   assert_eq ("hello world", 11);
   assert_eq ("hello world     ", 11);
   assert_eq ("hello world     \t\t  ", 11);
+  assert_eq ("hello world\r", 11);
 }
 
 #endif /* #if CHECKING_P */
@@ -1176,8 +1179,8 @@ layout::print_source_line (int row, const char *li
 	  else
 	    m_colorizer.set_normal_text ();
 	}
-      char c = *line == '\t' ? ' ' : *line;
-      if (c == '\0')
+      char c = *line;
+      if (c == '\0' || c == '\t' || c == '\r')
 	c = ' ';
       if (c != ' ')
 	{

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]