X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/9674674739f8ab3c2b81879f36fdb7fcf294cb5e..def9084602162fbc6081fadd247ad50a78ad0bce:/Console.cpp diff --git a/Console.cpp b/Console.cpp index f93e090..a7e0929 100644 --- a/Console.cpp +++ b/Console.cpp @@ -1,21 +1,21 @@ /* Cycript - Optimizing JavaScript Compiler/Runtime - * Copyright (C) 2009-2013 Jay Freeman (saurik) + * Copyright (C) 2009-2015 Jay Freeman (saurik) */ -/* GNU General Public License, Version 3 {{{ */ +/* GNU Affero General Public License, Version 3 {{{ */ /* - * Cycript is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation, either version 3 of the License, - * or (at your option) any later version. - * - * Cycript is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Cycript. If not, see . + * GNU Affero General Public License for more details. + + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . **/ /* }}} */ @@ -44,6 +44,8 @@ #endif #include +#include +#include #include #include @@ -58,10 +60,6 @@ #include #include -#include -#include -#include - #include #include "Display.hpp" @@ -87,7 +85,8 @@ static void sigint(int) { case Parsing: longjmp(ctrlc_, 1); case Running: - throw "*** Ctrl-C"; + CYCancel(); + return; case Sending: return; case Waiting: @@ -240,7 +239,7 @@ static CYExpression *ParseExpression(CYUTF8String code) { static int client_; static char **Complete(const char *word, int start, int end) { - rl_attempted_completion_over = TRUE; + rl_attempted_completion_over = ~0; CYLocalPool pool; @@ -405,7 +404,8 @@ class History { ~History() { if (append_history$ != NULL) { - _syscall(close(_syscall(open(histfile_.c_str(), O_CREAT | O_WRONLY, 0600)))); + int fd(_syscall(open(histfile_.c_str(), O_CREAT | O_WRONLY, 0600))); + _syscall(close(fd)); _assert((*append_history$)(histlines_, histfile_.c_str()) == 0); } else { _assert(write_history(histfile_.c_str()) == 0); @@ -419,15 +419,18 @@ class History { }; static void Console(CYOptions &options) { - CYPool pool; - - passwd *passwd; - if (const char *username = getenv("LOGNAME")) - passwd = getpwnam(username); - else - passwd = getpwuid(getuid()); + std::string basedir; + if (const char *home = getenv("HOME")) + basedir = home; + else { + passwd *passwd; + if (const char *username = getenv("LOGNAME")) + passwd = getpwnam(username); + else + passwd = getpwuid(getuid()); + basedir = passwd->pw_dir; + } - std::string basedir(passwd->pw_dir); basedir += "/.cycript"; mkdir(basedir.c_str(), 0700); @@ -551,9 +554,9 @@ 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) { - cy::position begin(error->location_.begin); + CYPosition begin(error->location_.begin); if (begin.line != lines.size() || begin.column < lines.back().size() || error->warning_) { - cy::position end(error->location_.end); + CYPosition end(error->location_.end); if (begin.line != lines.size()) { std::cerr << " | "; @@ -606,14 +609,9 @@ static void Console(CYOptions &options) { } } -void InjectLibrary(pid_t pid); - -int Main(int argc, char const * const argv[], char const * const envp[]) { - _aprcall(apr_initialize()); - - apr_pool_t *pool; - apr_pool_create(&pool, NULL); +void InjectLibrary(pid_t, int, const char *[]); +int Main(int argc, char * const argv[], char const * const envp[]) { bool tty(isatty(STDIN_FILENO)); bool compile(false); bool target(false); @@ -628,29 +626,35 @@ int Main(int argc, char const * const argv[], char const * const envp[]) { const char *host(NULL); const char *port(NULL); - apr_getopt_t *state; - _aprcall(apr_getopt_init(&state, pool, argc, argv)); + optind = 1; for (;;) { - int opt; - const char *arg; - - apr_status_t status(apr_getopt_long(state, (apr_getopt_option_t[]) { - {NULL, 'c', false, NULL}, - {NULL, 'g', true, NULL}, - {NULL, 'n', true, NULL}, + int option(getopt_long(argc, argv, + "c" + "g:" + "n:" +#ifdef CY_ATTACH + "p:" +#endif + "r:" + "s" + , (const struct option[]) { + {NULL, no_argument, NULL, 'c'}, + {NULL, required_argument, NULL, 'g'}, + {NULL, required_argument, NULL, 'n'}, #ifdef CY_ATTACH - {NULL, 'p', true, NULL}, + {NULL, required_argument, NULL, 'p'}, #endif - {NULL, 'r', true, NULL}, - {NULL, 's', false, NULL}, - {0, 0, 0, 0}}, &opt, &arg)); + {NULL, required_argument, NULL, 'r'}, + {NULL, no_argument, NULL, 's'}, + {0, 0, 0, 0}}, NULL)); - switch (status) { - case APR_EOF: + switch (option) { + case -1: goto getopt; - case APR_BADCH: - case APR_BADARG: + + case ':': + case '?': fprintf(stderr, "usage: cycript [-c]" #ifdef CY_ATTACH @@ -660,11 +664,7 @@ int Main(int argc, char const * const argv[], char const * const envp[]) { " [