1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 04:27:43 +00:00

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

View file

@ -16,6 +16,8 @@ struct Count {
unsigned long lines = 0; unsigned long lines = 0;
}; };
int wc(const String& filename, Vector<Count>& counts);
void report(const Count& count) void report(const Count& count)
{ {
if (output_lines) { if (output_lines) {
@ -93,36 +95,50 @@ int main(int argc, char** argv)
} }
Vector<String> files = args.get_single_values(); Vector<String> files = args.get_single_values();
if (files.is_empty()) {
fprintf(stderr, "wc: No files provided\n");
return 1;
}
Vector<Count> counts; Vector<Count> counts;
for (const auto& f : files) { int status;
FILE* fp = fopen(f.characters(), "r"); if (files.is_empty()) {
if (fp == nullptr) { status = wc("", counts);
fprintf(stderr, "wc: Could not open file '%s'\n", f.characters()); if (status != 0)
return 1; return status;
} } else {
for (const auto& f : files) {
Count count { f }; status = wc(f, counts);
char* line = nullptr; if (status != 0)
size_t len = 0; return status;
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);
} }
} }
report(counts); report(counts);
return 0; 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;
}