[sourcecode language=”cpp”]
/* cat – concatenates files Author: Andy Tanenbaum */
[/sourcecode]
[sourcecode language=”cpp”]
extern int errno; /*DEBUG*/
#include "blocksize.h"
#include "stat.h"
#define BUF_SIZE 512
int unbuffered;
char buffer[BUF_SIZE];
char *next = buffer;
main(argc, argv)
int argc;
char *argv[];
{
int i, k, m, fd1;
char *p;
struct stat sbuf;
k = 1;
/* Check for the -u flag — unbuffered operation. */
p = argv[1];
if (argc >=2 && *p == ‘-‘ && *(p+1) == ‘u’) {
unbuffered = 1;
k = 2;
}
if (k >= argc) {
copyfile(0, 1);
flush();
exit(0);
}
for (i = k; i < argc; i++) {
if (argv[i][0] == ‘-‘ && argv[i][1] == 0) {
fd1 = 0;
} else {
fd1 = open(argv[i], 0);
if (fd1 < 0) {
std_err("cat: cannot open ");
std_err(argv[i]);
std_err("\n");
continue;
}
}
copyfile(fd1, 1);
if (fd1 != 0) close(fd1);
}
flush();
exit(0);
}
copyfile(fd1, fd2)
int fd1, fd2;
{
int n, j, m;
char buf[BLOCK_SIZE];
while (1) {
n = read(fd1, buf, BLOCK_SIZE);
if (n < 0) quit();
if (n == 0) return;
if (unbuffered) {
m = write(fd2, buf, n);
if (m != n) quit();
} else {
for (j = 0; j < n; j++) {
*next++ = buf[j];
if (next == &buffer[BUF_SIZE]) {
m = write(fd2, buffer, BUF_SIZE);
if (m != BUF_SIZE) quit();
next = buffer;
}
}
}
}
}
flush()
{
if (next != buffer)
if (write(1, buffer, next – buffer) <= 0) quit();
}
quit()
{
perror("cat");
exit(1);
}
[/sourcecode]
Leave a Reply