#pragma once #include #include #include #include #include using tool_env = std::map; class tool { public: virtual void init(std::optional> next) = 0; virtual void execute() = 0; virtual void enqueue(std::string) = 0; virtual bool has_queue() = 0; }; inline std::string escape(std::string v) { std::stringstream sstr; for(char c : v) { switch(c) { case '\\': sstr<<"\\\\"; break; case '\n': sstr<<"\\n"; break; case '\t': sstr<<"\\t"; break; case ':': sstr<<"\\:"; break; case 0: sstr<<"\\0"; break; default: sstr<> point; if(point!='\\') { sstr << point; } else { orig >> point; switch(point) { case '\\': sstr<<"\\"; break; case 'n': sstr<<"\n"; break; case 't': sstr<<"\t"; break; case '0': sstr<<"\0"; break; case ':': sstr<<":"; break; default: sstr< > mktool(std::string toolname, tool_env env);