]> git.saurik.com Git - cycript.git/blobdiff - Console.cpp
Stub alternative (vector) implementation of Stack.
[cycript.git] / Console.cpp
index 883f03f0977cbf5b13e150f2b3765e7de73fe297..3089edc2d66d6c411bd140885c06469b9dcba830 100644 (file)
@@ -226,14 +226,17 @@ static CYExpression *ParseExpression(CYUTF8String code) {
     CYOptions options;
     CYContext context(options);
 
-    CYStatement *statement(driver.program_->statements_);
+    CYStatement *statement(driver.program_->code_);
     _assert(statement != NULL);
     _assert(statement->next_ == NULL);
 
-    CYExpress *express(dynamic_cast<CYExpress *>(driver.program_->statements_));
+    CYExpress *express(dynamic_cast<CYExpress *>(driver.program_->code_));
     _assert(express != NULL);
 
-    return express->expression_;
+    CYParenthetical *parenthetical(dynamic_cast<CYParenthetical *>(express->expression_));
+    _assert(parenthetical != NULL);
+
+    return parenthetical->expression_;
 }
 
 static int client_;
@@ -306,7 +309,7 @@ static char **Complete(const char *word, int start, int end) {
 
     driver.program_->Replace(context);
 
-    std::ostringstream str;
+    std::stringbuf str;
     CYOutput out(str, options);
     out << *driver.program_;
 
@@ -413,7 +416,7 @@ class History {
     }
 
     void operator +=(const std::string &command) {
-        add_history(command_.c_str());
+        add_history(command.c_str());
         ++histlines_;
     }
 };
@@ -527,6 +530,7 @@ static void Console(CYOptions &options) {
         }
 
         command_ += line;
+        command_ += "\n";
 
         char *begin(line), *end(line + strlen(line));
         while (char *nl = reinterpret_cast<char *>(memchr(begin, '\n', end - begin))) {
@@ -555,7 +559,7 @@ static void Console(CYOptions &options) {
             if (parser.parse() != 0 || !driver.errors_.empty()) {
                 for (CYDriver::Errors::const_iterator error(driver.errors_.begin()); error != driver.errors_.end(); ++error) {
                     CYPosition begin(error->location_.begin);
-                    if (begin.line != lines.size() || begin.column < lines.back().size() || error->warning_) {
+                    if (begin.line != lines.size() + 1 || error->warning_) {
                         CYPosition end(error->location_.end);
 
                         if (begin.line != lines.size()) {
@@ -575,14 +579,13 @@ static void Console(CYOptions &options) {
                         std::cerr << "  | ";
                         std::cerr << error->message_ << std::endl;
 
-                        history += command_;
+                        history += command_.substr(0, command_.size() - 1);
                         goto restart;
                     }
                 }
 
                 driver.errors_.clear();
 
-                command_ += '\n';
                 prompt = "cy> ";
                 goto read;
             }
@@ -590,14 +593,14 @@ static void Console(CYOptions &options) {
             if (driver.program_ == NULL)
                 goto restart;
 
-            std::ostringstream str;
+            std::stringbuf str;
             CYOutput out(str, options);
             Setup(out, driver, options, lower);
             out << *driver.program_;
             code = str.str();
         }
 
-        history += command_;
+        history += command_.substr(0, command_.size() - 1);
 
         if (debug) {
             std::cout << "cy= ";
@@ -609,7 +612,7 @@ static void Console(CYOptions &options) {
     }
 }
 
-void InjectLibrary(pid_t, int, const char *[]);
+void InjectLibrary(pid_t, int, const char *const []);
 
 int Main(int argc, char * const argv[], char const * const envp[]) {
     bool tty(isatty(STDIN_FILENO));
@@ -716,7 +719,8 @@ int Main(int argc, char * const argv[], char const * const envp[]) {
                     // XXX: arg needs to be escaped in some horrendous way of doom
                     // XXX: this is a memory leak now because I just don't care enough
                     char *command;
-                    asprintf(&command, "ps axc|sed -e '/^ *[0-9]/{s/^ *\\([0-9]*\\)\\( *[^ ]*\\)\\{3\\} *-*\\([^ ]*\\)/\\3 \\1/;/^%s /{s/^[^ ]* //;q;};};d'", optarg);
+                    int writ(asprintf(&command, "ps axc|sed -e '/^ *[0-9]/{s/^ *\\([0-9]*\\)\\( *[^ ]*\\)\\{3\\} *-*\\([^ ]*\\)/\\3 \\1/;/^%s /{s/^[^ ]* //;q;};};d'", optarg));
+                    _assert(writ != -1);
 
                     if (FILE *pids = popen(command, "r")) {
                         char value[32];
@@ -864,7 +868,8 @@ int Main(int argc, char * const argv[], char const * const envp[]) {
         _syscall(chmod(address.sun_path, 0777));
 
         _syscall(listen(server, 1));
-        InjectLibrary(pid, 1, (const char *[]) {address.sun_path, NULL});
+        const char *const argv[] = {address.sun_path, NULL};
+        InjectLibrary(pid, 1, argv);
         client_ = _syscall(accept(server, NULL, NULL));
     }
 #else
@@ -921,7 +926,7 @@ int Main(int argc, char * 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) {
-            std::ostringstream str;
+            std::stringbuf str;
             CYOutput out(str, options);
             Setup(out, driver, options, true);
             out << *driver.program_;