mirror of
https://github.com/python/cpython.git
synced 2025-07-19 01:05:26 +00:00
bpo-47152: Automatically regenerate sre_constants.h (GH-91439)
* Move the code for generating Modules/_sre/sre_constants.h from Lib/re/_constants.py into a separate script Tools/scripts/generate_sre_constants.py. * Add target `regen-sre` in the makefile. * Make target `regen-all` depending on `regen-sre`.
This commit is contained in:
parent
943ca5e1d6
commit
474fdbe9e4
5 changed files with 73 additions and 46 deletions
62
Tools/scripts/generate_sre_constants.py
Executable file
62
Tools/scripts/generate_sre_constants.py
Executable file
|
@ -0,0 +1,62 @@
|
|||
#! /usr/bin/env python3
|
||||
# This script generates Modules/_sre/sre_constants.h from Lib/re/_constants.py.
|
||||
|
||||
|
||||
def update_file(file, content):
|
||||
try:
|
||||
with open(file, 'r') as fobj:
|
||||
if fobj.read() == content:
|
||||
return False
|
||||
except (OSError, ValueError):
|
||||
pass
|
||||
with open(file, 'w') as fobj:
|
||||
fobj.write(content)
|
||||
return True
|
||||
|
||||
sre_constants_header = """\
|
||||
/*
|
||||
* Secret Labs' Regular Expression Engine
|
||||
*
|
||||
* regular expression matching engine
|
||||
*
|
||||
* Auto-generated by Tools/scripts/generate_sre_constants.py from
|
||||
* Lib/re/_constants.py.
|
||||
*
|
||||
* Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved.
|
||||
*
|
||||
* See the sre.c file for information on usage and redistribution.
|
||||
*/
|
||||
|
||||
"""
|
||||
|
||||
def main(infile='Lib/re/_constants.py', outfile='Modules/_sre/sre_constants.h'):
|
||||
ns = {}
|
||||
with open(infile) as fp:
|
||||
code = fp.read()
|
||||
exec(code, ns)
|
||||
|
||||
def dump(d, prefix):
|
||||
items = sorted(d)
|
||||
for item in items:
|
||||
yield "#define %s_%s %d\n" % (prefix, item, item)
|
||||
|
||||
def dump2(d, prefix):
|
||||
items = [(value, name) for name, value in d.items()
|
||||
if name.startswith(prefix)]
|
||||
for value, name in sorted(items):
|
||||
yield "#define %s %d\n" % (name, value)
|
||||
|
||||
content = [sre_constants_header]
|
||||
content.append("#define SRE_MAGIC %d\n" % ns["MAGIC"])
|
||||
content.extend(dump(ns["OPCODES"], "SRE_OP"))
|
||||
content.extend(dump(ns["ATCODES"], "SRE"))
|
||||
content.extend(dump(ns["CHCODES"], "SRE"))
|
||||
content.extend(dump2(ns, "SRE_FLAG_"))
|
||||
content.extend(dump2(ns, "SRE_INFO_"))
|
||||
|
||||
update_file(outfile, ''.join(content))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
main(*sys.argv[1:])
|
Loading…
Add table
Add a link
Reference in a new issue