| | |
| | #include "util/file.hh" |
| | #include "util/read_compressed.hh" |
| |
|
| | #include <cstring> |
| | #include <iostream> |
| |
|
| | namespace { |
| | const std::size_t kBufSize = 16384; |
| | void Copy(util::ReadCompressed &from, int to) { |
| | util::scoped_malloc buffer(util::MallocOrThrow(kBufSize)); |
| | while (std::size_t amount = from.Read(buffer.get(), kBufSize)) { |
| | util::WriteOrThrow(to, buffer.get(), amount); |
| | } |
| | } |
| | } |
| |
|
| | int main(int argc, char *argv[]) { |
| | |
| | for (int i = 1; i < argc; ++i) { |
| | char *arg = argv[i]; |
| | if (!strcmp(arg, "--")) break; |
| | if (!strcmp(arg, "-h") || !strcmp(arg, "--help")) { |
| | std::cerr << |
| | "A cat implementation that interprets compressed files.\n" |
| | "Usage: " << argv[0] << " [file1] [file2] ...\n" |
| | "If no file is provided, then stdin is read.\n"; |
| | return 1; |
| | } |
| | } |
| |
|
| | try { |
| | if (argc == 1) { |
| | util::ReadCompressed in(0); |
| | Copy(in, 1); |
| | } else { |
| | for (int i = 1; i < argc; ++i) { |
| | util::ReadCompressed in(util::OpenReadOrThrow(argv[i])); |
| | Copy(in, 1); |
| | } |
| | } |
| | } catch (const std::exception &e) { |
| | std::cerr << e.what() << std::endl; |
| | return 2; |
| | } |
| | return 0; |
| | } |
| |
|