diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2022-04-12 15:34:06 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-12 15:34:06 (GMT) |
commit | 474fdbe9e4a2ff90ef39e8748da644c86a200981 (patch) | |
tree | d15c64e70f6038121cf698b8b80b4436a0964e6d /Tools | |
parent | 943ca5e1d6b72830c530a72426cff094f155d010 (diff) | |
download | cpython-474fdbe9e4a2ff90ef39e8748da644c86a200981.zip cpython-474fdbe9e4a2ff90ef39e8748da644c86a200981.tar.gz cpython-474fdbe9e4a2ff90ef39e8748da644c86a200981.tar.bz2 |
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`.
Diffstat (limited to 'Tools')
-rwxr-xr-x | Tools/scripts/generate_sre_constants.py | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/Tools/scripts/generate_sre_constants.py b/Tools/scripts/generate_sre_constants.py new file mode 100755 index 0000000..b8f0df9 --- /dev/null +++ b/Tools/scripts/generate_sre_constants.py @@ -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:]) |