*endp-- = '0';
}
while (endp >= line_num_start);
+
if (line_num_start > line_buf)
*--line_num_start = '1';
else
line_num_print--;
}
-/* Plain cat. Copies the file behind 'input_desc' to STDOUT_FILENO.
+/* Plain cat. Copy the file behind 'input_desc' to STDOUT_FILENO.
+ BUF (of size BUFSIZE) is the I/O buffer, used by reads and writes.
Return true if successful. */
static bool
-simple_cat (
- /* Pointer to the buffer, used by reads and writes. */
- char *buf,
-
- /* Number of characters preferably read or written by each read and write
- call. */
- size_t bufsize)
+simple_cat (char *buf, size_t bufsize)
{
- /* Actual number of characters read, and therefore written. */
- size_t n_read;
-
/* Loop until the end of the file. */
while (true)
{
/* Read a block of input. */
- n_read = safe_read (input_desc, buf, bufsize);
+ size_t n_read = safe_read (input_desc, buf, bufsize);
if (n_read == SAFE_READ_ERROR)
{
error (0, errno, "%s", quotef (infile));
/* Write this block out. */
- {
- /* The following is ok, since we know that 0 < n_read. */
- size_t n = n_read;
- if (full_write (STDOUT_FILENO, buf, n) != n)
- die (EXIT_FAILURE, errno, _("write error"));
- }
+ if (full_write (STDOUT_FILENO, buf, n_read) != n_read)
+ die (EXIT_FAILURE, errno, _("write error"));
}
}
}
}
-/* Cat the file behind INPUT_DESC to the file behind OUTPUT_DESC.
+/* Copy the file behind 'input_desc' to STDOUT_FILENO.
+ Use INBUF and read INSIZE with each call,
+ and OUTBUF and write OUTSIZE with each call.
+ (The buffers are a bit larger than the I/O sizes.)
+ The remaining boolean args say what 'cat' options to use.
+
Return true if successful.
Called if any option more than -u was specified.
an explicit test for buffer end unnecessary. */
static bool
-cat (
- /* Pointer to the beginning of the input buffer. */
- char *inbuf,
-
- /* Number of characters read in each read call. */
- size_t insize,
-
- /* Pointer to the beginning of the output buffer. */
- char *outbuf,
-
- /* Number of characters written by each write call. */
- size_t outsize,
-
- /* Variables that have values according to the specified options. */
- bool show_nonprinting,
- bool show_tabs,
- bool number,
- bool number_nonblank,
- bool show_ends,
- bool squeeze_blank)
+cat (char *inbuf, size_t insize, char *outbuf, size_t outsize,
+ bool show_nonprinting, bool show_tabs, bool number, bool number_nonblank,
+ bool show_ends, bool squeeze_blank)
{
/* Last character read from the input buffer. */
unsigned char ch;
- /* Pointer to the next character in the input buffer. */
- char *bpin;
-
- /* Pointer to the first non-valid byte in the input buffer, i.e., the
- current end of the buffer. */
- char *eob;
-
- /* Pointer to the position where the next character shall be written. */
- char *bpout;
-
- /* Number of characters read by the last read call. */
- size_t n_read;
-
/* Determines how many consecutive newlines there have been in the
input. 0 newlines makes NEWLINES -1, 1 newline makes NEWLINES 1,
etc. Initially 0 to indicate that we are at the beginning of a
/* The inbuf pointers are initialized so that BPIN > EOB, and thereby input
is read immediately. */
- eob = inbuf;
- bpin = eob + 1;
+ /* Pointer to the first non-valid byte in the input buffer, i.e., the
+ current end of the buffer. */
+ char *eob = inbuf;
- bpout = outbuf;
+ /* Pointer to the next character in the input buffer. */
+ char *bpin = eob + 1;
+
+ /* Pointer to the position where the next character shall be written. */
+ char *bpout = outbuf;
while (true)
{
/* Read more input into INBUF. */
- n_read = safe_read (input_desc, inbuf, insize);
+ size_t n_read = safe_read (input_desc, inbuf, insize);
if (n_read == SAFE_READ_ERROR)
{
error (0, errno, "%s", quotef (infile));
int
main (int argc, char **argv)
{
- /* Optimal size of i/o operations of output. */
- size_t outsize;
-
- /* Optimal size of i/o operations of input. */
- size_t insize;
-
- size_t page_size = getpagesize ();
-
- /* Pointer to the input buffer. */
- char *inbuf;
-
- /* Pointer to the output buffer. */
- char *outbuf;
-
- bool ok = true;
- int c;
-
- /* Index in argv to processed argument. */
- int argind;
-
- /* Device number of the output (file or whatever). */
- dev_t out_dev;
-
- /* I-node number of the output. */
- ino_t out_ino;
-
- /* True if the output is a regular file. */
- bool out_isreg;
-
/* Nonzero if we have ever read standard input. */
bool have_read_stdin = false;
/* Parse command line options. */
+ int c;
while ((c = getopt_long (argc, argv, "benstuvAET", long_options, NULL))
!= -1)
{
if (fstat (STDOUT_FILENO, &stat_buf) < 0)
die (EXIT_FAILURE, errno, _("standard output"));
- outsize = io_blksize (stat_buf);
- out_dev = stat_buf.st_dev;
- out_ino = stat_buf.st_ino;
- out_isreg = S_ISREG (stat_buf.st_mode) != 0;
+ /* Optimal size of i/o operations of output. */
+ size_t outsize = io_blksize (stat_buf);
+
+ /* Device and I-node number of the output. */
+ dev_t out_dev = stat_buf.st_dev;
+ ino_t out_ino = stat_buf.st_ino;
+
+ /* True if the output is a regular file. */
+ bool out_isreg = S_ISREG (stat_buf.st_mode) != 0;
if (! (number || show_ends || squeeze_blank))
{
xset_binary_mode (STDOUT_FILENO, O_BINARY);
}
- /* Check if any of the input files are the same as the output file. */
-
/* Main loop. */
infile = "-";
- argind = optind;
+ int argind = optind;
+ bool ok = true;
+ size_t page_size = getpagesize ();
do
{
if (argind < argc)
infile = argv[argind];
- if (STREQ (infile, "-"))
+ bool reading_stdin = STREQ (infile, "-");
+ if (reading_stdin)
{
have_read_stdin = true;
input_desc = STDIN_FILENO;
ok = false;
goto contin;
}
- insize = io_blksize (stat_buf);
+
+ /* Optimal size of i/o operations of input. */
+ size_t insize = io_blksize (stat_buf);
fdadvise (input_desc, 0, 0, FADVISE_SEQUENTIAL);
goto contin;
}
+ /* Pointer to the input buffer. */
+ char *inbuf;
+
/* Select which version of 'cat' to use. If any format-oriented
options were given use 'cat'; otherwise use 'simple_cat'. */
on some paging implementations, so add PAGE_SIZE - 1 bytes to the
request to make room for the alignment. */
- outbuf = xmalloc (outsize - 1 + insize * 4 + LINE_COUNTER_BUF_LEN
- + page_size - 1);
+ char *outbuf = xmalloc (outsize - 1 + insize * 4
+ + LINE_COUNTER_BUF_LEN + page_size - 1);
ok &= cat (ptr_align (inbuf, page_size), insize,
ptr_align (outbuf, page_size), outsize, show_nonprinting,
free (inbuf);
contin:
- if (!STREQ (infile, "-") && close (input_desc) < 0)
+ if (!reading_stdin && close (input_desc) < 0)
{
error (0, errno, "%s", quotef (infile));
ok = false;