| 100 | } |
| 101 | |
| 102 | static std::pair<uint32_t, const char *> parse_char(const char * src) { |
| 103 | if (*src == '\\') { |
| 104 | switch (src[1]) { |
| 105 | case 'x': return parse_hex(src + 2, 2); |
| 106 | case 'u': return parse_hex(src + 2, 4); |
| 107 | case 'U': return parse_hex(src + 2, 8); |
| 108 | case 't': return std::make_pair('\t', src + 2); |
| 109 | case 'r': return std::make_pair('\r', src + 2); |
| 110 | case 'n': return std::make_pair('\n', src + 2); |
| 111 | case '\\': |
| 112 | case '"': |
| 113 | case '[': |
| 114 | case ']': |
| 115 | return std::make_pair(src[1], src + 2); |
| 116 | default: |
| 117 | throw std::runtime_error(std::string("unknown escape at ") + src); |
| 118 | } |
| 119 | } else if (*src) { |
| 120 | return decode_utf8(src); |
| 121 | } |
| 122 | throw std::runtime_error("unexpected end of input"); |
| 123 | } |
| 124 | |
| 125 | const char * parse_alternates( |
| 126 | parse_state & state, |
no test coverage detected