X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/6845c3c750d5faae242a182cb88e4a5d27bc65c1..e257405a21801819aa1f5262b0c373c03fabbd58:/Console.cpp?ds=sidebyside diff --git a/Console.cpp b/Console.cpp index 8f8ff0a..db86eb8 100644 --- a/Console.cpp +++ b/Console.cpp @@ -68,6 +68,7 @@ #include #endif +#include "Code.hpp" #include "Driver.hpp" #include "Error.hpp" #include "Highlight.hpp" @@ -291,7 +292,25 @@ static CYUTF8String Run(CYPool &pool, int client, const std::string &code) { static std::ostream *out_; -static void Output(CYUTF8String json, std::ostream *out, bool expand = false) { +static void Output(CYUTF8String json, std::ostream *out, bool expand = false, bool reparse = false) { + CYPool pool; + + if (reparse) do { + CYStream stream(json.data, json.data + json.size); + CYDriver driver(pool, stream); + if (driver.Parse(CYMarkExpression)) + break; + std::stringbuf str; + CYOptions options; + CYOutput out(str, options); + out.pretty_ = true; + out << *driver.context_; + std::string data(str.str()); + json = CYPoolUTF8String(pool, data); + if (json.size == 0) + json.data = NULL; + } while (false); + const char *data(json.data); size_t size(json.size); @@ -381,6 +400,9 @@ class History { } } void operator +=(std::string command) { + if (HIST_ENTRY *entry = history_get(where_history())) + if (command == entry->line) + return; add_history(command.c_str()); ++histlines_; } @@ -607,9 +629,9 @@ static void CYConsolePrepTerm(int meta) { CYConsoleRemapKeys(vi_movement_keymap); } -static void CYOutputRun(const std::string &code, bool expand = false) { +static void CYOutputRun(const std::string &code, bool expand = false, bool reparse = false) { CYPool pool; - Output(Run(pool, client_, code), &std::cout, expand); + Output(Run(pool, client_, code), &std::cout, expand, reparse); } static void Console(CYOptions &options) { @@ -641,6 +663,7 @@ static void Console(CYOptions &options) { bool debug(false); bool expand(false); bool lower(true); + bool reparse(false); out_ = &std::cout; @@ -654,13 +677,13 @@ static void Console(CYOptions &options) { CYOutputRun(""); - struct sigaction action; - sigemptyset(&action.sa_mask); - action.sa_handler = &sigint; - action.sa_flags = 0; - sigaction(SIGINT, &action, NULL); - for (;;) { + struct sigaction action; + sigemptyset(&action.sa_mask); + action.sa_handler = &sigint; + action.sa_flags = 0; + sigaction(SIGINT, &action, NULL); + if (setjmp(ctrlc_) != 0) { mode_ = Working; *out_ << std::endl; @@ -712,6 +735,9 @@ static void Console(CYOptions &options) { } else if (data == "lower") { lower = !lower; *out_ << "lower == " << (lower ? "true" : "false") << std::endl; + } else if (data == "reparse") { + reparse = !reparse; + *out_ << "reparse == " << (reparse ? "true" : "false") << std::endl; } continue; @@ -775,7 +801,7 @@ static void Console(CYOptions &options) { std::cout << std::endl; } - CYOutputRun(code, expand); + CYOutputRun(code, expand, reparse); } } @@ -806,6 +832,8 @@ int Main(int argc, char * const argv[], char const * const envp[]) { const char *host(NULL); const char *port(NULL); + const char *argv0(argv[0]); + optind = 1; for (;;) { @@ -984,15 +1012,18 @@ int Main(int argc, char * const argv[], char const * const envp[]) { if (argc == 0) script = NULL; else { -#ifdef CY_EXECUTE - // XXX: const_cast?! wtf gcc :( - CYSetArgs(argc - 1, const_cast(argv + 1)); -#endif script = argv[0]; if (strcmp(script, "-") == 0) script = NULL; + --argc; + ++argv; } +#ifdef CY_EXECUTE + // XXX: const_cast?! wtf gcc :( + CYSetArgs(argv0, script, argc, const_cast(argv)); +#endif + #ifdef CY_ATTACH if (pid == _not(pid_t)) client_ = -1;