-// gen-shell - the generic shell
-// Copyright (c) 2020, Armaan Bhojwani <code@armaanb.net>
+// gen-shell - the generic REPL
+// Copyright (c) 2021, Armaan Bhojwani <me@armaanb.net>
-#include <cmake.h>
#include <iostream>
-#include <../Sarge/src/sarge.h>
+#include "sarge.h"
+
#include <vector>
#include <string>
-#ifdef HAVE_READLINE
#include <readline/readline.h>
#include <readline/history.h>
-#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 = "<EOF>";
} 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 = "<EOF>";
- }
-#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 <options>");
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;
}
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 == "<EOF>" || command == "exit" || command == "quit" )
- {
- system (after_command.c_str ());
+ if (command == "<EOF>" || 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());
}
}
}