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 <medgar123@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Mark Edgar 2020-05-30 19:05:46 +02:00 committed by Denys Vlasenko
parent 9b4a9d96b8
commit b2ab920716
2 changed files with 37 additions and 4 deletions

View File

@ -160,7 +160,7 @@ static void unexpand(FILE *file, unsigned tab_size, unsigned opt)
putchar('\t'); putchar('\t');
} }
if ((opt & OPT_INITIAL) && ptr != line) { if (!(opt & OPT_ALL) && ptr != line) {
printf("%*s%s", len, "", ptr); printf("%*s%s", len, "", ptr);
break; break;
} }
@ -207,13 +207,13 @@ int expand_main(int argc UNUSED_PARAM, char **argv)
"ft:a" "ft:a"
"\0" "\0"
"ta" /* -t NUM sets -a */, "ta" /* -t NUM sets -a */,
"first-only\0" No_argument "i" "first-only\0" No_argument "f"
"tabs\0" Required_argument "t" "tabs\0" Required_argument "t"
"all\0" No_argument "a" "all\0" No_argument "a"
, &opt_t , &opt_t
); );
/* -f --first-only is the default */ /* -t implies -a, but an explicit -f overrides */
if (!(opt & OPT_ALL)) opt |= OPT_INITIAL; if (opt & OPT_INITIAL) opt &= ~OPT_ALL;
} }
tab_size = xatou_range(opt_t, 1, UINT_MAX); tab_size = xatou_range(opt_t, 1, UINT_MAX);

View File

@ -31,6 +31,39 @@ testing "unexpand case 7" "unexpand" \
testing "unexpand case 8" "unexpand" \ testing "unexpand case 8" "unexpand" \
"a b\n" "" "a b\n" \ "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_SUPPORT" = x"y" \
&& test x"$CONFIG_UNICODE_USING_LOCALE" != x"y" \ && test x"$CONFIG_UNICODE_USING_LOCALE" != x"y" \
&& testing "unexpand with unicode characher 0x394" "unexpand" \ && testing "unexpand with unicode characher 0x394" "unexpand" \