From 2785ee68f32492a24136261e2884a9ce03ff9c4a Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Thu, 11 Sep 2025 12:16:49 +0200 Subject: [PATCH] json: support any ASCII-compliant char type Signed-off-by: Simon Rozman --- include/stdex/json.hpp | 58 ++++++++++++------------------------------ 1 file changed, 16 insertions(+), 42 deletions(-) diff --git a/include/stdex/json.hpp b/include/stdex/json.hpp index 65268af51..b60f0fa72 100644 --- a/include/stdex/json.hpp +++ b/include/stdex/json.hpp @@ -7,6 +7,7 @@ #include "assert.hpp" #include "compat.hpp" +#include "string.hpp" #include namespace stdex @@ -20,50 +21,23 @@ namespace stdex /// \param[in] src Source string /// \param[in] num_chars Code unit limit in string `src` /// - template, class AX = std::allocator> + template, class AX = std::allocator> void escape( - _Inout_ std::basic_string& dst, - _In_reads_or_z_opt_(num_chars) const char* src, _In_ size_t num_chars = SIZE_MAX) + _Inout_ std::basic_string& dst, + _In_reads_or_z_opt_(num_chars) const T* src, _In_ size_t num_chars = SIZE_MAX) { - stdex_assert(src || !num_chars); - for (size_t i = 0; i < num_chars && src[i]; ++i) { + num_chars = stdex::strnlen(src, num_chars); + dst.reserve(dst.size() + num_chars + (num_chars >> 3)); + for (size_t i = 0; i < num_chars; ++i) { switch (src[i]) { - case '\"': dst += "\\\""; break; - case '\\': dst += "\\\\"; break; - case '/' : dst += "\\/"; break; - case '\b': dst += "\\b"; break; - case '\f': dst += "\\f"; break; - case '\n': dst += "\\n"; break; - case '\r': dst += "\\r"; break; - case '\t': dst += "\\t"; break; - default: dst += src[i]; break; - } - } - } - - /// - /// Appends escaped JSON string - /// - /// \param[in,out] dst String to append to - /// \param[in] src Source string - /// \param[in] num_chars Code unit limit in string `src` - /// - template, class AX = std::allocator> - void escape( - _Inout_ std::basic_string& dst, - _In_reads_or_z_opt_(num_chars) const wchar_t* src, _In_ size_t num_chars = SIZE_MAX) - { - stdex_assert(src || !num_chars); - for (size_t i = 0; i < num_chars && src[i]; ++i) { - switch (src[i]) { - case L'\"': dst += L"\\\""; break; - case L'\\': dst += L"\\\\"; break; - case L'/' : dst += L"\\/"; break; - case L'\b': dst += L"\\b"; break; - case L'\f': dst += L"\\f"; break; - case L'\n': dst += L"\\n"; break; - case L'\r': dst += L"\\r"; break; - case L'\t': dst += L"\\t"; break; + case '\"': dst += '\\'; dst += '"'; break; + case '\\': dst += '\\'; dst += '\\'; break; + case '/' : dst += '\\'; dst += '/'; break; + case '\b': dst += '\\'; dst += 'b'; break; + case '\f': dst += '\\'; dst += 'f'; break; + case '\n': dst += '\\'; dst += 'n'; break; + case '\r': dst += '\\'; dst += 'r'; break; + case '\t': dst += '\\'; dst += 't'; break; default: dst += src[i]; break; } } @@ -97,4 +71,4 @@ namespace stdex escape(dst, src.data(), src.size()); } } -} \ No newline at end of file +}