#pragma once #include "cmd/args/arg.hpp" #include "cmd/args/arg_generic.hpp" #include "cmd/args/arg_input.hpp" #include "cmd/args/arg_manager.hpp" #include "cmd/cmd_base.hpp" #include "util/input.hpp" #include "util/stringliteral.hpp" #include #include #include #include #include namespace fsh { class CmdTr : public Command { public: virtual void execute(FlagNode flag, ArgNodes& vec, std::istream& in, std::ostream& out) override { ArgFactory af; switch (vec.size()) { case 2: af.add_rule(1); case 1: af.add_rule(1); break; default: af.add_input_rule(); af.add_rule(1); af.add_rule(1); break; } Command::execute(flag, vec, in,out, af); } protected: std::string replace_all(std::string str,const std::string &what,const std::string &with) { if(what == "") throw std::runtime_error("\"\" cannot be used as what"); unsigned long long pos = str.find(what); while(pos != std::string::npos) { str.replace(pos,what.size(),with) ; pos = str.find(what,pos+with.size()); } return str; } virtual void run(std::istream& in, std::ostream& out, ArgManager& args) override { std::string s; std::string o; std::string what = ""; std::string with = ""; while (std::getline(in, s)) { o += s + "\n"; } switch (args.size()) { case 2: with = args.get(1).value(); case 1: what = args.get(0).value(); break; case 3: what = args.get(1).value(); with = args.get(2).value(); } out << replace_all(o,what,with); } }; }