X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=src%2Fmain.cpp;h=a570cdd792821bfee3f38891b4a2f919c4d41f19;hb=e8d0a44ba528abc257a5f260922eff65b73bc5de;hp=1e8f1d2496742a2a8b2bc9919d4a8d40e0e58b7c;hpb=11665c1b3741eaf7c4cc51f54ce7c5b8f8467f18;p=gen-shell.git diff --git a/src/main.cpp b/src/main.cpp index 1e8f1d2..a570cdd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -26,6 +26,8 @@ #include #include +#include +#include #include <../Sarge/src/sarge.h> #include @@ -37,21 +39,45 @@ //////////////////////////////////////////////////////////////////////////////// using namespace std; -std::string promptCompose(); + +static std::vector contexts; +std::string composeContexts (bool pretty = false); + +int promptClear () +{ + contexts.clear (); + return 0; +} + +int promptRemove () +{ + if (contexts.size ()) + contexts.pop_back (); + + return 0; +} + +int promptAdd (const std::string& context) +{ + contexts.push_back (context); + return 0; +} + +//////////////////////////////////////////////////////////////////////////////// const std::string getResponse(const std::string & prompt) { std::string response { "" }; - // Display prompt, get input. + // Display prompt, get input #ifdef HAVE_READLINE char * line_read = readline(prompt.c_str()); if (!line_read) { std::cout << "\n"; response = ""; } else { - // Save history. + // Save history if ( * line_read) add_history(line_read); @@ -78,10 +104,13 @@ 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", "cmd", "Command to execute before entering the shell", true); - sarge.setDescription("Make a shell from any command"); - sarge.setUsage("gen-shell "); + sarge.setArgument("p", "prompt", "Define a custom prompt", true); + sarge.setDescription("Make a shell from any executable"); + sarge.setUsage("gen-shell "); if (!sarge.parseArguments(argc, argv)) { std::cerr << "Couldn't parse arguments..." << std::endl; @@ -93,23 +122,40 @@ int main(int argc, char** argv) return 0; } + // define input command string arg_cmd; - sarge.getFlag("cmd", arg_cmd); + sarge.getFlag("command", arg_cmd); arg_cmd += " "; + // define prompt + string prompt = ""; + sarge.getFlag("prompt", prompt); + + if ( prompt == "" ) + prompt = "% "; + else + 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); + // Main program while (true) { - // Compose the prompt. - auto prompt = promptCompose(); - - // Display prompt, get input. + // Display prompt, get input auto command = getResponse(prompt); if (command != "") { - // Dispatch command. + // Dispatch command if (command == "") { + system (after_command.c_str ()); return 0; } else if (command != "")