diff --git a/usr.bin/diff/diffreg.c b/usr.bin/diff/diffreg.c --- a/usr.bin/diff/diffreg.c +++ b/usr.bin/diff/diffreg.c @@ -1247,7 +1247,8 @@ printf(" "); } col = 0; - for (j = 0, lastc = '\0'; j < nc; j++, lastc = c) { + for (j = 0, lastc = '\0'; j < nc && (hw == 0 || col < hw); + j++, lastc = c) { c = getc(lb); if (flags & D_STRIPCR && c == '\r') { if ((c = getc(lb)) == '\n') @@ -1274,19 +1275,16 @@ if (flags & D_EXPANDTABS) { newcol = ((col / tabsize) + 1) * tabsize; do { - if (diff_format == D_SIDEBYSIDE) - j++; printf(" "); - } while (++col < newcol && j < nc); + } while (++col < newcol && col < hw); } else { if (diff_format == D_SIDEBYSIDE) { - if ((j + tabsize) > nc) { - printf("%*s", nc - j, ""); - j = col = nc; + if ((col + tabsize) > hw) { + printf("%*s", hw - col, ""); + col = hw; } else { printf("\t"); col += tabsize - 1; - j += tabsize - 1; } } else { printf("\t"); diff --git a/usr.bin/diff/tests/Makefile b/usr.bin/diff/tests/Makefile --- a/usr.bin/diff/tests/Makefile +++ b/usr.bin/diff/tests/Makefile @@ -12,6 +12,8 @@ input2.in \ input_c1.in \ input_c2.in \ + side_by_side_tabbed_a.in \ + side_by_side_tabbed_b.in \ simple.out \ simple_e.out \ simple_n.out \ diff --git a/usr.bin/diff/tests/diff_test.sh b/usr.bin/diff/tests/diff_test.sh --- a/usr.bin/diff/tests/diff_test.sh +++ b/usr.bin/diff/tests/diff_test.sh @@ -7,6 +7,7 @@ atf_test_case ifdef atf_test_case group_format atf_test_case side_by_side +atf_test_case side_by_side_tabbed atf_test_case brief_format atf_test_case b230049 atf_test_case stripcr_o @@ -145,6 +146,23 @@ diff -W 65 -y --suppress-common-lines A B } +side_by_side_tabbed_body() +{ + file_a=$(atf_get_srcdir)/side_by_side_tabbed_a.in + file_b=$(atf_get_srcdir)/side_by_side_tabbed_b.in + + atf_check -o save:diffout -s not-exit:0 \ + diff -y ${file_a} ${file_b} + atf_check -o save:diffout_expanded -s not-exit:0 \ + diff -yt ${file_a} ${file_b} + + atf_check -o not-empty grep -Ee 'file A.+file B' diffout + atf_check -o not-empty grep -Ee 'file A.+file B' diffout_expanded + + atf_check -o not-empty grep -Ee 'tabs.+tabs' diffout + atf_check -o not-empty grep -Ee 'tabs.+tabs' diffout_expanded +} + brief_format_body() { atf_check mkdir A B @@ -343,6 +361,7 @@ atf_add_test_case ifdef atf_add_test_case group_format atf_add_test_case side_by_side + atf_add_test_case side_by_side_tabbed atf_add_test_case brief_format atf_add_test_case b230049 atf_add_test_case stripcr_o diff --git a/usr.bin/diff/tests/side_by_side_tabbed_a.in b/usr.bin/diff/tests/side_by_side_tabbed_a.in new file mode 100644 --- /dev/null +++ b/usr.bin/diff/tests/side_by_side_tabbed_a.in @@ -0,0 +1,4 @@ +This + is my test file A + it has tabs +Thanks diff --git a/usr.bin/diff/tests/side_by_side_tabbed_b.in b/usr.bin/diff/tests/side_by_side_tabbed_b.in new file mode 100644 --- /dev/null +++ b/usr.bin/diff/tests/side_by_side_tabbed_b.in @@ -0,0 +1,4 @@ +This + is my test file B + it has tabs +Thanks