X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/7341eedbaf526ef2f0986b576c656906050e270a..f2c357f9fb922258dac9f808df0143e548c4bfdc:/Console.cpp diff --git a/Console.cpp b/Console.cpp index 6587106..43012ac 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" @@ -219,7 +220,9 @@ static void sigint(int) { case Parsing: longjmp(ctrlc_, 1); case Running: +#ifndef __ANDROID__ CYCancel(); +#endif return; case Sending: return; @@ -289,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); @@ -361,7 +382,7 @@ class History { if (*character == '\x01') *character = '\n'; } - ~History() { + ~History() { try { for (HIST_ENTRY *history((history_set_pos(0), current_history())); history; history = next_history()) for (char *character(history->line); *character; ++character) if (*character == '\n') *character = '\x01'; @@ -373,7 +394,10 @@ class History { } else { _assert(write_history(histfile_.c_str()) == 0); } - } + } catch (const CYException &error) { + CYPool pool; + std::cout << error.PoolCString(pool) << std::endl; + } } void operator +=(std::string command) { add_history(command.c_str()); @@ -602,8 +626,16 @@ static void CYConsolePrepTerm(int meta) { CYConsoleRemapKeys(vi_movement_keymap); } +static void CYOutputRun(const std::string &code, bool expand = false, bool reparse = false) { + CYPool pool; + Output(Run(pool, client_, code), &std::cout, expand, reparse); +} + static void Console(CYOptions &options) { std::string basedir; +#ifdef __ANDROID__ + basedir = "/data/local/tmp"; +#else if (const char *home = getenv("HOME")) basedir = home; else { @@ -614,6 +646,7 @@ static void Console(CYOptions &options) { passwd = getpwuid(getuid()); basedir = passwd->pw_dir; } +#endif basedir += "/.cycript"; mkdir(basedir.c_str(), 0700); @@ -627,14 +660,19 @@ static void Console(CYOptions &options) { bool debug(false); bool expand(false); bool lower(true); + bool reparse(false); out_ = &std::cout; rl_completer_word_break_characters = break_; rl_attempted_completion_function = &Complete; - rl_redisplay_function = CYDisplayUpdate; - rl_prep_term_function = CYConsolePrepTerm; + if (cur_term != NULL) { + rl_redisplay_function = CYDisplayUpdate; + rl_prep_term_function = CYConsolePrepTerm; + } + + CYOutputRun(""); struct sigaction action; sigemptyset(&action.sa_mask); @@ -694,6 +732,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; @@ -757,8 +798,7 @@ static void Console(CYOptions &options) { std::cout << std::endl; } - CYPool pool; - Output(Run(pool, client_, code), &std::cout, expand); + CYOutputRun(code, expand, reparse); } } @@ -1024,7 +1064,7 @@ int Main(int argc, char * const argv[], char const * const envp[]) { } } file(address.sun_path); - _syscall(bind(server, reinterpret_cast(&address), SUN_LEN(&address))); + _syscall(bind(server, reinterpret_cast(&address), sizeof(address))); _syscall(chmod(address.sun_path, 0777)); _syscall(listen(server, 1)); @@ -1146,7 +1186,7 @@ int Main(int argc, char * const argv[], char const * const envp[]) { return 0; } -int main(int argc, char * const argv[], char const * const envp[]) { +_visible int main(int argc, char * const argv[], char const * const envp[]) { try { return Main(argc, argv, envp); } catch (const CYException &error) {