X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/da136f8849f087693f28e44a5e13616a704a73ef..9a39f7051ad983d4377917e66222727dcbe6c099:/Console.cpp?ds=sidebyside diff --git a/Console.cpp b/Console.cpp index e65e630..cedd150 100644 --- a/Console.cpp +++ b/Console.cpp @@ -26,6 +26,7 @@ #endif #include +#include #include #include @@ -42,8 +43,6 @@ #include #endif -#include - #include #include @@ -111,10 +110,11 @@ void Setup(CYDriver &driver, cy::parser &parser) { driver.strict_ = true; } -void Setup(CYOutput &out, CYDriver &driver, CYOptions &options) { +void Setup(CYOutput &out, CYDriver &driver, CYOptions &options, bool lower) { out.pretty_ = pretty_; CYContext context(options); - driver.program_->Replace(context); + if (lower) + driver.program_->Replace(context); } static CYUTF8String Run(CYPool &pool, int client, CYUTF8String code) { @@ -124,7 +124,7 @@ static CYUTF8String Run(CYPool &pool, int client, CYUTF8String code) { if (client == -1) { mode_ = Running; #ifdef CY_EXECUTE - json = CYExecute(pool, code); + json = CYExecute(CYGetJSContext(), pool, code); #else json = NULL; #endif @@ -437,6 +437,7 @@ static void Console(CYOptions &options) { bool bypass(false); bool debug(false); bool expand(false); + bool lower(true); bool syntax(true); out_ = &std::cout; @@ -470,24 +471,20 @@ static void Console(CYOptions &options) { read: #if RL_READLINE_VERSION >= 0x0600 - if (syntax) { - rl_prep_term_function = CYDisplayStart; + if (syntax) rl_redisplay_function = CYDisplayUpdate; - rl_deprep_term_function = CYDisplayFinish; - } else { - rl_prep_term_function = rl_prep_terminal; + else rl_redisplay_function = rl_redisplay; - rl_deprep_term_function = rl_deprep_terminal; - } #endif mode_ = Parsing; char *line(readline(prompt)); mode_ = Working; - if (line == NULL) + if (line == NULL) { + *out_ << std::endl; break; - if (line[0] == '\0') + } else if (line[0] == '\0') goto read; if (!extra) { @@ -503,11 +500,15 @@ static void Console(CYOptions &options) { } else if (data == "expand") { expand = !expand; *out_ << "expand == " << (expand ? "true" : "false") << std::endl; + } else if (data == "lower") { + lower = !lower; + *out_ << "lower == " << (lower ? "true" : "false") << std::endl; } else if (data == "syntax") { syntax = !syntax; *out_ << "syntax == " << (syntax ? "true" : "false") << std::endl; } - history += line; + command_ = line; + history += command_; goto restart; } } @@ -576,15 +577,11 @@ static void Console(CYOptions &options) { if (driver.program_ == NULL) goto restart; - if (client_ != -1) - code = command_; - else { - std::ostringstream str; - CYOutput out(str, options); - Setup(out, driver, options); - out << *driver.program_; - code = str.str(); - } + std::ostringstream str; + CYOutput out(str, options); + Setup(out, driver, options, lower); + out << *driver.program_; + code = str.str(); } history += command_; @@ -596,25 +593,6 @@ static void Console(CYOptions &options) { Run(client_, syntax, code, out_, expand); } - - *out_ << std::endl; -} - -static void *Map(const char *path, size_t *psize) { - int fd; - _syscall(fd = open(path, O_RDONLY)); - - struct stat stat; - _syscall(fstat(fd, &stat)); - size_t size(stat.st_size); - - *psize = size; - - void *base; - _syscall(base = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0)); - - _syscall(close(fd)); - return base; } void InjectLibrary(pid_t pid); @@ -878,56 +856,33 @@ int Main(int argc, char const * const argv[], char const * const envp[]) { else { CYLocalPool pool; - char *start, *end; - std::istream *indirect; - + std::istream *stream; if (script == NULL) { - start = NULL; - end = NULL; - indirect = &std::cin; + stream = &std::cin; + script = ""; } else { - size_t size; - start = reinterpret_cast(Map(script, &size)); - end = start + size; - - if (size >= 2 && start[0] == '#' && start[1] == '!') { - start += 2; - - if (void *line = memchr(start, '\n', end - start)) - start = reinterpret_cast(line); - else - start = end; - } - - indirect = NULL; + stream = new std::fstream(script, std::ios::in | std::ios::binary); + _assert(!stream->fail()); } - CYStream direct(start, end); - std::istream &stream(indirect == NULL ? direct : *indirect); - CYDriver driver(stream, script ?: ""); - + CYDriver driver(*stream, script); cy::parser parser(driver); Setup(driver, parser); if (parser.parse() != 0 || !driver.errors_.empty()) { 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) { - // XXX: this code means that you can't pipe to another process - std::string code(start, end-start); + } else if (driver.program_ != NULL) { + std::ostringstream str; + CYOutput out(str, options); + Setup(out, driver, options, true); + out << *driver.program_; + std::string code(str.str()); + if (compile) + std::cout << code; + else Run(client_, false, code, &std::cout); - } else { - std::ostringstream str; - CYOutput out(str, options); - Setup(out, driver, options); - out << *driver.program_; - std::string code(str.str()); - if (compile) - std::cout << code; - else - Run(client_, false, code, &std::cout); - } + } } apr_pool_destroy(pool);