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:
parent
8b0d530584
commit
bc23db2c71
1 changed files with 43 additions and 27 deletions
|
@ -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;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue