• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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