summaryrefslogtreecommitdiff
path: root/src/text/json_formatter.cpp
diff options
context:
space:
mode:
authorYongDo-Hyun <froster12@naver.com>2025-11-26 20:10:42 +0300
committerMehmet Samet Duman <yongdohyun@projecttick.org>2026-03-27 19:57:09 +0300
commitedbbe8dcfd30fcfe84f6b62240e22dbf9138677c (patch)
tree8b9c8edb939d573d76d6390535d3eacf4342e9c4 /src/text/json_formatter.cpp
parent687e43031df0dc641984b4256bcca50d5b3f7de3 (diff)
downloadProject-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.cpp29
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;
+ }
+ }
+ }
};
}