mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
PR-URL: https://github.com/nodejs/node/pull/33722 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Richard Lau <riclau@uk.ibm.com> Reviewed-By: Zeyu Yang <himself65@outlook.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com>
67 lines
1.7 KiB
C++
67 lines
1.7 KiB
C++
#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) {
|
|
if (indent_depth <= 0) return str;
|
|
const std::string indent(indent_depth, ' ');
|
|
std::string out;
|
|
std::string::size_type pos = 0;
|
|
for (;;) {
|
|
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);
|
|
}
|
|
}
|
|
|
|
return out;
|
|
}
|
|
|
|
} // namespace node
|