1 #include "json_utils.h"
2
3 namespace node {
4
EscapeJsonChars(const std::string & str)5 std::string EscapeJsonChars(const std::string& str) {
6 const std::string control_symbols[0x20] = {
7 "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005",
8 "\\u0006", "\\u0007", "\\b", "\\t", "\\n", "\\v", "\\f", "\\r",
9 "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012", "\\u0013",
10 "\\u0014", "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019",
11 "\\u001a", "\\u001b", "\\u001c", "\\u001d", "\\u001e", "\\u001f"
12 };
13
14 std::string ret;
15 size_t last_pos = 0;
16 size_t pos = 0;
17 for (; pos < str.size(); ++pos) {
18 std::string replace;
19 char ch = str[pos];
20 if (ch == '\\') {
21 replace = "\\\\";
22 } else if (ch == '\"') {
23 replace = "\\\"";
24 } else {
25 size_t num = static_cast<size_t>(ch);
26 if (num < 0x20) replace = control_symbols[num];
27 }
28 if (!replace.empty()) {
29 if (pos > last_pos) {
30 ret += str.substr(last_pos, pos - last_pos);
31 }
32 last_pos = pos + 1;
33 ret += replace;
34 }
35 }
36 // Append any remaining symbols.
37 if (last_pos < str.size()) {
38 ret += str.substr(last_pos, pos - last_pos);
39 }
40 return ret;
41 }
42
Reindent(const std::string & str,int indent_depth)43 std::string Reindent(const std::string& str, int indent_depth) {
44 if (indent_depth <= 0) return str;
45 const std::string indent(indent_depth, ' ');
46 std::string out;
47 std::string::size_type pos = 0;
48 for (;;) {
49 std::string::size_type prev_pos = pos;
50 pos = str.find('\n', pos);
51
52 out.append(indent);
53
54 if (pos == std::string::npos) {
55 out.append(str, prev_pos, std::string::npos);
56 break;
57 } else {
58 pos++;
59 out.append(str, prev_pos, pos - prev_pos);
60 }
61 }
62
63 return out;
64 }
65
66 } // namespace node
67