summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;
}