From 5985e41afca9d440dd932ab512c23dbc1e002499 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Fri, 13 May 2016 13:12:01 +0100
Subject: [PATCH] tools/make-frozen.py: Properly escape hex chars when making C
 strings.

---
 tools/make-frozen.py | 34 +++++++++++++++++++++++++++-------
 1 file changed, 27 insertions(+), 7 deletions(-)

diff --git a/tools/make-frozen.py b/tools/make-frozen.py
index 84e589b98..28829ec74 100755
--- a/tools/make-frozen.py
+++ b/tools/make-frozen.py
@@ -53,11 +53,31 @@ print("};")
 print("const char mp_frozen_str_content[] = {")
 for f, st in modules:
     data = open(sys.argv[1] + "/" + f, "rb").read()
-    # Python2 vs Python3 tricks
-    data = repr(data)
-    if data[0] == "b":
-        data = data[1:]
-    data = data[1:-1]
-    data = data.replace('"', '\\"')
-    print('"%s\\0"' % data)
+
+    # We need to properly escape the script data to create a C string.
+    # When C parses hex characters of the form \x00 it keeps parsing the hex
+    # data until it encounters a non-hex character.  Thus one must create
+    # strings of the form "data\x01" "abc" to properly encode this kind of
+    # data.  We could just encode all characters as hex digits but it's nice
+    # to be able to read the resulting C code as ASCII when possible.
+
+    data = bytearray(data) # so Python2 extracts each byte as an integer
+    esc_dict = {ord('\n'): '\\n', ord('\r'): '\\r', ord('"'): '\\"', ord('\\'): '\\\\'}
+    chrs = ['"']
+    break_str = False
+    for c in data:
+        try:
+            chrs.append(esc_dict[c])
+        except KeyError:
+            if 32 <= c <= 126:
+                if break_str:
+                    chrs.append('" "')
+                    break_str = False
+                chrs.append(chr(c))
+            else:
+                chrs.append('\\x%02x' % c)
+                break_str = True
+    chrs.append('\\0"')
+    print(''.join(chrs))
+
 print("};")
-- 
GitLab