diff options
| author | YongDo-Hyun <froster12@naver.com> | 2025-11-26 20:10:42 +0300 |
|---|---|---|
| committer | Mehmet Samet Duman <yongdohyun@projecttick.org> | 2026-03-27 19:57:09 +0300 |
| commit | edbbe8dcfd30fcfe84f6b62240e22dbf9138677c (patch) | |
| tree | 8b9c8edb939d573d76d6390535d3eacf4342e9c4 /src/text/json_formatter.cpp | |
| parent | 687e43031df0dc641984b4256bcca50d5b3f7de3 (diff) | |
| download | Project-Tick-edbbe8dcfd30fcfe84f6b62240e22dbf9138677c.tar.gz Project-Tick-edbbe8dcfd30fcfe84f6b62240e22dbf9138677c.zip | |
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 <froster12@naver.com>
Diffstat (limited to 'src/text/json_formatter.cpp')
| -rw-r--r-- | src/text/json_formatter.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
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<unsigned char>(c) < 32 || c == 127) { + // Control characters, escape as \u00XX + os << "\\u00" << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(static_cast<unsigned char>(c)); + } else { + os << c; + } + break; + } + } + } }; } |
