# HG changeset patch # User Paul Boddie # Date 1484068860 -3600 # Node ID a367d172b01e1e518634554b721e1b1e8171c31c # Parent 125819c2936b8b29f499234fb5618cfcca2a056b Encode non-ASCII values to avoid C compiler reinterpretation of string literals. diff -r 125819c2936b -r a367d172b01e encoders.py --- a/encoders.py Mon Jan 09 23:02:52 2017 +0100 +++ b/encoders.py Tue Jan 10 18:21:00 2017 +0100 @@ -337,7 +337,19 @@ if isinstance(value, (int, float)): return str(value) else: - return '"%s"' % str(value).replace('"', '\\"').replace("\n", "\\n").replace("\t", "\\t").replace("\r", "\\r") + l = [] + + # Encode characters including non-ASCII ones. + + for c in str(value): + if c == '"': l.append('\\"') + elif c == '\n': l.append('\\n') + elif c == '\t': l.append('\\t') + elif c == '\r': l.append('\\r') + elif 0x20 <= ord(c) < 0x80: l.append(c) + else: l.append("\\x%02x" % ord(c)) + + return '"%s"' % "".join(l) def encode_literal_data_initialiser(style):