Files
main/programming/language/python3/python3-idle/files/gentoo/0006-h2py-use-binary-I-O-to-avoid-encoding-issues.patch
2021-10-18 18:03:22 +03:00

187 lines
7.0 KiB
Diff

From 5260345d0d7acefb91590212d8d629abe9eb1538 Mon Sep 17 00:00:00 2001
From: Mike Gilbert <floppym@gentoo.org>
Date: Fri, 5 Jan 2018 13:40:40 -0500
Subject: [PATCH 06/16] h2py: use binary I/O to avoid encoding issues
https://bugs.python.org/issue13032
---
Tools/scripts/h2py.py | 67 ++++++++++++++++++++++---------------------
1 file changed, 34 insertions(+), 33 deletions(-)
diff --git a/Tools/scripts/h2py.py b/Tools/scripts/h2py.py
index ea37c04d4c..aabea34697 100755
--- a/Tools/scripts/h2py.py
+++ b/Tools/scripts/h2py.py
@@ -23,36 +23,36 @@
import sys, re, getopt, os
-p_define = re.compile(r'^[\t ]*#[\t ]*define[\t ]+([a-zA-Z0-9_]+)[\t ]+')
+p_define = re.compile(br'^[\t ]*#[\t ]*define[\t ]+([a-zA-Z0-9_]+)[\t ]+')
p_macro = re.compile(
- r'^[\t ]*#[\t ]*define[\t ]+'
- r'([a-zA-Z0-9_]+)\(([_a-zA-Z][_a-zA-Z0-9]*)\)[\t ]+')
+ br'^[\t ]*#[\t ]*define[\t ]+'
+ br'([a-zA-Z0-9_]+)\(([_a-zA-Z][_a-zA-Z0-9]*)\)[\t ]+')
-p_include = re.compile(r'^[\t ]*#[\t ]*include[\t ]+<([^>\n]+)>')
+p_include = re.compile(br'^[\t ]*#[\t ]*include[\t ]+<([^>\n]+)>')
-p_comment = re.compile(r'/\*([^*]+|\*+[^/])*(\*+/)?')
-p_cpp_comment = re.compile('//.*')
+p_comment = re.compile(br'/\*([^*]+|\*+[^/])*(\*+/)?')
+p_cpp_comment = re.compile(b'//.*')
ignores = [p_comment, p_cpp_comment]
-p_char = re.compile(r"'(\\.[^\\]*|[^\\])'")
+p_char = re.compile(br"'(\\.[^\\]*|[^\\])'")
-p_hex = re.compile(r"0x([0-9a-fA-F]+)L?")
+p_hex = re.compile(br"0x([0-9a-fA-F]+)L?")
filedict = {}
importable = {}
try:
- searchdirs=os.environ['include'].split(';')
+ searchdirs=os.environb[b'include'].split(b';')
except KeyError:
try:
- searchdirs=os.environ['INCLUDE'].split(';')
+ searchdirs=os.environb[b'INCLUDE'].split(b';')
except KeyError:
- searchdirs=['/usr/include']
+ searchdirs=[b'/usr/include']
try:
- searchdirs.insert(0, os.path.join('/usr/include',
- os.environ['MULTIARCH']))
+ searchdirs.insert(0, os.path.join(b'/usr/include',
+ os.environb[b'MULTIARCH']))
except KeyError:
pass
@@ -61,22 +61,23 @@ def main():
opts, args = getopt.getopt(sys.argv[1:], 'i:')
for o, a in opts:
if o == '-i':
- ignores.append(re.compile(a))
+ ignores.append(re.compile(a.encode()))
if not args:
args = ['-']
for filename in args:
if filename == '-':
sys.stdout.write('# Generated by h2py from stdin\n')
- process(sys.stdin, sys.stdout)
+ process(sys.stdin.buffer, sys.stdout.buffer)
else:
- with open(filename) as fp:
+ filename = filename.encode()
+ with open(filename, 'rb') as fp:
outfile = os.path.basename(filename)
- i = outfile.rfind('.')
+ i = outfile.rfind(b'.')
if i > 0: outfile = outfile[:i]
modname = outfile.upper()
- outfile = modname + '.py'
- with open(outfile, 'w') as outfp:
- outfp.write('# Generated by h2py from %s\n' % filename)
+ outfile = modname + b'.py'
+ with open(outfile, 'wb') as outfp:
+ outfp.write(b'# Generated by h2py from %s\n' % filename)
filedict = {}
for dir in searchdirs:
if filename[:len(dir)] == dir:
@@ -88,9 +89,9 @@ def main():
def pytify(body):
# replace ignored patterns by spaces
for p in ignores:
- body = p.sub(' ', body)
+ body = p.sub(b' ', body)
# replace char literals by ord(...)
- body = p_char.sub("ord('\\1')", body)
+ body = p_char.sub(b"ord('\\1')", body)
# Compute negative hexadecimal constants
start = 0
UMAX = 2*(sys.maxsize+1)
@@ -101,7 +102,7 @@ def pytify(body):
val = int(body[slice(*m.span(1))], 16)
if val > sys.maxsize:
val -= UMAX
- body = body[:s] + "(" + str(val) + ")" + body[e:]
+ body = body[:s] + b"(" + str(val).encode() + b")" + body[e:]
start = s + 1
return body
@@ -114,7 +115,7 @@ def process(fp, outfp, env = {}):
match = p_define.match(line)
if match:
# gobble up continuation lines
- while line[-2:] == '\\\n':
+ while line[-2:] == b'\\\n':
nextline = fp.readline()
if not nextline: break
lineno = lineno + 1
@@ -123,11 +124,11 @@ def process(fp, outfp, env = {}):
body = line[match.end():]
body = pytify(body)
ok = 0
- stmt = '%s = %s\n' % (name, body.strip())
+ stmt = name + b' = ' + body.strip() + b'\n'
try:
exec(stmt, env)
except:
- sys.stderr.write('Skipping: %s' % stmt)
+ sys.stderr.buffer.write(b'Skipping: ' + stmt)
else:
outfp.write(stmt)
match = p_macro.match(line)
@@ -135,11 +136,11 @@ def process(fp, outfp, env = {}):
macro, arg = match.group(1, 2)
body = line[match.end():]
body = pytify(body)
- stmt = 'def %s(%s): return %s\n' % (macro, arg, body)
+ stmt = b'def ' + macro + b'(' + arg + b'): return ' + body + b'\n'
try:
exec(stmt, env)
except:
- sys.stderr.write('Skipping: %s' % stmt)
+ sys.stderr.buffer.write(b'Skipping: ' + stmt)
else:
outfp.write(stmt)
match = p_include.match(line)
@@ -148,24 +149,24 @@ def process(fp, outfp, env = {}):
a, b = regs[1]
filename = line[a:b]
if filename in importable:
- outfp.write('from %s import *\n' % importable[filename])
+ outfp.write(b'from ' + importable[filename] + b' import *\n')
elif filename not in filedict:
filedict[filename] = None
inclfp = None
for dir in searchdirs:
try:
- inclfp = open(dir + '/' + filename)
+ inclfp = open(dir + b'/' + filename, 'rb')
break
except IOError:
pass
if inclfp:
with inclfp:
outfp.write(
- '\n# Included from %s\n' % filename)
+ b'\n# Included from %s\n' % filename)
process(inclfp, outfp, env)
else:
- sys.stderr.write('Warning - could not find file %s\n' %
- filename)
+ sys.stderr.buffer.write(b'Warning - could not find file ' +
+ filename + b'\n')
if __name__ == '__main__':
main()
--
2.33.0