+////////////////////////////////////////////////////////////////////////////////
+//
+// 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
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include <cmake.h>
+#include <iostream>
+#include <vector>
+#include <string>
+#include <cstring>
+#include <cstdio>
+#include <stdlib.h>
+#include <unistd.h>
+
+#ifdef HAVE_READLINE
+#include <readline/readline.h>
+#include <readline/history.h>
+#endif
+
+using namespace std;
+std::string promptCompose ();
+
+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)
+ 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 commandLoop ()
+{
+ // Compose the prompt.
+ auto prompt = promptCompose ();
+
+ // Display prompt, get input.
+ auto command = getResponse (prompt);
+
+ int status = 0;
+ if (! isatty (fileno (stdin)) && command == "")
+ {
+ status = -1;
+ }
+ else if (command != "")
+ {
+ // Dispatch command.
+ if (command == "<EOF>") status = -1;
+ else if (command != "")
+ {
+ command = command;
+ std::cout << "[" << command << "]\n";
+ system (command.c_str ());
+ }
+ }
+
+ return status;
+}
+
+int main ()
+// int main (int argc, const char** argv)
+{
+ int status = 0;
+
+ while (status == 0)
+ commandLoop();
+
+ return status == -1 ? 0 : status;
+}
+
+////////////////////////////////////////////////////////////////////////////////