nl: ensure '-b n' option displays file content

The command 'nl -b n' should output no line numbers, just some
spaces as a placeholder followed by the actual file content.

Add tests for line numbering by cat and nl.  The correct results
were obtained from coreutils.

function                                             old     new   delta
print_numbered_lines                                 152     157      +5
.rodata                                           182456  182453      -3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 5/-3)                Total: 2 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Ron Yorston 2021-01-21 08:40:54 +00:00 committed by Denys Vlasenko
parent 27ae859c50
commit c849e72c0b
5 changed files with 67 additions and 3 deletions

View File

@ -201,7 +201,7 @@ int cat_main(int argc UNUSED_PARAM, char **argv)
ns.start = 1; ns.start = 1;
ns.inc = 1; ns.inc = 1;
ns.sep = "\t"; ns.sep = "\t";
ns.empty_str = "\n"; ns.empty_str = NULL;
ns.all = !(opts & CAT_OPT_b); /* -n without -b */ ns.all = !(opts & CAT_OPT_b); /* -n without -b */
ns.nonempty = (opts & CAT_OPT_b); /* -b (with or without -n) */ ns.nonempty = (opts & CAT_OPT_b); /* -b (with or without -n) */
exitcode = EXIT_SUCCESS; exitcode = EXIT_SUCCESS;

View File

@ -68,7 +68,7 @@ int nl_main(int argc UNUSED_PARAM, char **argv)
&ns.width, &ns.sep, &ns.start, &ns.inc, &opt_b); &ns.width, &ns.sep, &ns.start, &ns.inc, &opt_b);
ns.all = (opt_b[0] == 'a'); ns.all = (opt_b[0] == 'a');
ns.nonempty = (opt_b[0] == 't'); ns.nonempty = (opt_b[0] == 't');
ns.empty_str = xasprintf("%*s\n", ns.width + (int)strlen(ns.sep), ""); ns.empty_str = xasprintf("%*s", ns.width + (int)strlen(ns.sep), "");
argv += optind; argv += optind;
if (!*argv) if (!*argv)

View File

@ -22,10 +22,11 @@ int FAST_FUNC print_numbered_lines(struct number_state *ns, const char *filename
if (ns->all if (ns->all
|| (ns->nonempty && line[0]) || (ns->nonempty && line[0])
) { ) {
printf("%*u%s%s\n", ns->width, N, ns->sep, line); printf("%*u%s", ns->width, N, ns->sep);
N += ns->inc; N += ns->inc;
} else if (ns->empty_str) } else if (ns->empty_str)
fputs(ns->empty_str, stdout); fputs(ns->empty_str, stdout);
puts(line);
free(line); free(line);
} }
ns->start = N; ns->start = N;

View File

@ -22,4 +22,28 @@ testing 'cat -v' \
'foo\n' 'foo\n'
SKIP= SKIP=
optional FEATURE_CATN
testing 'cat -n' \
'cat -n' \
"\
1 line 1
2
3 line 3
" \
'' \
'line 1\n\nline 3\n'
SKIP=
optional FEATURE_CATN
testing 'cat -b' \
'cat -b' \
"\
1 line 1
2 line 3
" \
'' \
'line 1\n\nline 3\n'
SKIP=
exit $FAILCOUNT exit $FAILCOUNT

39
testsuite/nl.tests Executable file
View File

@ -0,0 +1,39 @@
#!/bin/sh
# Copyright 2021 by Ron Yorston
# Licensed under GPLv2, see file LICENSE in this source tree.
. ./testing.sh
# testing "test name" "commands" "expected result" "file input" "stdin"
testing "nl numbers all lines" \
"nl -b a input" \
"\
1 line 1
2
3 line 3
" \
"line 1\n\nline 3\n" \
""
testing "nl numbers non-empty lines" \
"nl -b t input" \
"\
1 line 1
2 line 3
" \
"line 1\n\nline 3\n" \
""
testing "nl numbers no lines" \
"nl -b n input" \
"\
line 1
line 3
" \
"line 1\n\nline 3\n" \
""
exit $FAILCOUNT