diff options
author | Victor Stinner <vstinner@redhat.com> | 2019-07-30 15:45:09 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-30 15:45:09 (GMT) |
commit | 27eeaf0f2c9bd53a0fbdfdf38ee759e971221f8d (patch) | |
tree | bb4d1276338dbf98c81f73f0ffb661541a591a95 | |
parent | 8a758f5b99c5fc3fd32edeac049d7d4a4b7cc163 (diff) | |
download | cpython-27eeaf0f2c9bd53a0fbdfdf38ee759e971221f8d.zip cpython-27eeaf0f2c9bd53a0fbdfdf38ee759e971221f8d.tar.gz cpython-27eeaf0f2c9bd53a0fbdfdf38ee759e971221f8d.tar.bz2 |
bpo-37704: Remove Tools/scripts/h2py.py (GH-15000)
Use cffi to access a C API in Python.
-rw-r--r-- | Lib/test/test_tools/test_sundry.py | 2 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Tools-Demos/2019-07-29-13-59-19.bpo-37704.xxGUz_.rst | 1 | ||||
-rw-r--r-- | Tools/scripts/README | 1 | ||||
-rwxr-xr-x | Tools/scripts/h2py.py | 171 |
4 files changed, 2 insertions, 173 deletions
diff --git a/Lib/test/test_tools/test_sundry.py b/Lib/test/test_tools/test_sundry.py index f5fed01..10eb694 100644 --- a/Lib/test/test_tools/test_sundry.py +++ b/Lib/test/test_tools/test_sundry.py @@ -2,7 +2,7 @@ This file contains extremely basic regression tests for the scripts found in the Tools directory of a Python checkout or tarball which don't have separate -tests of their own, such as h2py.py. +tests of their own. """ import os diff --git a/Misc/NEWS.d/next/Tools-Demos/2019-07-29-13-59-19.bpo-37704.xxGUz_.rst b/Misc/NEWS.d/next/Tools-Demos/2019-07-29-13-59-19.bpo-37704.xxGUz_.rst new file mode 100644 index 0000000..52ca489 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2019-07-29-13-59-19.bpo-37704.xxGUz_.rst @@ -0,0 +1 @@ +Remove ``Tools/scripts/h2py.py``: use cffi to access a C API in Python. diff --git a/Tools/scripts/README b/Tools/scripts/README index d4ac2ad..bee5b0b 100644 --- a/Tools/scripts/README +++ b/Tools/scripts/README @@ -30,7 +30,6 @@ ftpmirror.py FTP mirror script get-remote-certificate.py Fetch the certificate that the server(s) are providing in PEM form google.py Open a webbrowser with Google gprof2html.py Transform gprof(1) output into useful HTML -h2py.py Translate #define's into Python assignments highlight.py Python syntax highlighting with HTML output idle3 Main program to start IDLE ifdef.py Remove #if(n)def groups from C sources diff --git a/Tools/scripts/h2py.py b/Tools/scripts/h2py.py deleted file mode 100755 index ea37c04..0000000 --- a/Tools/scripts/h2py.py +++ /dev/null @@ -1,171 +0,0 @@ -#! /usr/bin/env python3 - -# Read #define's and translate to Python code. -# Handle #include statements. -# Handle #define macros with one argument. -# Anything that isn't recognized or doesn't translate into valid -# Python is ignored. - -# Without filename arguments, acts as a filter. -# If one or more filenames are given, output is written to corresponding -# filenames in the local directory, translated to all uppercase, with -# the extension replaced by ".py". - -# By passing one or more options of the form "-i regular_expression" -# you can specify additional strings to be ignored. This is useful -# e.g. to ignore casts to u_long: simply specify "-i '(u_long)'". - -# XXX To do: -# - turn trailing C comments into Python comments -# - turn C Boolean operators "&& || !" into Python "and or not" -# - what to do about #if(def)? -# - what to do about macros with multiple parameters? - -import sys, re, getopt, os - -p_define = re.compile(r'^[\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 ]+') - -p_include = re.compile(r'^[\t ]*#[\t ]*include[\t ]+<([^>\n]+)>') - -p_comment = re.compile(r'/\*([^*]+|\*+[^/])*(\*+/)?') -p_cpp_comment = re.compile('//.*') - -ignores = [p_comment, p_cpp_comment] - -p_char = re.compile(r"'(\\.[^\\]*|[^\\])'") - -p_hex = re.compile(r"0x([0-9a-fA-F]+)L?") - -filedict = {} -importable = {} - -try: - searchdirs=os.environ['include'].split(';') -except KeyError: - try: - searchdirs=os.environ['INCLUDE'].split(';') - except KeyError: - searchdirs=['/usr/include'] - try: - searchdirs.insert(0, os.path.join('/usr/include', - os.environ['MULTIARCH'])) - except KeyError: - pass - -def main(): - global filedict - opts, args = getopt.getopt(sys.argv[1:], 'i:') - for o, a in opts: - if o == '-i': - ignores.append(re.compile(a)) - if not args: - args = ['-'] - for filename in args: - if filename == '-': - sys.stdout.write('# Generated by h2py from stdin\n') - process(sys.stdin, sys.stdout) - else: - with open(filename) as fp: - outfile = os.path.basename(filename) - i = outfile.rfind('.') - 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) - filedict = {} - for dir in searchdirs: - if filename[:len(dir)] == dir: - filedict[filename[len(dir)+1:]] = None # no '/' trailing - importable[filename[len(dir)+1:]] = modname - break - process(fp, outfp) - -def pytify(body): - # replace ignored patterns by spaces - for p in ignores: - body = p.sub(' ', body) - # replace char literals by ord(...) - body = p_char.sub("ord('\\1')", body) - # Compute negative hexadecimal constants - start = 0 - UMAX = 2*(sys.maxsize+1) - while 1: - m = p_hex.search(body, start) - if not m: break - s,e = m.span() - val = int(body[slice(*m.span(1))], 16) - if val > sys.maxsize: - val -= UMAX - body = body[:s] + "(" + str(val) + ")" + body[e:] - start = s + 1 - return body - -def process(fp, outfp, env = {}): - lineno = 0 - while 1: - line = fp.readline() - if not line: break - lineno = lineno + 1 - match = p_define.match(line) - if match: - # gobble up continuation lines - while line[-2:] == '\\\n': - nextline = fp.readline() - if not nextline: break - lineno = lineno + 1 - line = line + nextline - name = match.group(1) - body = line[match.end():] - body = pytify(body) - ok = 0 - stmt = '%s = %s\n' % (name, body.strip()) - try: - exec(stmt, env) - except: - sys.stderr.write('Skipping: %s' % stmt) - else: - outfp.write(stmt) - match = p_macro.match(line) - if match: - macro, arg = match.group(1, 2) - body = line[match.end():] - body = pytify(body) - stmt = 'def %s(%s): return %s\n' % (macro, arg, body) - try: - exec(stmt, env) - except: - sys.stderr.write('Skipping: %s' % stmt) - else: - outfp.write(stmt) - match = p_include.match(line) - if match: - regs = match.regs - a, b = regs[1] - filename = line[a:b] - if filename in importable: - outfp.write('from %s import *\n' % importable[filename]) - elif filename not in filedict: - filedict[filename] = None - inclfp = None - for dir in searchdirs: - try: - inclfp = open(dir + '/' + filename) - break - except IOError: - pass - if inclfp: - with inclfp: - outfp.write( - '\n# Included from %s\n' % filename) - process(inclfp, outfp, env) - else: - sys.stderr.write('Warning - could not find file %s\n' % - filename) - -if __name__ == '__main__': - main() |