Browse Source

Fix Python 3 build

- Take care of the differences in handling unicode characters in
  `escape_string` (formerly in `editor/SCsub`, now in `compat.py)`.
- Conditionally include `_winreg` or `winreg` in the Mono editor
  module.
Matthias Hoelzl 7 years ago
parent
commit
727a381fc9
3 changed files with 36 additions and 13 deletions
  1. 29 0
      compat.py
  2. 2 12
      editor/SCsub
  3. 5 1
      modules/mono/mono_reg_utils.py

+ 29 - 0
compat.py

@@ -14,6 +14,17 @@ if sys.version_info < (3,):
         return x
     def iteritems(d):
         return d.iteritems()
+    def escape_string(s):
+        if isinstance(s, unicode):
+            s = s.encode('ascii')
+        result = ''
+        for c in s:
+            if not (32 <= ord(c) < 127) or c in ('\\', '"'):
+                result += '\\%03o' % ord(c)
+            else:
+                result += c
+        return result
+
 else:
     def isbasestring(s):
         return isinstance(s, (str, bytes))
@@ -29,3 +40,21 @@ else:
         return codecs.utf_8_encode(x)[0]
     def iteritems(d):
         return iter(d.items())
+    def charcode_to_c_escapes(c):
+        rev_result = []
+        while c >= 256:
+            c, low = (c // 256, c % 256)
+            rev_result.append('\\%03o' % low)
+        rev_result.append('\\%03o' % c)
+        return ''.join(reversed(rev_result))
+    def escape_string(s):
+        result = ''
+        if isinstance(s, str):
+            s = s.encode('utf-8')
+        for c in s:
+            if not(32 <= c < 127) or c in (ord('\\'), ord('"')):
+                result += charcode_to_c_escapes(c)
+            else:
+                result += chr(c)
+        return result
+

+ 2 - 12
editor/SCsub

@@ -4,18 +4,8 @@ Import('env')
 env.editor_sources = []
 
 import os
-from compat import encode_utf8, byte_to_str, open_utf8
-
-def escape_string(s, encoding='ascii'):
-    if isinstance(s, unicode):
-        s = s.encode(encoding)
-    result = ''
-    for c in s:
-        if not (32 <= ord(c) < 127) or c in ('\\', '"'):
-            result += '\\%03o' % ord(c)
-        else:
-            result += c
-    return result
+from compat import encode_utf8, byte_to_str, open_utf8, escape_string
+
 
 def make_certs_header(target, source, env):
 

+ 5 - 1
modules/mono/mono_reg_utils.py

@@ -1,7 +1,11 @@
 import os
 
 if os.name == 'nt':
-    import _winreg as winreg
+    import sys
+    if sys.version_info < (3,):
+        import _winreg as winreg
+    else:
+        import winreg
 
 
 def _reg_open_key(key, subkey):