X-Git-Url: https://git.armaanb.net/?p=gen-shell.git;a=blobdiff_plain;f=src%2Fmain.cpp;h=ae69ebb6f09f1e6ea52e4d6a5a6a9eb1ff542b97;hp=516f22396109081ec12a451262bf87c3d5d99e01;hb=HEAD;hpb=f5ab06bf079103425674d2583b149ded02e53d13 diff --git a/src/main.cpp b/src/main.cpp index 516f223..ae69ebb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,74 +1,59 @@ -// gen-shell - the generic shell +// gen-shell - the generic REPL // Copyright (c) 2021, Armaan Bhojwani -#include #include -#include <../Sarge/src/sarge.h> +#include "sarge.h" + #include #include -#ifdef HAVE_READLINE #include #include -#endif //////////////////////////////////////////////////////////////////////////////// using namespace std; -const std::string getResponse(const std::string & prompt) { +const std::string +getResponse(const std::string & prompt) { std::string response { "" }; // Display prompt, get input -#ifdef HAVE_READLINE char * line_read = readline(prompt.c_str()); if (!line_read) { std::cout << "\n"; response = ""; } else { - // Save history - if ( * line_read) + if (*line_read) { add_history(line_read); + } response = std::string(line_read); free(line_read); } -#else - std::cout << prompt; - std::getline(std::cin, response); - if (std::cin.eof() == 1) { - std::cout << "\n"; - response = ""; - } -#endif return response; } //////////////////////////////////////////////////////////////////////////////// -int main(int argc, char** argv) +int +main(int argc, char** argv) { - // Command line arguments Sarge sarge; - sarge.setArgument("a", "after", - "Command to execute before leaving the shell", true); - sarge.setArgument("b", "before", - "Command to execute before entering the shell", true); - sarge.setArgument("c", "command", "Command to convert to shell", true); - sarge.setArgument("h", "help", "Get help.", false); + sarge.setArgument("c", "command", "Command to convert to REPL", true); + sarge.setArgument("h", "help", "Show this message.", false); sarge.setArgument("p", "prompt", "Define a custom prompt", true); - sarge.setArgument("", "no-space", - "Dont automatically add spaces after custom prompt and command", true); - sarge.setDescription("Make a shell from any executable"); + sarge.setArgument("q", "quotes", "Treat whole input as argv[1]", false); + sarge.setDescription("Make a REPL from any executable"); sarge.setUsage("gen-shell "); if (!sarge.parseArguments(argc, argv)) { - std::cerr << "Couldn't parse arguments..." << std::endl; + std::cerr << "Could not parse command line arguments" << std::endl; return 1; } @@ -77,47 +62,29 @@ int main(int argc, char** argv) return 0; } - bool space = true; - if (sarge.exists("no-space")) { - space = false; - } - - // Define input command string arg_cmd; sarge.getFlag("command", arg_cmd); - if ( space ) - arg_cmd += " "; - // Define prompt string prompt = ""; sarge.getFlag("prompt", prompt); - if ( prompt == "" ) - { + if (prompt == "") { prompt = "% "; - } else if ( space ) { - prompt += " "; } - // Execute before-command - string before_command; - sarge.getFlag("before", before_command); - system (before_command.c_str ()); - - // Execute after-command - string after_command; - sarge.getFlag("after", after_command); - // Do the stuffs! while (true) { auto command = getResponse(prompt); - if (command == "" || command == "exit" || command == "quit" ) - { - system (after_command.c_str ()); + if (command == "" || command == "exit" || command == "quit" ) { return 0; } else { - string whole_command = arg_cmd + command; - system (whole_command.c_str ()); + string whole_command = arg_cmd + " "; + if (sarge.exists("quotes")) { + whole_command = whole_command + "\"" + command + "\""; + } else { + whole_command += command; + } + system(whole_command.c_str()); } } }