From 43ddd89ba539e41459e3e83bcb088f8e2e575f8f Mon Sep 17 00:00:00 2001 From: Catherine Date: Wed, 8 May 2024 02:53:36 +0000 Subject: [PATCH] cxxrtl: fix `escape_c_string` hex literal fiasco. In C and C++, a `\x` escape sequence consumes as many hexadecimal digits as there are available, so it is not composable with arbitrary alnum characters afterwards. An octal escape sequence like `\000` always has fixed width, avoiding an issue where `\x01c` and `\x1c` produce the same string. --- backends/cxxrtl/cxxrtl_backend.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backends/cxxrtl/cxxrtl_backend.cc b/backends/cxxrtl/cxxrtl_backend.cc index 877a829d3..86fe9e81b 100644 --- a/backends/cxxrtl/cxxrtl_backend.cc +++ b/backends/cxxrtl/cxxrtl_backend.cc @@ -615,10 +615,11 @@ std::string escape_cxx_string(const std::string &input) output.push_back('\\'); output.push_back(c); } else { - char l = c & 0xf, h = (c >> 4) & 0xf; - output.append("\\x"); - output.push_back((h < 10 ? '0' + h : 'a' + h - 10)); - output.push_back((l < 10 ? '0' + l : 'a' + l - 10)); + char l = c & 0x3, m = (c >> 3) & 0x3, h = (c >> 6) & 0x3; + output.append("\\"); + output.push_back('0' + h); + output.push_back('0' + m); + output.push_back('0' + l); } } output.push_back('"');