8#include <yaml-cpp/yaml.h>
11#define YAML_HEX(num) YAML::Hex << (num) << YAML::Dec
12#define FORMAT_HEX(x, w) \
13 std::hex << std::uppercase << std::setfill('0') << std::setw(w) << x << std::nouppercase << std::dec
18inline void EmitText(YAML::Emitter& out,
const std::string& str) {
19 const char* s = str.c_str();
21 for (
const char* p = s; *p !=
'\0'; p++) {
22 if (
static_cast<uint8_t
>(*p) < 0x20 ||
static_cast<uint8_t
>(*p) > 0x7E || *p ==
'\\') {
28 out << YAML::DoubleQuoted << s;
32 for (
const char* p = s; *p !=
'\0'; p++) {
33 const auto c =
static_cast<uint8_t
>(*p);
36 }
else if (c < 0x20 || c > 0x7E) {
38 std::snprintf(buf,
sizeof(buf),
"\\x%02X", c);
41 escaped +=
static_cast<char>(c);
44 out << YAML::SingleQuoted << escaped;
48inline std::string DecodeText(
const std::string& str) {
50 out.reserve(str.size());
51 for (
size_t i = 0; i < str.size(); i++) {
52 if (str[i] ==
'\\' && i + 1 < str.size()) {
53 if (str[i + 1] ==
'\\') {
58 if ((str[i + 1] ==
'x' || str[i + 1] ==
'X') && i + 3 < str.size() &&
59 std::isxdigit(
static_cast<unsigned char>(str[i + 2])) &&
60 std::isxdigit(
static_cast<unsigned char>(str[i + 3]))) {
61 out +=
static_cast<char>(std::stoi(str.substr(i + 2, 2),
nullptr, 16));