summaryrefslogtreecommitdiff
path: root/src/json_utils.cc
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2020-03-29 20:11:56 +0200
committerBeth Griggs <Bethany.Griggs@uk.ibm.com>2020-04-07 16:25:13 +0100
commitf693dbdfb47e5a20e0bed313d10f8d5463e841a2 (patch)
tree335986611e1bb9770f01c4156d06116ad7c99992 /src/json_utils.cc
parent9ba0cbd8e019a144c89ce97ed88c7bda755b64e5 (diff)
downloadnode-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.cc67
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