]> git.saurik.com Git - cycript.git/blobdiff - Console.cpp
When CYONifying fields, @error encode exceptions.
[cycript.git] / Console.cpp
index fe03c314090cff31b649fdcd23511e377e5a6c45..d35317830296da8fd2dadc1dabd41cb00573c226 100644 (file)
@@ -136,15 +136,15 @@ static CYUTF8String Run(CYPool &pool, int client, CYUTF8String code) {
     } else {
         mode_ = Sending;
         size = code.size;
-        CYSendAll(client, &size, sizeof(size));
-        CYSendAll(client, code.data, code.size);
+        _assert(CYSendAll(client, &size, sizeof(size)));
+        _assert(CYSendAll(client, code.data, code.size));
         mode_ = Waiting;
-        CYRecvAll(client, &size, sizeof(size));
+        _assert(CYRecvAll(client, &size, sizeof(size)));
         if (size == _not(uint32_t))
             json = NULL;
         else {
             char *temp(new(pool) char[size + 1]);
-            CYRecvAll(client, temp, size);
+            _assert(CYRecvAll(client, temp, size));
             temp[size] = '\0';
             json = temp;
         }
@@ -388,6 +388,34 @@ static char **Complete(const char *word, int start, int end) {
 static char name_[] = "cycript";
 static char break_[] = " \t\n\"\\'`@$><=;|&{(" ")}" ".:[]";
 
+class History {
+  private:
+    std::string histfile_;
+    size_t histlines_;
+
+  public:
+    History(std::string histfile) :
+        histfile_(histfile),
+        histlines_(0)
+    {
+        read_history(histfile_.c_str());
+    }
+
+    ~History() {
+        if (append_history$ != NULL) {
+            _syscall(close(_syscall(open(histfile_.c_str(), O_CREAT | O_WRONLY, 0600))));
+            _assert((*append_history$)(histlines_, histfile_.c_str()) == 0);
+        } else {
+            _assert(write_history(histfile_.c_str()) == 0);
+        }
+    }
+
+    void operator +=(const std::string &command) {
+        add_history(command_.c_str());
+        ++histlines_;
+    }
+};
+
 static void Console(CYOptions &options) {
     CYPool pool;
 
@@ -397,15 +425,14 @@ static void Console(CYOptions &options) {
     else
         passwd = getpwuid(getuid());
 
-    const char *basedir(pool.strcat(passwd->pw_dir, "/.cycript", NULL));
-    const char *histfile(pool.strcat(basedir, "/history", NULL));
-    size_t histlines(0);
+    std::string basedir(passwd->pw_dir);
+    basedir += "/.cycript";
+    mkdir(basedir.c_str(), 0700);
 
     rl_initialize();
     rl_readline_name = name_;
 
-    mkdir(basedir, 0700);
-    read_history(histfile);
+    History history(basedir + "/history");
 
     bool bypass(false);
     bool debug(false);
@@ -458,9 +485,10 @@ static void Console(CYOptions &options) {
         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) {
@@ -480,8 +508,7 @@ static void Console(CYOptions &options) {
                     syntax = !syntax;
                     *out_ << "syntax == " << (syntax ? "true" : "false") << std::endl;
                 }
-                add_history(line);
-                ++histlines;
+                history += line;
                 goto restart;
             }
         }
@@ -535,8 +562,7 @@ static void Console(CYOptions &options) {
                         std::cerr << "  | ";
                         std::cerr << error->message_ << std::endl;
 
-                        add_history(command_.c_str());
-                        ++histlines;
+                        history += command_;
                         goto restart;
                     }
                 }
@@ -562,8 +588,7 @@ static void Console(CYOptions &options) {
             }
         }
 
-        add_history(command_.c_str());
-        ++histlines;
+        history += command_;
 
         if (debug) {
             Write(syntax, code.c_str(), code.size(), std::cout);
@@ -572,15 +597,6 @@ static void Console(CYOptions &options) {
 
         Run(client_, syntax, code, out_, expand);
     }
-
-    if (append_history$ != NULL) {
-        _syscall(close(_syscall(open(histfile, O_CREAT | O_WRONLY, 0600))));
-        (*append_history$)(histlines, histfile);
-    } else {
-        write_history(histfile);
-    }
-
-    *out_ << std::endl;
 }
 
 static void *Map(const char *path, size_t *psize) {