#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"); } } }; }