- if (json != NULL && fout != NULL) {
- if (!expand || json[0] != '"' && json[0] != '\'')
- fputs(json, fout);
- else for (size_t i(0); i != size; ++i)
- if (json[i] != '\\')
- fputc(json[i], fout);
- else switch(json[++i]) {
- case '\0': goto done;
- case '\\': fputc('\\', fout); break;
- case '\'': fputc('\'', fout); break;
- case '"': fputc('"', fout); break;
- case 'b': fputc('\b', fout); break;
- case 'f': fputc('\f', fout); break;
- case 'n': fputc('\n', fout); break;
- case 'r': fputc('\r', fout); break;
- case 't': fputc('\t', fout); break;
- case 'v': fputc('\v', fout); break;
- default: fputc('\\', fout); --i; break;
- }
+ return CYUTF8String(json, size);
+}
+
+static CYUTF8String Run(CYPool &pool, int client, const std::string &code) {
+ return Run(pool, client, CYUTF8String(code.c_str(), code.size()));
+}
+
+static std::ostream *out_;
+
+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;
+
+ CYLexerHighlight(data, size, *out);
+ *out << std::endl;
+}
+
+int (*append_history$)(int, const char *);
+
+static std::string command_;
+
+static int client_;
+
+static CYUTF8String Run(CYPool &pool, const std::string &code) {
+ return Run(pool, client_, code);
+}
+
+static char **Complete(const char *word, int start, int end) {
+ rl_attempted_completion_over = ~0;
+ std::string line(rl_line_buffer, start);
+ char **values(CYComplete(word, command_ + line, &Run));
+ mode_ = Parsing;
+ return values;
+}
+
+// need char *, not const char *
+static char name_[] = "cycript";
+static char break_[] = " \t\n\"\\'`@><=;|&{(" ")}" ".:[]";
+
+class History {
+ private:
+ std::string histfile_;
+ size_t histlines_;
+
+ public:
+ History(std::string histfile) :
+ histfile_(histfile),
+ histlines_(0)
+ {
+ read_history(histfile_.c_str());
+
+ for (HIST_ENTRY *history((history_set_pos(0), current_history())); history; history = next_history())
+ for (char *character(history->line); *character; ++character)
+ if (*character == '\x01') *character = '\n';
+ }