From b2ab920716f640cbaaf486512ba177f4e0b597c5 Mon Sep 17 00:00:00 2001 From: Mark Edgar Date: Sat, 30 May 2020 19:05:46 +0200 Subject: [PATCH] unexpand: correct behavior for --first-only --tabs=4 Prior to the patch, both -f and --first-only are in all cases either no-op or ignored. Without --tabs, --first-only is the default so specifying it is a no-op. With --tabs, --all is implied, and --first-only is intended to reset this. function old new delta expand_main 690 694 +4 Signed-off-by: Mark Edgar Signed-off-by: Denys Vlasenko --- coreutils/expand.c | 8 ++++---- testsuite/unexpand.tests | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/coreutils/expand.c b/coreutils/expand.c index 4fa974df8..5f5993921 100644 --- a/coreutils/expand.c +++ b/coreutils/expand.c @@ -160,7 +160,7 @@ static void unexpand(FILE *file, unsigned tab_size, unsigned opt) putchar('\t'); } - if ((opt & OPT_INITIAL) && ptr != line) { + if (!(opt & OPT_ALL) && ptr != line) { printf("%*s%s", len, "", ptr); break; } @@ -207,13 +207,13 @@ int expand_main(int argc UNUSED_PARAM, char **argv) "ft:a" "\0" "ta" /* -t NUM sets -a */, - "first-only\0" No_argument "i" + "first-only\0" No_argument "f" "tabs\0" Required_argument "t" "all\0" No_argument "a" , &opt_t ); - /* -f --first-only is the default */ - if (!(opt & OPT_ALL)) opt |= OPT_INITIAL; + /* -t implies -a, but an explicit -f overrides */ + if (opt & OPT_INITIAL) opt &= ~OPT_ALL; } tab_size = xatou_range(opt_t, 1, UINT_MAX); diff --git a/testsuite/unexpand.tests b/testsuite/unexpand.tests index 7b326dc2c..4ab693ec8 100755 --- a/testsuite/unexpand.tests +++ b/testsuite/unexpand.tests @@ -31,6 +31,39 @@ testing "unexpand case 7" "unexpand" \ testing "unexpand case 8" "unexpand" \ "a b\n" "" "a b\n" \ +testcase() +{ + testing "unexpand flags $*" "unexpand $*" \ + "$want" "" ' a b c' +} + +# tabs=8, Convert only leading sequences of blanks +want='\ta b c' +testcase +testcase -f +testcase -f -t8 +testcase -t8 -f +testcase -t8 --first-only + +# tabs=8, Convert all blanks +want='\ta\tb c' +testcase -a +testcase -t8 +testcase -a -t8 + +# tabs=4, Convert all blanks +want='\t\ta\t\tb\t c' +testcase -t4 +testcase -a -t4 +testcase -t4 -a + +# tabs=4, Convert only leading sequences of blanks +want='\t\ta b c' +testcase -t4 -f +testcase -f -t4 +testcase -t4 --first-only +testcase --first-only -t4 + test x"$CONFIG_UNICODE_SUPPORT" = x"y" \ && test x"$CONFIG_UNICODE_USING_LOCALE" != x"y" \ && testing "unexpand with unicode characher 0x394" "unexpand" \ -- 2.25.1