+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 Write(bool syntax, const char *data, size_t size, std::ostream &out) {
+ if (syntax)
+ CYLexerHighlight(data, size, out);
+ else
+ out.write(data, size);
+}
+
+static void Output(bool syntax, CYUTF8String json, std::ostream *out, bool expand = 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] != '\''
+ )
+ Write(syntax, 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:
+ *out << std::endl;
+}
+
+static void Run(int client, bool syntax, const char *data, size_t size, std::ostream *out = NULL, bool expand = false) {
+ CYPool pool;
+ Output(syntax, Run(pool, client, CYUTF8String(data, size)), out, expand);