X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=src%2Fmain.cpp;h=ae69ebb6f09f1e6ea52e4d6a5a6a9eb1ff542b97;hb=HEAD;hp=a7e95fe751bff9337248f4a3762fde2933c175f0;hpb=d8afd601de1f0d8afe6eff61d40ff52d21d90fd8;p=gen-shell.git diff --git a/src/main.cpp b/src/main.cpp index a7e95fe..ae69ebb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,122 +1,90 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2006 - 2017, Paul Beckingham, Federico Hernandez, 2020 Armaan Bhojwani -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// +// gen-shell - the generic REPL +// Copyright (c) 2021, Armaan Bhojwani -#include #include -#include -#include +#include "sarge.h" + +#include +#include -#ifdef HAVE_READLINE #include #include -#endif //////////////////////////////////////////////////////////////////////////////// using namespace std; -std::string promptCompose(); -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 + // Display prompt, get input 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("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("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("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; - return 1; - } + if (!sarge.parseArguments(argc, argv)) { + std::cerr << "Could not parse command line arguments" << std::endl; + return 1; + } - if (sarge.exists("help")) { - sarge.printHelp(); + if (sarge.exists("help")) { + sarge.printHelp(); return 0; - } + } string arg_cmd; - sarge.getFlag("cmd", arg_cmd); - arg_cmd += " "; + sarge.getFlag("command", arg_cmd); - // Main program - while (true) { - // Compose the prompt. - auto prompt = promptCompose(); + string prompt = ""; + sarge.getFlag("prompt", prompt); + if (prompt == "") { + prompt = "% "; + } - // Display prompt, get input. + // Do the stuffs! + while (true) { auto command = getResponse(prompt); - if (command != "") - { - // Dispatch command. - if (command == "") - { - return 0; - } - else if (command != "") - { - string whole_command = arg_cmd + command; - system (whole_command.c_str ()); + if (command == "" || command == "exit" || command == "quit" ) { + return 0; + } else { + string whole_command = arg_cmd + " "; + if (sarge.exists("quotes")) { + whole_command = whole_command + "\"" + command + "\""; + } else { + whole_command += command; } + system(whole_command.c_str()); } } }