Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
27eeaf0f
Commit
27eeaf0f
authored
Jul 30, 2019
by
Victor Stinner
Committed by
GitHub
Jul 30, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bpo-37704: Remove Tools/scripts/h2py.py (GH-15000)
Use cffi to access a C API in Python.
parent
8a758f5b
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
2 additions
and
173 deletions
+2
-173
Lib/test/test_tools/test_sundry.py
Lib/test/test_tools/test_sundry.py
+1
-1
Misc/NEWS.d/next/Tools-Demos/2019-07-29-13-59-19.bpo-37704.xxGUz_.rst
...next/Tools-Demos/2019-07-29-13-59-19.bpo-37704.xxGUz_.rst
+1
-0
Tools/scripts/README
Tools/scripts/README
+0
-1
Tools/scripts/h2py.py
Tools/scripts/h2py.py
+0
-171
No files found.
Lib/test/test_tools/test_sundry.py
View file @
27eeaf0f
...
...
@@ -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
...
...
Misc/NEWS.d/next/Tools-Demos/2019-07-29-13-59-19.bpo-37704.xxGUz_.rst
0 → 100644
View file @
27eeaf0f
Remove ``Tools/scripts/h2py.py``: use cffi to access a C API in Python.
Tools/scripts/README
View file @
27eeaf0f
...
...
@@ -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
...
...
Tools/scripts/h2py.py
deleted
100755 → 0
View file @
8a758f5b
#! /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
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment