]> git.armaanb.net Git - gen-shell.git/blobdiff - src/main.cpp
Major restructuring
[gen-shell.git] / src / main.cpp
index 703f46ace9cfc527e844feb5023a160beacbfb9a..ae69ebb6f09f1e6ea52e4d6a5a6a9eb1ff542b97 100644 (file)
-////////////////////////////////////////////////////////////////////////////////
-//
-// 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 <me@armaanb.net>
 
-#include <cmake.h>
 #include <iostream>
-#include <stdlib.h>
+#include "sarge.h"
+
+#include <vector>
+#include <string>
 
-#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) {
+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 = "<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)
 {
-  int status = 0;
+  // Command line arguments
+  Sarge sarge;
+
+  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 <options>");
+
+  if (!sarge.parseArguments(argc, argv)) {
+    std::cerr << "Could not parse command line arguments" << std::endl;
+    return 1;
+  }
 
-  string root_cmd;
-  for (int i = 1; i < argc; ++i) {
-    root_cmd +=argv[i];
-    root_cmd += " ";
+  if (sarge.exists("help")) {
+    sarge.printHelp();
+    return 0;
   }
 
-  while (status == 0) {
-    // Compose the prompt.
-    auto prompt = promptCompose();
+  string arg_cmd;
+  sarge.getFlag("command", arg_cmd);
 
-    // Display prompt, get input.
+  string prompt = "";
+  sarge.getFlag("prompt", prompt);
+  if (prompt == "") {
+    prompt = "% ";
+  }
+
+  // Do the stuffs!
+  while (true) {
     auto command = getResponse(prompt);
 
-    int status = 0;
-    if (command != "")
-    {
-      // Dispatch command.
-      if (command == "<EOF>")                      status = 1;
-      else if (command != "")
-      {
-        if (argc == 0) {
-          string whole_command=command;
-          std::cout << "[" << command << "]\n";
-          system (command.c_str ());
-          }
-        else {
-          string whole_command = root_cmd + " " + command;
-          // std::cout << "[" << whole_command << "]\n";
-          system (whole_command.c_str ());
-        }
+    if (command == "<EOF>" || 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());
     }
-    if (status == 1)
-      return 0;
   }
 }