#include "error.h"
#include "inttostr.h"
#include "posixver.h"
+#include "quote.h"
#include "safe-read.h"
#include "xnanosleep.h"
#include "xstrtol.h"
size_t n = MIN (n_remaining, BUFSIZ);
size_t bytes_read = safe_read (fd, buffer, n);
if (bytes_read == SAFE_READ_ERROR)
- error (EXIT_FAILURE, errno, "%s", pretty_filename);
+ error (EXIT_FAILURE, errno, _("error reading %s"),
+ quote (pretty_filename));
if (bytes_read == 0)
break;
xwrite (STDOUT_FILENO, buffer, bytes_read);
bytes_read = safe_read (fd, buffer, bytes_read);
if (bytes_read == SAFE_READ_ERROR)
{
- error (0, errno, "%s", pretty_filename);
+ error (0, errno, _("error reading %s"), quote (pretty_filename));
return 1;
}
bytes_read = safe_read (fd, buffer, BUFSIZ);
if (bytes_read == SAFE_READ_ERROR)
{
- error (0, errno, "%s", pretty_filename);
+ error (0, errno, _("error reading %s"), quote (pretty_filename));
return 1;
}
}
/* Print the last N_LINES lines from the end of the standard input,
open for reading as pipe FD.
Buffer the text as a linked list of LBUFFERs, adding them as needed.
- Return 0 if successful, 1 if an error occured. */
+ Return 0 if successful, 1 upon error. */
static int
-pipe_lines (const char *pretty_filename, int fd, size_t n_lines)
+pipe_lines (const char *pretty_filename, int fd, uintmax_t n_lines)
{
struct linebuffer
{
tmp->next = NULL;
/* Count the number of newlines just read. */
- for (i = 0; i < tmp->nbytes; i++)
- if (tmp->buffer[i] == '\n')
- ++tmp->nlines;
+ {
+ char const *buffer_end = tmp->buffer + n_read;
+ char const *p = tmp->buffer;
+ while ((p = memchr (p, '\n', buffer_end - p)))
+ {
+ ++p;
+ ++tmp->nlines;
+ }
+ }
total_lines += tmp->nlines;
/* If there is enough room in the last buffer read, just append the new
if (n_read == SAFE_READ_ERROR)
{
- error (0, errno, "%s", pretty_filename);
+ error (0, errno, _("error reading %s"), quote (pretty_filename));
errors = 1;
goto free_lbuffers;
}
if (n_read == SAFE_READ_ERROR)
{
- error (0, errno, "%s", pretty_filename);
+ error (0, errno, _("error reading %s"), quote (pretty_filename));
errors = 1;
goto free_cbuffers;
}
return -1;
if (bytes_read == SAFE_READ_ERROR)
{
- error (0, errno, "%s", pretty_filename);
+ error (0, errno, _("error reading %s"), quote (pretty_filename));
return 1;
}
if (bytes_read <= n_bytes)
return -1;
if (bytes_read == SAFE_READ_ERROR) /* error */
{
- error (0, errno, "%s", pretty_filename);
+ error (0, errno, _("error reading %s"), quote (pretty_filename));
return 1;
}
if (fstat (fd, &stats))
{
- error (0, errno, "%s", pretty_filename);
+ error (0, errno, _("cannot fstat %s"), quote (pretty_filename));
return 1;
}
if (fstat (fd, &stats))
{
- error (0, errno, "%s", pretty_filename);
+ error (0, errno, _("cannot fstat %s"), quote (pretty_filename));
return 1;
}
f->ino = 0;
f->dev = 0;
}
- error (0, errno, "%s", pretty_name (f));
+ error (0, errno, _("cannot open %s for reading"),
+ quote (pretty_name (f)));
errors = 1;
}
else
{
errors = 1;
f->errnum = errno;
- error (0, errno, "%s", pretty_name (f));
+ error (0, errno, _("error reading %s"), quote (pretty_name (f)));
}
else if (!IS_TAILABLE_FILE_TYPE (stats.st_mode))
{
{
if (!is_stdin && close (fd))
{
- error (0, errno, "%s", pretty_name (f));
+ error (0, errno, _("error reading %s"), quote (pretty_name (f)));
errors = 1;
}
}