summaryrefslogtreecommitdiff
path: root/src/head.c
diff options
context:
space:
mode:
authorАлексей Шилин <rootlexx@mail.ru>2014-01-29 01:23:46 +0000
committerPádraig Brady <P@draigBrady.com>2014-02-09 20:22:33 +0000
commit476ce37019df5b1cb917c5b50e71f9bce5911401 (patch)
tree7e207caa284a827d176567e521222ddda21098d6 /src/head.c
parent17d92a9106c6d07cc985e6e14f5501dec3db57f2 (diff)
downloadcoreutils-476ce37019df5b1cb917c5b50e71f9bce5911401.tar.xz
head: fix --lines=-0 outputting nothing if no newline at EOF
* src/head.c (elide_tail_lines_pipe): Just output all input in this case to avoid the issue and also avoid redundant '\n' processing. (elide_tail_lines_seekable): Likewise. * tests/misc/head-elide-tail.pl: Add tests for no '\n' at EOF. * NEWS: Mention the fix. Fixes http://bugs.gnu.org/16329
Diffstat (limited to 'src/head.c')
-rw-r--r--src/head.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/head.c b/src/head.c
index ddaa9906b..ef368d7cc 100644
--- a/src/head.c
+++ b/src/head.c
@@ -501,6 +501,13 @@ elide_tail_lines_pipe (const char *filename, int fd, uintmax_t n_elide)
n_read = safe_read (fd, tmp->buffer, BUFSIZ);
if (n_read == 0 || n_read == SAFE_READ_ERROR)
break;
+
+ if (! n_elide)
+ {
+ fwrite (tmp->buffer, 1, n_read, stdout);
+ continue;
+ }
+
tmp->nbytes = n_read;
tmp->nlines = 0;
tmp->next = NULL;
@@ -636,8 +643,11 @@ elide_tail_lines_seekable (const char *pretty_filename, int fd,
return false;
}
+ /* n_lines == 0 case needs special treatment. */
+ const bool all_lines = !n_lines;
+
/* Count the incomplete line on files that don't end with a newline. */
- if (bytes_read && buffer[bytes_read - 1] != '\n')
+ if (n_lines && bytes_read && buffer[bytes_read - 1] != '\n')
--n_lines;
while (1)
@@ -647,11 +657,16 @@ elide_tail_lines_seekable (const char *pretty_filename, int fd,
size_t n = bytes_read;
while (n)
{
- char const *nl;
- nl = memrchr (buffer, '\n', n);
- if (nl == NULL)
- break;
- n = nl - buffer;
+ if (all_lines)
+ n -= 1;
+ else
+ {
+ char const *nl;
+ nl = memrchr (buffer, '\n', n);
+ if (nl == NULL)
+ break;
+ n = nl - buffer;
+ }
if (n_lines-- == 0)
{
/* Found it. */