46 lines
1.1 KiB
C++
46 lines
1.1 KiB
C++
#pragma once
|
|
|
|
#include "cmd/cmd_base.hpp"
|
|
|
|
namespace fsh {
|
|
|
|
class CmdWc : public Command {
|
|
|
|
protected:
|
|
virtual void register_flags() override {
|
|
ArgFactory& factory = get_factory();
|
|
factory.add_input_rule();
|
|
factory.add_rule("-c");
|
|
factory.add_rule("-w");
|
|
}
|
|
|
|
int count_chars(std::istream& in) {
|
|
int i = 0;
|
|
char c;
|
|
while (in.get(c)) i++;
|
|
return i;
|
|
}
|
|
|
|
int count_words(std::istream& in) {
|
|
int i = 0;
|
|
char c;
|
|
bool prev_space = true;
|
|
while (in.get(c)) {
|
|
i += prev_space & !std::isspace(c);
|
|
prev_space = std::isspace(c);
|
|
}
|
|
return i;
|
|
}
|
|
|
|
virtual void run(std::istream& in, std::ostream& out, ArgManager& args) override {
|
|
if (args.get("-c")) {
|
|
out << count_chars(in) << "\n";
|
|
} else if (args.get("-w")) {
|
|
out << count_words(in) << "\n";
|
|
} else {
|
|
throw std::invalid_argument("Didn't provide flag");
|
|
}
|
|
}
|
|
};
|
|
|
|
} |