| 151 | } |
| 152 | |
| 153 | static size_t do_parse_string(wchar_t *dest, const wchar_t *source) { |
| 154 | bool dry_run = dest == nullptr; |
| 155 | wchar_t *res_string = dest; |
| 156 | while (*source != L'\0') { |
| 157 | const wchar_t *last_pos = source; |
| 158 | if (*source == '\\') { |
| 159 | ++source; |
| 160 | if (!match_special_char(!dry_run ? dest : nullptr, source)) { |
| 161 | source = last_pos; |
| 162 | if (!dry_run) |
| 163 | *dest = *source; |
| 164 | ++source; |
| 165 | ++dest; |
| 166 | } else { |
| 167 | ++dest; |
| 168 | } |
| 169 | } else { |
| 170 | if (!dry_run) |
| 171 | *dest = *source; |
| 172 | ++source; |
| 173 | ++dest; |
| 174 | } |
| 175 | } |
| 176 | if (!dry_run) |
| 177 | *dest = L'\0'; |
| 178 | return dest - res_string + 1; |
| 179 | } |
| 180 | |
| 181 | std::wstring parse_string(const wchar_t *source) { |
| 182 | auto size = do_parse_string(nullptr, source); |
no test coverage detected