X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/4e39dc0b33914636c16dbe0940a0876ada8a40fc..b24eb750dbfe92c587a1b219702b3bd12efd501b:/Console.cpp diff --git a/Console.cpp b/Console.cpp index fdfc054..7f97963 100644 --- a/Console.cpp +++ b/Console.cpp @@ -37,9 +37,6 @@ */ /* }}} */ -#define _GNU_SOURCE - -#include #include "cycript.hpp" #include @@ -66,6 +63,8 @@ #include #include +#include + static volatile enum { Working, Parsing, @@ -91,13 +90,39 @@ static void sigint(int) { } } +#if YYDEBUG +static bool bison_; +#endif +static bool strict_; +static bool pretty_; + +void Setup(CYDriver &driver, cy::parser &parser) { +#if YYDEBUG + if (bison_) + parser.set_debug_level(1); +#endif + if (strict_) + 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); @@ -207,8 +232,16 @@ static void Console(int socket) { } command += line; - for (char *state, *token(apr_strtok(line, "\n", &state)); token != NULL; token = apr_strtok(NULL, "\n", &state)) - lines.push_back(token); + + char *begin(line), *end(line + strlen(line)); + while (char *nl = reinterpret_cast(memchr(begin, '\n', end - begin))) { + *nl = '\0'; + lines.push_back(begin); + begin = nl + 1; + } + + lines.push_back(begin); + free(line); std::string code; @@ -218,6 +251,7 @@ static void Console(int socket) { else { CYDriver driver(""); cy::parser parser(driver); + Setup(driver, parser); driver.data_ = command.c_str(); driver.size_ = command.size(); @@ -225,7 +259,7 @@ static void Console(int socket) { 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); - if (begin.line != lines.size() || begin.column - 1 != lines.back().size()) { + if (begin.line != lines.size() || begin.column - 1 != lines.back().size() || error->warning_) { cy::position end(error->location_.end); if (begin.line != lines.size()) { @@ -233,7 +267,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) @@ -257,14 +291,16 @@ static void Console(int socket) { goto read; } - if (driver.source_ == NULL) + if (driver.program_ == NULL) goto restart; if (socket != -1) code = command; else { std::ostringstream str; - driver.source_->Show(str); + CYOutput out(str); + Setup(out, driver); + out << *driver.program_; code = str.str(); } } @@ -298,52 +334,131 @@ static void *Map(const char *path, size_t *psize) { return base; } -int main(int argc, char *argv[]) { +int main(int argc, char const * const argv[], char const * const envp[]) { + _aprcall(apr_app_initialize(&argc, &argv, &envp)); + bool tty(isatty(STDIN_FILENO)); + bool compile(false); + +#ifdef CY_ATTACH pid_t pid(_not(pid_t)); +#endif - for (;;) switch (getopt(argc, argv, "p:")) { - case -1: - goto getopt; - case '?': - fprintf(stderr, "usage: cycript [-p ] [