-////////////////////////////////////////////////////////////////////////////////
-//
-// 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 shell
+// Copyright (c) 2021, Armaan Bhojwani <me@armaanb.net>
#include <cmake.h>
#include <iostream>
#include <../Sarge/src/sarge.h>
-#include <stdlib.h>
+#include <vector>
+#include <string>
#ifdef HAVE_READLINE
- #include <readline/readline.h>
- #include <readline/history.h>
+#include <readline/readline.h>
+#include <readline/history.h>
#endif
////////////////////////////////////////////////////////////////////////////////
};
// Display prompt, get input
- #ifdef HAVE_READLINE
+#ifdef HAVE_READLINE
char * line_read = readline(prompt.c_str());
if (!line_read) {
std::cout << "\n";
response = std::string(line_read);
free(line_read);
}
- #else
+#else
std::cout << prompt;
std::getline(std::cin, response);
if (std::cin.eof() == 1) {
std::cout << "\n";
response = "<EOF>";
}
- #endif
+#endif
return response;
}
// 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("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("p", "prompt", "Define a custom prompt", true);
- sarge.setArgument("", "no-space", "Dont automatically add spaces after custom prompt and command", false);
+ sarge.setArgument("", "no-space",
+ "Dont automatically add spaces after custom prompt and command", true);
sarge.setDescription("Make a shell from any executable");
sarge.setUsage("gen-shell <options>");
- if (!sarge.parseArguments(argc, argv)) {
- std::cerr << "Couldn't parse arguments..." << std::endl;
- return 1;
- }
+ if (!sarge.parseArguments(argc, argv)) {
+ std::cerr << "Couldn't parse arguments..." << std::endl;
+ return 1;
+ }
- if (sarge.exists("help")) {
- sarge.printHelp();
+ if (sarge.exists("help")) {
+ sarge.printHelp();
return 0;
- }
+ }
- bool space;
+ bool space = true;
if (sarge.exists("no-space")) {
space = false;
- }
+ }
// Define input command
string arg_cmd;
// Define prompt
string prompt = "";
sarge.getFlag("prompt", prompt);
-
if ( prompt == "" )
+ {
prompt = "% ";
- if ( space )
+ } else if ( space ) {
prompt += " ";
+ }
// Execute before-command
string before_command;
string after_command;
sarge.getFlag("after", after_command);
- // Main program
+ // Do the stuffs!
while (true) {
- // Display prompt, get input
auto command = getResponse(prompt);
- if (command != "")
+ if (command == "<EOF>" || command == "exit" || command == "quit" )
{
- // Dispatch command
- if (command == "<EOF>")
- {
- system (after_command.c_str ());
- return 0;
- }
- else if (command != "")
- {
- string whole_command = arg_cmd + command;
- system (whole_command.c_str ());
- }
+ system (after_command.c_str ());
+ return 0;
+ } else {
+ string whole_command = arg_cmd + command;
+ system (whole_command.c_str ());
}
}
}