X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/e818f0e07214ed24416c7aedf63d2972e42b9ca4..313708a920160155c9b9fa15e3337fbe2457ee58:/Console.cpp diff --git a/Console.cpp b/Console.cpp index c377db2..569157a 100644 --- a/Console.cpp +++ b/Console.cpp @@ -37,9 +37,6 @@ */ /* }}} */ -#define _GNU_SOURCE - -#include #include "cycript.hpp" #include @@ -65,6 +62,9 @@ #include #include #include +#include + +#include static volatile enum { Working, @@ -95,6 +95,7 @@ static void sigint(int) { static bool bison_; #endif static bool strict_; +static bool pretty_; void Setup(CYDriver &driver, cy::parser &parser) { #if YYDEBUG @@ -105,13 +106,24 @@ void Setup(CYDriver &driver, cy::parser &parser) { driver.strict_ = true; } +void Setup(CYOutput &out, CYDriver &driver) { + out.pretty_ = pretty_; + + CYContext context(driver.pool_); + driver.program_->Replace(context); +} + void Run(int socket, const char *data, size_t size, FILE *fout = NULL, bool expand = false) { CYPool pool; const char *json; if (socket == -1) { mode_ = Running; +#ifdef CY_EXECUTE json = CYExecute(pool, data); +#else + json = NULL; +#endif mode_ = Working; if (json != NULL) size = strlen(json); @@ -162,7 +174,20 @@ void Run(int socket, std::string &code, FILE *fout = NULL, bool expand = false) Run(socket, code.c_str(), code.size(), fout, expand); } -static void Console(int socket) { +static void Console(apr_pool_t *pool, int socket) { + passwd *passwd; + if (const char *username = getenv("LOGNAME")) + passwd = getpwnam(username); + else + passwd = getpwuid(getuid()); + + const char *basedir(apr_psprintf(pool, "%s/.cycript", passwd->pw_dir)); + const char *histfile(apr_psprintf(pool, "%s/history", basedir)); + size_t histlines(0); + + mkdir(basedir, 0700); + read_history(histfile); + bool bypass(false); bool debug(false); bool expand(false); @@ -216,6 +241,7 @@ static void Console(int socket) { fflush(fout); } add_history(line); + ++histlines; goto restart; } } @@ -256,7 +282,7 @@ static void Console(int socket) { std::cerr << lines[begin.line - 1] << std::endl; } - std::cerr << " | "; + std::cerr << "...."; for (size_t i(0); i != begin.column - 1; ++i) std::cerr << '.'; if (begin.line != end.line || begin.column == end.column) @@ -269,6 +295,7 @@ static void Console(int socket) { std::cerr << error->message_ << std::endl; add_history(command.c_str()); + ++histlines; goto restart; } } @@ -288,12 +315,14 @@ static void Console(int socket) { else { std::ostringstream str; CYOutput out(str); - driver.program_->Multiple(out); + Setup(out, driver); + out << *driver.program_; code = str.str(); } } add_history(command.c_str()); + ++histlines; if (debug) std::cout << code << std::endl; @@ -301,6 +330,9 @@ static void Console(int socket) { Run(socket, code, fout, expand); } + _syscall(close(_syscall(open(histfile, O_CREAT | O_WRONLY, 0600)))); + append_history(histlines, histfile); + fputs("\n", fout); fflush(fout); } @@ -322,52 +354,140 @@ static void *Map(const char *path, size_t *psize) { return base; } -int main(int argc, char *argv[]) { +void InjectLibrary(pid_t pid); + +int Main(int argc, char const * const argv[], char const * const envp[]) { bool tty(isatty(STDIN_FILENO)); - pid_t pid(_not(pid_t)); bool compile(false); - for (;;) switch (getopt(argc, argv, "cg:p:s")) { - case -1: - goto getopt; - case '?': - fprintf(stderr, "usage: cycript [-c] [-p ] [