-/* Cycript - Remove Execution Server and Disassembler
+/* Cycript - Inlining/Optimizing JavaScript Compiler
* Copyright (C) 2009 Jay Freeman (saurik)
*/
#include "cycript.hpp"
+#ifdef CY_EXECUTE
+#include "JavaScript.hpp"
+#endif
+
#include <cstdio>
#include <sstream>
#include <setjmp.h>
+#ifdef HAVE_READLINE_H
+#include <readline.h>
+#else
#include <readline/readline.h>
+#endif
+
+#ifdef HAVE_HISTORY_H
+#include <history.h>
+#else
#include <readline/history.h>
+#endif
#include <sys/mman.h>
#include <apr_getopt.h>
+#include <dlfcn.h>
+
static volatile enum {
Working,
Parsing,
driver.strict_ = true;
}
-void Setup(CYOutput &out, CYDriver &driver) {
+void Setup(CYOutput &out, CYDriver &driver, CYOptions &options) {
out.pretty_ = pretty_;
-
- CYContext context(driver.pool_);
+ CYContext context(driver.pool_, options);
driver.program_->Replace(context);
}
Run(client, code.c_str(), code.size(), fout, expand);
}
-static void Console(apr_pool_t *pool, int client) {
+int (*append_history$)(int, const char *);
+
+static void Console(apr_pool_t *pool, int client, CYOptions &options) {
passwd *passwd;
if (const char *username = getenv("LOGNAME"))
passwd = getpwnam(username);
mode_ = Working;
if (line == NULL)
break;
+ if (line[0] == '\0')
+ goto read;
if (!extra) {
extra = true;
code = command;
else {
std::ostringstream str;
- CYOutput out(str);
- Setup(out, driver);
+ CYOutput out(str, options);
+ Setup(out, driver, options);
out << *driver.program_;
code = str.str();
}
Run(client, code, fout, expand);
}
- _syscall(close(_syscall(open(histfile, O_CREAT | O_WRONLY, 0600))));
- append_history(histlines, histfile);
+ if (append_history$ != NULL) {
+ _syscall(close(_syscall(open(histfile, O_CREAT | O_WRONLY, 0600))));
+ (*append_history$)(histlines, histfile);
+ } else {
+ write_history(histfile);
+ }
fputs("\n", fout);
fflush(fout);
int Main(int argc, char const * const argv[], char const * const envp[]) {
bool tty(isatty(STDIN_FILENO));
bool compile(false);
+ CYOptions options;
+
+ append_history$ = reinterpret_cast<int (*)(int, const char *)>(dlsym(RTLD_DEFAULT, "append_history"));
#ifdef CY_ATTACH
pid_t pid(_not(pid_t));
case 'g':
if (false);
+ else if (strcmp(arg, "rename") == 0)
+ options.verbose_ = true;
#if YYDEBUG
else if (strcmp(arg, "bison") == 0)
bison_ = true;
#endif
if (script == NULL && tty)
- Console(pool, client);
+ Console(pool, client, options);
else {
CYDriver driver(script ?: "<stdin>");
cy::parser parser(driver);
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)
- if (client != -1)
- Run(client, start, end - start, stdout);
- else {
+ if (client != -1) {
+ std::string code(start, end-start);
+ Run(client, code, stdout);
+ } else {
std::ostringstream str;
- CYOutput out(str);
- Setup(out, driver);
+ CYOutput out(str, options);
+ Setup(out, driver, options);
out << *driver.program_;
std::string code(str.str());
if (compile)
int main(int argc, char const * const argv[], char const * const envp[]) {
apr_status_t status(apr_app_initialize(&argc, &argv, &envp));
+
if (status != APR_SUCCESS) {
fprintf(stderr, "apr_app_initialize() != APR_SUCCESS\n");
return 1;