summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2025-11-07 18:05:15 +0100
committerClaudius "keldu" Holeksa <mail@keldu.de>2025-11-07 18:05:15 +0100
commit320383c48ffebdce41f542c77735ed80c18f0ffd (patch)
treec01dc09602aadbc4b0fed7b1511db6b87f6e8906
parentca8d14bf09d9f863b0b3246cd6805a4ea9e571af (diff)
downloadapps-science_tools-320383c48ffebdce41f542c77735ed80c18f0ffd.tar.gz
Cleaned git repo
-rw-r--r--run_and_record/c++/main.cpp74
-rw-r--r--run_and_record/c++/schema.hpp10
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"
>,