This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] fix for diagnostic/84034
- From: Bernd Edlinger <bernd dot edlinger at hotmail dot de>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Cc: David Malcolm <dmalcolm at redhat dot com>
- Date: Thu, 25 Jan 2018 18:53:27 +0000
- Subject: [PATCH] fix for diagnostic/84034
- Authentication-results: sourceware.org; auth=none
- Spamdiagnosticmetadata: NSPM
- Spamdiagnosticoutput: 1:99
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 != ' ')
{