Allow common process_escapes to handle \x sequences (#3928)

* Allow common process_escapes to handle \x sequences

* Fix edge case when second hex digit is NUL
This commit is contained in:
Kerfuffle 2023-11-05 10:06:06 -07:00 committed by GitHub
parent bb60fd0bf6
commit d9ccce2e33
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -90,6 +90,19 @@ void process_escapes(std::string& input) {
case '\'': input[output_idx++] = '\''; break; case '\'': input[output_idx++] = '\''; break;
case '\"': input[output_idx++] = '\"'; break; case '\"': input[output_idx++] = '\"'; break;
case '\\': input[output_idx++] = '\\'; break; case '\\': input[output_idx++] = '\\'; break;
case 'x':
// Handle \x12, etc
if (input_idx + 2 < input_len) {
const char x[3] = { input[input_idx + 1], input[input_idx + 2], 0 };
char *err_p = nullptr;
const long val = std::strtol(x, &err_p, 16);
if (err_p == x + 2) {
input_idx += 2;
input[output_idx++] = char(val);
break;
}
// Intentionally fall through to default.
}
default: input[output_idx++] = '\\'; default: input[output_idx++] = '\\';
input[output_idx++] = input[input_idx]; break; input[output_idx++] = input[input_idx]; break;
} }