diff options
author | Anna Henningsen <anna@addaleax.net> | 2020-03-29 20:11:56 +0200 |
---|---|---|
committer | Beth Griggs <Bethany.Griggs@uk.ibm.com> | 2020-04-07 16:25:13 +0100 |
commit | f693dbdfb47e5a20e0bed313d10f8d5463e841a2 (patch) | |
tree | 335986611e1bb9770f01c4156d06116ad7c99992 /src/json_utils.cc | |
parent | 9ba0cbd8e019a144c89ce97ed88c7bda755b64e5 (diff) | |
download | node-new-f693dbdfb47e5a20e0bed313d10f8d5463e841a2.tar.gz |
src: move JSONWriter into its own file
The JSONWriter feature is not inherently related to the report
feature in any way.
As a drive-by fix, remove a number of unused header includes.
PR-URL: https://github.com/nodejs/node/pull/32552
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Richard Lau <riclau@uk.ibm.com>
Diffstat (limited to 'src/json_utils.cc')
-rw-r--r-- | src/json_utils.cc | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/json_utils.cc b/src/json_utils.cc new file mode 100644 index 0000000000..aa03a6d730 --- /dev/null +++ b/src/json_utils.cc @@ -0,0 +1,67 @@ +#include "json_utils.h" + +namespace node { + +std::string EscapeJsonChars(const std::string& str) { + const std::string control_symbols[0x20] = { + "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", + "\\u0006", "\\u0007", "\\b", "\\t", "\\n", "\\v", "\\f", "\\r", + "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013", + "\\u0014", "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", + "\\u001a", "\\u001b", "\\u001c", "\\u001d", "\\u001e", "\\u001f" + }; + + std::string ret; + size_t last_pos = 0; + size_t pos = 0; + for (; pos < str.size(); ++pos) { + std::string replace; + char ch = str[pos]; + if (ch == '\\') { + replace = "\\\\"; + } else if (ch == '\"') { + replace = "\\\""; + } else { + size_t num = static_cast<size_t>(ch); + if (num < 0x20) replace = control_symbols[num]; + } + if (!replace.empty()) { + if (pos > last_pos) { + ret += str.substr(last_pos, pos - last_pos); + } + last_pos = pos + 1; + ret += replace; + } + } + // Append any remaining symbols. + if (last_pos < str.size()) { + ret += str.substr(last_pos, pos - last_pos); + } + return ret; +} + +std::string Reindent(const std::string& str, int indent_depth) { + std::string indent; + for (int i = 0; i < indent_depth; i++) indent += ' '; + + std::string out; + std::string::size_type pos = 0; + do { + std::string::size_type prev_pos = pos; + pos = str.find('\n', pos); + + out.append(indent); + + if (pos == std::string::npos) { + out.append(str, prev_pos, std::string::npos); + break; + } else { + pos++; + out.append(str, prev_pos, pos - prev_pos); + } + } while (true); + + return out; +} + +} // namespace node |