From edbbe8dcfd30fcfe84f6b62240e22dbf9138677c Mon Sep 17 00:00:00 2001 From: YongDo-Hyun Date: Wed, 26 Nov 2025 20:10:42 +0300 Subject: feat: add local test executable and improve JSON string escaping - Added option to build a local test executable for value assignments. - Enhanced JSON string formatting by escaping special characters. - Updated README with build instructions and prerequisites. - Modified .gitignore to include .vscode directory. - Added file read/write tests in format_test.cpp. - Refactored value assignment logic to reduce code duplication. Signed-off-by: YongDo-Hyun --- src/text/json_formatter.cpp | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'src/text') diff --git a/src/text/json_formatter.cpp b/src/text/json_formatter.cpp index efa807f58c..bd882c15d2 100644 --- a/src/text/json_formatter.cpp +++ b/src/text/json_formatter.cpp @@ -71,7 +71,11 @@ namespace //anonymous { os << "[" << ba.size() << " bytes]"; } void visit(const tag_string& s) override - { os << '"' << s.get() << '"'; } //TODO: escape special characters + { + os << '"'; + write_escaped_string(s.get()); + os << '"'; + } void visit(const tag_list& l) override { @@ -198,6 +202,29 @@ namespace //anonymous { os << "null"; } + + void write_escaped_string(const std::string& str) + { + for (char c : str) { + switch (c) { + case '"': os << "\\\""; break; + case '\\': os << "\\\\"; break; + case '\b': os << "\\b"; break; + case '\f': os << "\\f"; break; + case '\n': os << "\\n"; break; + case '\r': os << "\\r"; break; + case '\t': os << "\\t"; break; + default: + if (static_cast(c) < 32 || c == 127) { + // Control characters, escape as \u00XX + os << "\\u00" << std::hex << std::setw(2) << std::setfill('0') << static_cast(static_cast(c)); + } else { + os << c; + } + break; + } + } + } }; } -- cgit 0.0.5-2-1-g0f52