X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/9567837688897dd742899612a9701fc590f54326..aff874250f2381788739ce0e6b5717ba1907e624:/Console.cpp?ds=sidebyside diff --git a/Console.cpp b/Console.cpp index 77e9759..8e1c0da 100644 --- a/Console.cpp +++ b/Console.cpp @@ -1,4 +1,4 @@ -/* Cycript - Remove Execution Server and Disassembler +/* Cycript - Inlining/Optimizing JavaScript Compiler * Copyright (C) 2009 Jay Freeman (saurik) */ @@ -39,13 +39,26 @@ #include "cycript.hpp" +#ifdef CY_EXECUTE +#include "JavaScript.hpp" +#endif + #include #include #include +#ifdef HAVE_READLINE_H +#include +#else #include +#endif + +#ifdef HAVE_HISTORY_H +#include +#else #include +#endif #include @@ -66,6 +79,8 @@ #include +#include + static volatile enum { Working, Parsing, @@ -106,10 +121,9 @@ void Setup(CYDriver &driver, cy::parser &parser) { driver.strict_ = true; } -void Setup(CYOutput &out, CYDriver &driver) { +void Setup(CYOutput &out, CYDriver &driver, CYOptions &options) { out.pretty_ = pretty_; - - CYContext context(driver.pool_); + CYContext context(driver.pool_, options); driver.program_->Replace(context); } @@ -174,7 +188,9 @@ void Run(int client, std::string &code, FILE *fout = NULL, bool expand = false) Run(client, code.c_str(), code.size(), fout, expand); } -static void Console(apr_pool_t *pool, int client) { +int (*append_history$)(int, const char *); + +static void Console(apr_pool_t *pool, int client, CYOptions &options) { passwd *passwd; if (const char *username = getenv("LOGNAME")) passwd = getpwnam(username); @@ -222,6 +238,8 @@ static void Console(apr_pool_t *pool, int client) { mode_ = Working; if (line == NULL) break; + if (line[0] == '\0') + goto read; if (!extra) { extra = true; @@ -314,8 +332,8 @@ static void Console(apr_pool_t *pool, int client) { code = command; else { std::ostringstream str; - CYOutput out(str); - Setup(out, driver); + CYOutput out(str, options); + Setup(out, driver, options); out << *driver.program_; code = str.str(); } @@ -330,8 +348,12 @@ static void Console(apr_pool_t *pool, int client) { Run(client, code, fout, expand); } - _syscall(close(_syscall(open(histfile, O_CREAT | O_WRONLY, 0600)))); - append_history(histlines, histfile); + if (append_history$ != NULL) { + _syscall(close(_syscall(open(histfile, O_CREAT | O_WRONLY, 0600)))); + (*append_history$)(histlines, histfile); + } else { + write_history(histfile); + } fputs("\n", fout); fflush(fout); @@ -359,6 +381,9 @@ void InjectLibrary(pid_t pid); int Main(int argc, char const * const argv[], char const * const envp[]) { bool tty(isatty(STDIN_FILENO)); bool compile(false); + CYOptions options; + + append_history$ = reinterpret_cast(dlsym(RTLD_DEFAULT, "append_history")); #ifdef CY_ATTACH pid_t pid(_not(pid_t)); @@ -404,6 +429,8 @@ int Main(int argc, char const * const argv[], char const * const envp[]) { case 'g': if (false); + else if (strcmp(arg, "rename") == 0) + options.verbose_ = true; #if YYDEBUG else if (strcmp(arg, "bison") == 0) bison_ = true; @@ -550,7 +577,7 @@ int Main(int argc, char const * const argv[], char const * const envp[]) { #endif if (script == NULL && tty) - Console(pool, client); + Console(pool, client, options); else { CYDriver driver(script ?: ""); cy::parser parser(driver); @@ -585,12 +612,13 @@ int Main(int argc, char const * const argv[], char const * const envp[]) { for (CYDriver::Errors::const_iterator i(driver.errors_.begin()); i != driver.errors_.end(); ++i) std::cerr << i->location_.begin << ": " << i->message_ << std::endl; } else if (driver.program_ != NULL) - if (client != -1) - Run(client, start, end - start, stdout); - else { + if (client != -1) { + std::string code(start, end-start); + Run(client, code, stdout); + } else { std::ostringstream str; - CYOutput out(str); - Setup(out, driver); + CYOutput out(str, options); + Setup(out, driver, options); out << *driver.program_; std::string code(str.str()); if (compile) @@ -605,6 +633,7 @@ int Main(int argc, char const * const argv[], char const * const envp[]) { int main(int argc, char const * const argv[], char const * const envp[]) { apr_status_t status(apr_app_initialize(&argc, &argv, &envp)); + if (status != APR_SUCCESS) { fprintf(stderr, "apr_app_initialize() != APR_SUCCESS\n"); return 1;