Просмотр исходного кода

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
Kerfuffle 2 лет назад
Родитель
Сommit
d9ccce2e33
1 измененных файлов с 13 добавлено и 0 удалено
  1. 13 0
      common/common.cpp

+ 13 - 0
common/common.cpp

@@ -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 '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++] = '\\';
                            input[output_idx++] = input[input_idx]; break;
             }