Path: blob/main/Tools/build/generate_sre_constants.py
12 views
#! /usr/bin/env python31# This script generates Modules/_sre/sre_constants.h from Lib/re/_constants.py.23SCRIPT_NAME = 'Tools/build/generate_sre_constants.py'456def update_file(file, content):7try:8with open(file, 'r') as fobj:9if fobj.read() == content:10return False11except (OSError, ValueError):12pass13with open(file, 'w') as fobj:14fobj.write(content)15return True1617sre_constants_header = f"""\18/*19* Secret Labs' Regular Expression Engine20*21* regular expression matching engine22*23* Auto-generated by {SCRIPT_NAME} from24* Lib/re/_constants.py.25*26* Copyright (c) 1997-2001 by Secret Labs AB. All rights reserved.27*28* See the sre.c file for information on usage and redistribution.29*/3031"""3233def main(34infile="Lib/re/_constants.py",35outfile_constants="Modules/_sre/sre_constants.h",36outfile_targets="Modules/_sre/sre_targets.h",37):38ns = {}39with open(infile) as fp:40code = fp.read()41exec(code, ns)4243def dump(d, prefix):44items = sorted(d)45for item in items:46yield "#define %s_%s %d\n" % (prefix, item, item)4748def dump2(d, prefix):49items = [(value, name) for name, value in d.items()50if name.startswith(prefix)]51for value, name in sorted(items):52yield "#define %s %d\n" % (name, value)5354def dump_gotos(d, prefix):55for i, item in enumerate(sorted(d)):56assert i == item57yield f" &&{prefix}_{item},\n"5859content = [sre_constants_header]60content.append("#define SRE_MAGIC %d\n" % ns["MAGIC"])61content.extend(dump(ns["OPCODES"], "SRE_OP"))62content.extend(dump(ns["ATCODES"], "SRE"))63content.extend(dump(ns["CHCODES"], "SRE"))64content.extend(dump2(ns, "SRE_FLAG_"))65content.extend(dump2(ns, "SRE_INFO_"))6667update_file(outfile_constants, ''.join(content))6869content = [sre_constants_header]70content.append(f"static void *sre_targets[{len(ns['OPCODES'])}] = {{\n")71content.extend(dump_gotos(ns["OPCODES"], "TARGET_SRE_OP"))72content.append("};\n")7374update_file(outfile_targets, ''.join(content))757677if __name__ == '__main__':78import sys79main(*sys.argv[1:])808182