summaryrefslogtreecommitdiff
path: root/Userland/wc.cpp
diff options
context:
space:
mode:
authorTim Morgan <tim@timmorgan.org>2019-09-11 17:26:48 -0500
committerAndreas Kling <awesomekling@gmail.com>2019-09-12 07:47:19 +0200
commitbc23db2c71491f30fbfa221222bb26990ae4c98d (patch)
treead69b9c99091e5744d7cb18c7f3bacd617a0d8cd /Userland/wc.cpp
parent8b0d530584a29acdef9f8e3efdfb86856c039964 (diff)
downloadserenity-bc23db2c71491f30fbfa221222bb26990ae4c98d.zip
Add stdin support to wc program
Diffstat (limited to 'Userland/wc.cpp')
-rw-r--r--Userland/wc.cpp60
1 files changed, 38 insertions, 22 deletions
diff --git a/Userland/wc.cpp b/Userland/wc.cpp
index 0910f32abf..499eb85559 100644
--- a/Userland/wc.cpp
+++ b/Userland/wc.cpp
@@ -16,6 +16,8 @@ struct Count {
unsigned long lines = 0;
};
+int wc(const String& filename, Vector<Count>& counts);
+
void report(const Count& count)
{
if (output_lines) {
@@ -93,36 +95,50 @@ int main(int argc, char** argv)
}
Vector<String> files = args.get_single_values();
+ Vector<Count> counts;
+ int status;
if (files.is_empty()) {
- fprintf(stderr, "wc: No files provided\n");
- return 1;
+ status = wc("", counts);
+ if (status != 0)
+ return status;
+ } else {
+ for (const auto& f : files) {
+ status = wc(f, counts);
+ if (status != 0)
+ return status;
+ }
}
+ report(counts);
+ return 0;
+}
- Vector<Count> counts;
- for (const auto& f : files) {
- FILE* fp = fopen(f.characters(), "r");
+int wc(const String& filename, Vector<Count>& counts)
+{
+ FILE* fp = nullptr;
+ if (filename == "" || filename == "-") {
+ fp = stdin;
+ } else {
+ fp = fopen(filename.characters(), "r");
if (fp == nullptr) {
- fprintf(stderr, "wc: Could not open file '%s'\n", f.characters());
+ fprintf(stderr, "wc: Could not open file '%s'\n", filename.characters());
return 1;
}
+ }
- Count count { f };
- char* line = nullptr;
- size_t len = 0;
- ssize_t n_read = 0;
- while ((n_read = getline(&line, &len, fp)) != -1) {
- count.lines++;
- count.words += count_words(line);
- count.chars += n_read;
- }
-
- counts.append(count);
- fclose(fp);
- if (line) {
- free(line);
- }
+ Count count { filename };
+ char* line = nullptr;
+ size_t len = 0;
+ ssize_t n_read = 0;
+ while ((n_read = getline(&line, &len, fp)) != -1) {
+ count.lines++;
+ count.words += count_words(line);
+ count.chars += n_read;
}
- report(counts);
+ counts.append(count);
+ fclose(fp);
+ if (line) {
+ free(line);
+ }
return 0;
}