X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=src%2Fmain.cpp;h=b334ce793f1c1a02a50077a2c3b05159f73a9b73;hb=a396b6e93d7fff98e63428e9ea2aa24c34b4e333;hp=afba7277ec511044acd58b0b19a9f0e3209dbd68;hpb=a5d9cd320e9ed83e36de2b5326f1201ea16b697f;p=gen-shell.git diff --git a/src/main.cpp b/src/main.cpp index afba727..b334ce7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // -// Copyright 2006 - 2017, Paul Beckingham, Federico Hernandez. +// 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 @@ -32,161 +32,85 @@ #include #include #include -#include #ifdef HAVE_READLINE #include #include #endif -// TODO These conflict with tw commands. This needs to be resolved. -// Perhaps an escape, such as '-- help' could invoke local help, or using -// a 'task' prefix could disambiguate. +using namespace std; +std::string promptCompose(); -// tasksh commands. -int cmdHelp (); -int cmdDiagnostics (); -int cmdReview (const std::vector &, bool); -int cmdShell (const std::vector &); -std::string promptCompose (); -std::string findTaskwarrior (); - -//////////////////////////////////////////////////////////////////////////////// -static void welcome () -{ - std::cout << PACKAGE_STRING << "\n"; - cmdHelp (); -} - -//////////////////////////////////////////////////////////////////////////////// -const std::string getResponse (const std::string& prompt) -{ - std::string response {""}; +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) - { + #ifdef HAVE_READLINE + char * line_read = readline(prompt.c_str()); + if (!line_read) { std::cout << "\n"; response = ""; - } - else - { + } else { // Save history. - if (*line_read) - add_history (line_read); + 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) +int main(int argc, char** argv) { - // Compose the prompt. - auto prompt = promptCompose (); - - // Display prompt, get input. - auto command = getResponse (prompt); - - // Obey Taskwarrior's rc.tasksh.autoclear. - if (autoClear) - std::cout << "\033[2J\033[0;0H"; - int status = 0; - if (! isatty (fileno (stdin)) && command == "") - { - status = -1; - } - else if (command != "") - { - auto args = split (command, ' '); - // Dispatch command. - if (args[0] == "") status = -1; - else if (closeEnough ("exit", args[0], 3)) status = -1; - else if (closeEnough ("quit", args[0], 3)) status = -1; - else if (closeEnough ("help", args[0], 3)) status = cmdHelp (); - else if (closeEnough ("diagnostics", args[0], 3)) status = cmdDiagnostics (); - else if (closeEnough ("review", args[0], 3)) status = cmdReview (args, autoClear); - else if (closeEnough ("exec", args[0], 3) || - args[0][0] == '!') status = cmdShell (args); - else if (command != "") - { - command = "task " + command; - std::cout << "[" << command << "]\n"; - system (command.c_str ()); - - // Deliberately ignoreѕ taskwarrior exit status, otherwise empty filters - // cause the shell to terminate. - } - } - - return status; -} - -//////////////////////////////////////////////////////////////////////////////// -int main (int argc, const char** argv) -{ - int status = 0; - - // Lightweight version checking that doesn't require initialization or any I/O. - if (argc == 2 && !strcmp (argv[1], "--version")) - { - std::cout << VERSION << "\n"; + string root_cmd; + for (int i = 1; i < argc; ++i) { + root_cmd +=argv[i]; + root_cmd += " "; } - else - { - try - { - // Get the Taskwarrior rc.tasksh.autoclear Boolean setting. - bool autoClear = false; - std::string input; - std::string output; - execute ("task", {"_get", "rc.tasksh.autoclear"}, input, output); - output = lowerCase (output); - autoClear = (output == "true\n" || - output == "1\n" || - output == "y\n" || - output == "yes\n" || - output == "on\n"); - - if (isatty (fileno (stdin))) - welcome (); - while ((status = commandLoop (autoClear)) == 0) - ; - } + while (status == 0) { + // Compose the prompt. + auto prompt = promptCompose(); - catch (const std::string& error) - { - std::cerr << error << "\n"; - status = -1; - } + // Display prompt, get input. + auto command = getResponse(prompt); - catch (...) + int status = 0; + if (command != "") { - std::cerr << "Unknown error." << "\n"; - status = -2; + // Dispatch command. + if (command == "") 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 (status == 1) + return 0; } - - // 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; } ////////////////////////////////////////////////////////////////////////////////