Add stdin support to wc program

This commit is contained in:
Tim Morgan 2019-09-11 17:26:48 -05:00 committed by Andreas Kling
parent 8b0d530584
commit bc23db2c71
Notes: sideshowbarker 2024-07-19 12:09:13 +09:00

View file

@ -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();
if (files.is_empty()) {
fprintf(stderr, "wc: No files provided\n");
return 1;
}
Vector<Count> counts;
for (const auto& f : files) {
FILE* fp = fopen(f.characters(), "r");
if (fp == nullptr) {
fprintf(stderr, "wc: Could not open file '%s'\n", f.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);
int status;
if (files.is_empty()) {
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;
}
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", filename.characters());
return 1;
}
}
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;
}
counts.append(count);
fclose(fp);
if (line) {
free(line);
}
return 0;
}