From 49bb04ee64d719c83ae3f2ded4c9f9578707bd84 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Thu, 14 Apr 2016 14:20:25 +0100
Subject: [PATCH] py/makeqstrdata: Fix rendering of qstrs that have
 non-printable ASCII.

The qstr data needs to be turned into a proper C string so non-ASCII
chars must be properly escaped according to C rules.
---
 py/makeqstrdata.py | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/py/makeqstrdata.py b/py/makeqstrdata.py
index 4215ff301..7cad46e6e 100644
--- a/py/makeqstrdata.py
+++ b/py/makeqstrdata.py
@@ -106,9 +106,15 @@ def parse_input_headers(infiles):
 
 def make_bytes(cfg_bytes_len, cfg_bytes_hash, qstr):
     qhash = compute_hash(qstr, cfg_bytes_hash)
-    # Calculate len of str, taking escapes into account
-    qlen = len(qstr.replace("\\\\", "-").replace("\\", ""))
-    qdata = qstr.replace('"', '\\"')
+    if all(32 <= ord(c) <= 126 and c != '\\' for c in qstr):
+        # qstr is all printable ASCII so render it as-is (for easier debugging)
+        qlen = len(qstr)
+        qdata = qstr
+    else:
+        # qstr contains non-printable codes so render entire thing as hex pairs
+        qbytes = qstr.encode('utf8')
+        qlen = len(qbytes)
+        qdata = ''.join(('\\x%02x' % b) for b in qbytes)
     if qlen >= (1 << (8 * cfg_bytes_len)):
         print('qstr is too long:', qstr)
         assert False
-- 
GitLab