aboutsummaryrefslogtreecommitdiff
path: root/gcc/input.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/input.c')
-rw-r--r--gcc/input.c72
1 files changed, 46 insertions, 26 deletions
diff --git a/gcc/input.c b/gcc/input.c
index dd1d23d..d573b90 100644
--- a/gcc/input.c
+++ b/gcc/input.c
@@ -913,7 +913,7 @@ make_location (location_t caret, source_range src_range)
source line in order to calculate the display width. If that cannot be done
for any reason, then returns the byte column as a fallback. */
int
-location_compute_display_column (expanded_location exploc)
+location_compute_display_column (expanded_location exploc, int tabstop)
{
if (!(exploc.file && *exploc.file && exploc.line && exploc.column))
return exploc.column;
@@ -921,7 +921,7 @@ location_compute_display_column (expanded_location exploc)
/* If line is NULL, this function returns exploc.column which is the
desired fallback. */
return cpp_byte_column_to_display_column (line.get_buffer (), line.length (),
- exploc.column);
+ exploc.column, tabstop);
}
/* Dump statistics to stderr about the memory usage of the line_table
@@ -3608,33 +3608,46 @@ test_line_offset_overflow ()
void test_cpp_utf8 ()
{
+ const int def_tabstop = 8;
/* Verify that wcwidth of invalid UTF-8 or control bytes is 1. */
{
- int w_bad = cpp_display_width ("\xf0!\x9f!\x98!\x82!", 8);
+ int w_bad = cpp_display_width ("\xf0!\x9f!\x98!\x82!", 8, def_tabstop);
ASSERT_EQ (8, w_bad);
- int w_ctrl = cpp_display_width ("\r\t\n\v\0\1", 6);
- ASSERT_EQ (6, w_ctrl);
+ int w_ctrl = cpp_display_width ("\r\n\v\0\1", 5, def_tabstop);
+ ASSERT_EQ (5, w_ctrl);
}
/* Verify that wcwidth of valid UTF-8 is as expected. */
{
- const int w_pi = cpp_display_width ("\xcf\x80", 2);
+ const int w_pi = cpp_display_width ("\xcf\x80", 2, def_tabstop);
ASSERT_EQ (1, w_pi);
- const int w_emoji = cpp_display_width ("\xf0\x9f\x98\x82", 4);
+ const int w_emoji = cpp_display_width ("\xf0\x9f\x98\x82", 4, def_tabstop);
ASSERT_EQ (2, w_emoji);
- const int w_umlaut_precomposed = cpp_display_width ("\xc3\xbf", 2);
+ const int w_umlaut_precomposed = cpp_display_width ("\xc3\xbf", 2,
+ def_tabstop);
ASSERT_EQ (1, w_umlaut_precomposed);
- const int w_umlaut_combining = cpp_display_width ("y\xcc\x88", 3);
+ const int w_umlaut_combining = cpp_display_width ("y\xcc\x88", 3,
+ def_tabstop);
ASSERT_EQ (1, w_umlaut_combining);
- const int w_han = cpp_display_width ("\xe4\xb8\xba", 3);
+ const int w_han = cpp_display_width ("\xe4\xb8\xba", 3, def_tabstop);
ASSERT_EQ (2, w_han);
- const int w_ascii = cpp_display_width ("GCC", 3);
+ const int w_ascii = cpp_display_width ("GCC", 3, def_tabstop);
ASSERT_EQ (3, w_ascii);
const int w_mixed = cpp_display_width ("\xcf\x80 = 3.14 \xf0\x9f\x98\x82"
- "\x9f! \xe4\xb8\xba y\xcc\x88", 24);
+ "\x9f! \xe4\xb8\xba y\xcc\x88",
+ 24, def_tabstop);
ASSERT_EQ (18, w_mixed);
}
+ /* Verify that display width properly expands tabs. */
+ {
+ const char *tstr = "\tabc\td";
+ ASSERT_EQ (6, cpp_display_width (tstr, 6, 1));
+ ASSERT_EQ (10, cpp_display_width (tstr, 6, 3));
+ ASSERT_EQ (17, cpp_display_width (tstr, 6, 8));
+ ASSERT_EQ (1, cpp_display_column_to_byte_column (tstr, 6, 7, 8));
+ }
+
/* Verify that cpp_byte_column_to_display_column can go past the end,
and similar edge cases. */
{
@@ -3645,10 +3658,13 @@ void test_cpp_utf8 ()
/* 111122223456
Byte columns. */
- ASSERT_EQ (5, cpp_display_width (str, 6));
- ASSERT_EQ (105, cpp_byte_column_to_display_column (str, 6, 106));
- ASSERT_EQ (10000, cpp_byte_column_to_display_column (NULL, 0, 10000));
- ASSERT_EQ (0, cpp_byte_column_to_display_column (NULL, 10000, 0));
+ ASSERT_EQ (5, cpp_display_width (str, 6, def_tabstop));
+ ASSERT_EQ (105,
+ cpp_byte_column_to_display_column (str, 6, 106, def_tabstop));
+ ASSERT_EQ (10000,
+ cpp_byte_column_to_display_column (NULL, 0, 10000, def_tabstop));
+ ASSERT_EQ (0,
+ cpp_byte_column_to_display_column (NULL, 10000, 0, def_tabstop));
}
/* Verify that cpp_display_column_to_byte_column can go past the end,
@@ -3662,21 +3678,25 @@ void test_cpp_utf8 ()
/* 000000000000000000000000000000000111111
111122223333444456666777788889999012345
Byte columns. */
- ASSERT_EQ (4, cpp_display_column_to_byte_column (str, 15, 2));
- ASSERT_EQ (15, cpp_display_column_to_byte_column (str, 15, 11));
- ASSERT_EQ (115, cpp_display_column_to_byte_column (str, 15, 111));
- ASSERT_EQ (10000, cpp_display_column_to_byte_column (NULL, 0, 10000));
- ASSERT_EQ (0, cpp_display_column_to_byte_column (NULL, 10000, 0));
+ ASSERT_EQ (4, cpp_display_column_to_byte_column (str, 15, 2, def_tabstop));
+ ASSERT_EQ (15,
+ cpp_display_column_to_byte_column (str, 15, 11, def_tabstop));
+ ASSERT_EQ (115,
+ cpp_display_column_to_byte_column (str, 15, 111, def_tabstop));
+ ASSERT_EQ (10000,
+ cpp_display_column_to_byte_column (NULL, 0, 10000, def_tabstop));
+ ASSERT_EQ (0,
+ cpp_display_column_to_byte_column (NULL, 10000, 0, def_tabstop));
/* Verify that we do not interrupt a UTF-8 sequence. */
- ASSERT_EQ (4, cpp_display_column_to_byte_column (str, 15, 1));
+ ASSERT_EQ (4, cpp_display_column_to_byte_column (str, 15, 1, def_tabstop));
for (int byte_col = 1; byte_col <= 15; ++byte_col)
{
- const int disp_col = cpp_byte_column_to_display_column (str, 15,
- byte_col);
- const int byte_col2 = cpp_display_column_to_byte_column (str, 15,
- disp_col);
+ const int disp_col
+ = cpp_byte_column_to_display_column (str, 15, byte_col, def_tabstop);
+ const int byte_col2
+ = cpp_display_column_to_byte_column (str, 15, disp_col, def_tabstop);
/* If we ask for the display column in the middle of a UTF-8
sequence, it will return the length of the partial sequence,