]> git.saurik.com Git - cycript.git/blobdiff - Console.cpp
Just to be safe.
[cycript.git] / Console.cpp
index 77e9759a7e558e7c50e1164070921e57fecae6bc..8e1c0dae2ce32515504c747453fc9eabbf583809 100644 (file)
@@ -1,4 +1,4 @@
-/* Cycript - Remove Execution Server and Disassembler
+/* Cycript - Inlining/Optimizing JavaScript Compiler
  * Copyright (C) 2009  Jay Freeman (saurik)
 */
 
 
 #include "cycript.hpp"
 
+#ifdef CY_EXECUTE
+#include "JavaScript.hpp"
+#endif
+
 #include <cstdio>
 #include <sstream>
 
 #include <setjmp.h>
 
+#ifdef HAVE_READLINE_H
+#include <readline.h>
+#else
 #include <readline/readline.h>
+#endif
+
+#ifdef HAVE_HISTORY_H
+#include <history.h>
+#else
 #include <readline/history.h>
+#endif
 
 #include <sys/mman.h>
 
@@ -66,6 +79,8 @@
 
 #include <apr_getopt.h>
 
+#include <dlfcn.h>
+
 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<int (*)(int, const char *)>(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 ?: "<stdin>");
         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;