diff options
| author | Claudius "keldu" Holeksa <mail@keldu.de> | 2025-11-07 18:05:15 +0100 |
|---|---|---|
| committer | Claudius "keldu" Holeksa <mail@keldu.de> | 2025-11-07 18:05:15 +0100 |
| commit | 320383c48ffebdce41f542c77735ed80c18f0ffd (patch) | |
| tree | c01dc09602aadbc4b0fed7b1511db6b87f6e8906 | |
| parent | ca8d14bf09d9f863b0b3246cd6805a4ea9e571af (diff) | |
| download | apps-science_tools-320383c48ffebdce41f542c77735ed80c18f0ffd.tar.gz | |
Cleaned git repo
| -rw-r--r-- | run_and_record/c++/main.cpp | 74 | ||||
| -rw-r--r-- | run_and_record/c++/schema.hpp | 10 |
2 files changed, 77 insertions, 7 deletions
diff --git a/run_and_record/c++/main.cpp b/run_and_record/c++/main.cpp index d28629f..c290ee4 100644 --- a/run_and_record/c++/main.cpp +++ b/run_and_record/c++/main.cpp @@ -211,13 +211,81 @@ saw::error_or<void> kel_main(int argc, char** argv){ // sep_pos+1 til end int argc_prog = argc - (sep_pos+1); + int cmd_pos_start = sep_pos+1; + + // Check if separators are in proper shape { - auto eov = run_program(argc_prog,&argv[sep_pos+1]); - if(eov.is_error()){ - return eov; + int last_sep = sep_pos; + for(int i = cmd_pos_start; i < argc; ++i){ + if(std::string_view{argv[i]} == "&&"){ + if((last_sep+1) == i){ + return saw::make_error<saw::err::critical>("Separators next to each other"); + } + last_sep = i; + } + } + if((last_sep+1) == argc){ + return saw::make_error<saw::err::critical>("Last argument is separator"); + } + } + + // 0 1 2 3 4 + // ./foo && ./bar a && + { + auto& commands = data_for_file.template get<"commands">(); + // + saw::data<sch::RarCommand> cmd_d; + auto& cmd_prog = cmd_d.template get<"program">(); + auto& cmd_args = cmd_d.template get<"arguments">(); + for(int i = cmd_pos_start; i < argc; ++i){ + std::string_view argv_sv{argv[i]}; + + if(argv_sv == "&&"){ + if(i == cmd_pos_start){ + // This case shouldn't happen, but it's better to check again. + return saw::make_error<saw::err::critical>("Command is empty"); + } + + { + cmd_prog = cmd_args.at({0u}); + auto eov = commands.add(std::move(cmd_d)); + if(eov.is_error()){ + return eov; + } + cmd_d = {}; + } + argc_prog = i - cmd_pos_start; + { + auto eov = run_program(argc_prog,&argv[cmd_pos_start]); + if(eov.is_error()){ + return eov; + } + } + cmd_pos_start = i + 1; + }else{ + cmd_args.add(std::string{argv_sv}); + } + } + if(cmd_pos_start == argc){ + // This case shouldn't happen, but it's better to check again. + return saw::make_error<saw::err::critical>("Last command is empty"); + } + { + auto eov = commands.add(std::move(cmd_d)); + if(eov.is_error()){ + return eov; + } + } + { + argc_prog = argc - cmd_pos_start; + auto eov = run_program(argc_prog,&argv[cmd_pos_start]); + if(eov.is_error()){ + return eov; + } } } + if(not std::filesystem::create_directory(data_full_dir)){ return saw::make_error<saw::err::critical>("Couldn't create directory for file"); } diff --git a/run_and_record/c++/schema.hpp b/run_and_record/c++/schema.hpp index 140e81b..87405ef 100644 --- a/run_and_record/c++/schema.hpp +++ b/run_and_record/c++/schema.hpp @@ -25,13 +25,15 @@ using RarArgs = Args< using RarEnv = Array<String>; +using RarCommand = Struct< + Member<String, "program">, + Member<Array<String>, "arguments"> +>; + using RarFileData = Struct< Member< Array< - Struct< - Member<String, "program">, - Member<Array<String>, "arguments"> - > + RarCommand >, "commands" >, |
