Convert a raw quoted string token (including surrounding quotes) to bytes.
| 22 | |
| 23 | // Convert a raw quoted string token (including surrounding quotes) to bytes. |
| 24 | std::string ParseContext::parse_string_to_bytes(const std::string& raw) { |
| 25 | // strip surrounding quotes |
| 26 | std::string str = raw.substr(1, raw.size() - 2); |
| 27 | std::string datastr; |
| 28 | for (auto it = str.begin(); it != str.end(); it = std::next(it)) { |
| 29 | if (*it != '\\') { datastr += *it; continue; } |
| 30 | it = std::next(it); |
| 31 | switch (*it) { |
| 32 | case 't': datastr += '\t'; break; |
| 33 | case 'n': datastr += '\n'; break; |
| 34 | case 'r': datastr += '\r'; break; |
| 35 | case '"': datastr += '"'; break; |
| 36 | case '\'': datastr += '\''; break; |
| 37 | case '\\': datastr += '\\'; break; |
| 38 | case 'u': { |
| 39 | it = std::next(it, 2); // skip 'u{' |
| 40 | std::string valstr; |
| 41 | while (*it != '}') { valstr += *it; it = std::next(it); } |
| 42 | u32_t val = std::stoul(removeUnderscore(valstr), nullptr, 16); |
| 43 | if (val == 0) { datastr += '\0'; } |
| 44 | else { while (val) { datastr += (char)(val & 0xff); val >>= 8; } } |
| 45 | } break; |
| 46 | default: { |
| 47 | datastr += (char)std::stoi(std::string() + *it + *std::next(it), nullptr, 16); |
| 48 | it = std::next(it); |
| 49 | } break; |
| 50 | } |
| 51 | } |
| 52 | return datastr; |
| 53 | } |
| 54 | |
| 55 | // ── Constructor / entry point ──────────────────────────────────────────────── |
| 56 |
nothing calls this directly
no test coverage detected