X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=src%2Fmain.cpp;h=6e14fe4a8c4d0ecaa043e4bf7a88bdb9f46d1d78;hb=450a787db48ab01a4b4452d47ecccf93790207fb;hp=fa4bad3cc07418bc11af7ac30c746acdab166af3;hpb=26b1d23d53c98fd02c3419d889ec852c1f0fc41c;p=gen-shell.git diff --git a/src/main.cpp b/src/main.cpp index fa4bad3..6e14fe4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,9 @@ //////////////////////////////////////////////////////////////////////////////// // -// Copyright 2006 - 2017, Paul Beckingham, Federico Hernandez, 2020 Armaan Bhojwani +// gen-shell, the generic shell +// +// 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 @@ -24,131 +27,125 @@ // //////////////////////////////////////////////////////////////////////////////// + #include #include -#include -#include -#include -#include +#include <../Sarge/src/sarge.h> #include -#include #ifdef HAVE_READLINE -#include -#include + #include + #include #endif -std::string promptCompose (); +//////////////////////////////////////////////////////////////////////////////// -const std::string getResponse (const std::string& prompt) -{ - std::string response {""}; +using namespace std; - // Display prompt, get input. -#ifdef HAVE_READLINE - char *line_read = readline (prompt.c_str ()); - if (! line_read) - { +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 = ""; - } - else - { - // Save history. - if (*line_read) - add_history (line_read); + } else { + // Save history + if ( * line_read) + add_history(line_read); - response = std::string (line_read); - free (line_read); + response = std::string(line_read); + free(line_read); } -#else + #else std::cout << prompt; - std::getline (std::cin, response); - if (std::cin.eof () == 1) - { + std::getline(std::cin, response); + if (std::cin.eof() == 1) { std::cout << "\n"; response = ""; } -#endif + #endif return response; } //////////////////////////////////////////////////////////////////////////////// -static int commandLoop (bool autoClear) -{ - // Compose the prompt. - auto prompt = promptCompose (); - // Display prompt, get input. - auto command = getResponse (prompt); - - if (autoClear) - std::cout << "\033[2J\033[0;0H"; +int main(int argc, char** argv) +{ - int status = 0; - if (! isatty (fileno (stdin)) && command == "") - { - status = -1; - } - else if (command != "") + // 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("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.setUsage("gen-shell "); + + if (!sarge.parseArguments(argc, argv)) { + std::cerr << "Couldn't parse arguments..." << std::endl; + return 1; + } + + if (sarge.exists("help")) { + sarge.printHelp(); + 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 == "" ) { - // Dispatch command. - if (command == "") status = -1; - else if (command != "") - { - command = command; - std::cout << "[" << command << "]\n"; - system (command.c_str ()); - } + prompt = "% "; + } else if ( space ) { + prompt += " "; } - return status; -} + // Execute before-command + string before_command; + sarge.getFlag("before", before_command); + system (before_command.c_str ()); -//////////////////////////////////////////////////////////////////////////////// -int main (int argc, const char** argv) -{ - int status = 0; + // Execute after-command + string after_command; + sarge.getFlag("after", after_command); - // Lightweight version checking that doesn't require initialization or any I/O. - if (argc == 2 && !strcmp (argv[1], "--version")) - { - std::cout << VERSION << "\n"; - } - else - { - try - { - bool autoClear = false; - std::string input; - std::string output; - autoClear = (output == "true\n" || - output == "1\n" || - output == "y\n" || - output == "yes\n" || - output == "on\n"); - - while ((status = commandLoop (autoClear)) == 0) - ; - } + // Do the stuffs! + while (true) { + // Display prompt, get input + auto command = getResponse(prompt); - catch (const std::string& error) + // Dispatch command + if (command == "" || command == "exit" || command == "quit" ) + // if (command == "" || command == "exit" ) { - std::cerr << error << "\n"; - status = -1; - } - - catch (...) - { - std::cerr << "Unknown error." << "\n"; - status = -2; + system (after_command.c_str ()); + return 0; + } else { + string whole_command = arg_cmd + command; + system (whole_command.c_str ()); } } - - // Returning -1 drops out of the command loop, but gets translated to 0 here, - // so that there is a clean way to exit. - return status == -1 ? 0 : status; } ////////////////////////////////////////////////////////////////////////////////