#include <mach/mach_time.h>
#endif
+#include "Code.hpp"
#include "Driver.hpp"
#include "Error.hpp"
#include "Highlight.hpp"
static std::ostream *out_;
-static void Output(CYUTF8String json, std::ostream *out, bool expand = false) {
+static void Output(CYUTF8String json, std::ostream *out, bool reparse = false) {
+ CYPool pool;
+
+ if (reparse) do {
+ CYStream stream(json.data, json.data + json.size);
+ CYDriver driver(pool, stream);
+ if (driver.Parse(CYMarkExpression))
+ break;
+ std::stringbuf str;
+ CYOptions options;
+ CYOutput out(str, options);
+ out.pretty_ = true;
+ out << *driver.context_;
+ std::string data(str.str());
+ json = CYPoolUTF8String(pool, data);
+ if (json.size == 0)
+ json.data = NULL;
+ } while (false);
+
const char *data(json.data);
size_t size(json.size);
if (data == NULL || out == NULL)
return;
- if (!expand ||
- data[0] != '@' && data[0] != '"' && data[0] != '\'' ||
- data[0] == '@' && data[1] != '"' && data[1] != '\''
- )
- CYLexerHighlight(data, size, *out);
- else for (size_t i(0); i != size; ++i)
- if (data[i] != '\\')
- *out << data[i];
- else switch(data[++i]) {
- case '\0': goto done;
- case '\\': *out << '\\'; break;
- case '\'': *out << '\''; break;
- case '"': *out << '"'; break;
- case 'b': *out << '\b'; break;
- case 'f': *out << '\f'; break;
- case 'n': *out << '\n'; break;
- case 'r': *out << '\r'; break;
- case 't': *out << '\t'; break;
- case 'v': *out << '\v'; break;
- default: *out << '\\'; --i; break;
- }
-
- done:
+ CYLexerHighlight(data, size, *out);
*out << std::endl;
}
} }
void operator +=(std::string command) {
+ if (HIST_ENTRY *entry = history_get(where_history()))
+ if (command == entry->line)
+ return;
add_history(command.c_str());
++histlines_;
}
CYConsoleRemapKeys(vi_movement_keymap);
}
-static void CYOutputRun(const std::string &code, bool expand = false) {
+static void CYOutputRun(const std::string &code, bool reparse = false) {
CYPool pool;
- Output(Run(pool, client_, code), &std::cout, expand);
+ Output(Run(pool, client_, code), &std::cout, reparse);
}
static void Console(CYOptions &options) {
bool bypass(false);
bool debug(false);
- bool expand(false);
bool lower(true);
+ bool reparse(false);
out_ = &std::cout;
CYOutputRun("");
- struct sigaction action;
- sigemptyset(&action.sa_mask);
- action.sa_handler = &sigint;
- action.sa_flags = 0;
- sigaction(SIGINT, &action, NULL);
-
for (;;) {
+ struct sigaction action;
+ sigemptyset(&action.sa_mask);
+ action.sa_handler = &sigint;
+ action.sa_flags = 0;
+ sigaction(SIGINT, &action, NULL);
+
if (setjmp(ctrlc_) != 0) {
mode_ = Working;
*out_ << std::endl;
*out_ << "done." << std::endl;
} else if (data == "exit") {
return;
- } else if (data == "expand") {
- expand = !expand;
- *out_ << "expand == " << (expand ? "true" : "false") << std::endl;
} else if (data == "lower") {
lower = !lower;
*out_ << "lower == " << (lower ? "true" : "false") << std::endl;
+ } else if (data == "reparse") {
+ reparse = !reparse;
+ *out_ << "reparse == " << (reparse ? "true" : "false") << std::endl;
}
continue;
std::cout << std::endl;
}
- CYOutputRun(code, expand);
+ CYOutputRun(code, reparse);
}
}
const char *host(NULL);
const char *port(NULL);
+ const char *argv0(argv[0]);
+
optind = 1;
for (;;) {
if (argc == 0)
script = NULL;
else {
-#ifdef CY_EXECUTE
- // XXX: const_cast?! wtf gcc :(
- CYSetArgs(argc - 1, const_cast<const char **>(argv + 1));
-#endif
script = argv[0];
if (strcmp(script, "-") == 0)
script = NULL;
+ --argc;
+ ++argv;
}
+#ifdef CY_EXECUTE
+ // XXX: const_cast?! wtf gcc :(
+ CYSetArgs(argv0, script, argc, const_cast<const char **>(argv));
+#endif
+
#ifdef CY_ATTACH
if (pid == _not(pid_t))
client_ = -1;
return 0;
}
-int main(int argc, char * const argv[], char const * const envp[]) {
+_visible int main(int argc, char * const argv[], char const * const envp[]) {
try {
return Main(argc, argv, envp);
} catch (const CYException &error) {