|
|
- #include "parse_tool.h"
- #include <cassert>
- #include <fstream>
- #include <sstream>
- #include <cstdio>
- #include <chrono>
- #include <filesystem>
- #include <thread>
-
- using namespace std::chrono_literals;
-
- struct parameters_t{
- tool_env default_env{};
- std::string exec;
- std::chrono::microseconds delay = 0us;
- };
-
- parameters_t parse_cmd(const std::vector<std::string>& args)
- {
- parameters_t ret;
- auto it = args.begin();
- for(;it!=args.end();it++)
- {
- if((*it)[0]!='-')
- {
- ret.exec = *it;
- }
- else
- {
- switch((*it)[1])
- {
- case 'c':
- ++it;
- if(it->size()>=2)
- ret.default_env = parse_toolenv(ret.default_env, it->begin(), --(it->end()));
- case 'd':
- ret.delay = std::chrono::microseconds{std::strtoll(it->c_str()+2, nullptr, 10)};
- break;
- }
- }
- }
- return ret;
- }
-
- int MAIN(std::vector<std::string> args)
- {
- bool used_tmp = false;
- std::string code;
- auto parameters = parse_cmd(args);
- if(parameters.exec.empty())
- {
- used_tmp = true;
- std::stringstream command{};
- auto v = std::getenv("EDITOR");
- command<< (v!=NULL ? v : "vi");
- std::array<char, L_tmpnam> buff;
- parameters.exec = std::tmpnam(&buff.front());
-
- command<<" "<<parameters.exec;
-
- std::system(command.str().c_str());
- }
- std::ifstream input(parameters.exec);
- std::stringstream sstr;
- while(input >> sstr.rdbuf());
- if(used_tmp)
- {
- std::filesystem::remove(parameters.exec);
- }
- code = sstr.str();
-
- tool_env glob = parameters.default_env;
- parse_tool p{code, glob};
- while(p.has_queue())
- {
- std::this_thread::sleep_for(parameters.delay);
-
- p.execute();
- }
- return 0;
- }
-
- int main(int argc, char** argv)
- {
- std::vector<std::string> args;
- for(int v=1;v<argc;v++)
- args.emplace_back(argv[v]);
- return MAIN(args);
- }
-
|