#!/usr/bin/env python3 # makes the "database.h" (1st argument, $1) file from "database.h.in" # (2nd argument, $2), setting various mask operation definitions # according to the number of words implied by the value of TT_MAXTYPES import re import sys database_h_in = open(sys.argv[1], encoding="utf8").read() maxtypes_rx = re.compile(r"#define\s+TT_MAXTYPES\s+(\d+)") match = maxtypes_rx.findall(database_h_in) if len(match) == 0: print( f"Bad regular expression in {sys.argv[0]}: Cannot generate database/database.h!", file=sys.stderr, ) exit(-1) maxtypes = int(match[0]) # Find derived values from bits per word # Note that bits-per-word should be determined from the compiler, but # 32 bits per word has always been hardwired into magic. # bpw = 32 maskwords = (maxtypes + bpw - 1) // bpw # Prepare Output String out_string = database_h_in def p(string): global out_string out_string += f"{string}" # Generated macros def add_generated_mask_macro(name, expression, *, connector=","): global maskwords p(f"#define {name} ( \\\n") for i in reversed(range(maskwords)): p(f"\t{expression.format(i=i)}") if i == 0: p(")\n\n") else: p(f"{connector} \\\n") add_generated_mask_macro( "TTMaskZero(m)", "(m)->tt_words[{i}] = 0", ) add_generated_mask_macro( "TTMaskIsZero(m)", "(m)->tt_words[{i}] == 0", connector=" &&", ) add_generated_mask_macro( "TTMaskEqual(m, n)", "(m)->tt_words[{i}] == (n)->tt_words[{i}]", connector=" &&", ) add_generated_mask_macro( "TTMaskIntersect(m, n)", "((m)->tt_words[{i}] & (n)->tt_words[{i}])", connector=" ||", ) add_generated_mask_macro( "TTMaskCom(m)", "((m)->tt_words[{i}] = ~(m)->tt_words[{i}])", ) add_generated_mask_macro( "TTMaskCom2(m, n)", "((m)->tt_words[{i}] = ~(n)->tt_words[{i}])", ) add_generated_mask_macro( "TTMaskSetMask(m, n)", "((m)->tt_words[{i}] |= (n)->tt_words[{i}])", ) add_generated_mask_macro( "TTMaskSetMask3(m, n, o)", "((m)->tt_words[{i}] |= (n)->tt_words[{i}] | (o)->tt_words[{i}])", ) add_generated_mask_macro( "TTMaskAndMask(m, n)", "((m)->tt_words[{i}] &= (n)->tt_words[{i}])", ) add_generated_mask_macro( "TTMaskAndMask3(m, n, o)", "((m)->tt_words[{i}] = (n)->tt_words[{i}] & (o)->tt_words[{i}])", ) add_generated_mask_macro( "TTMaskClearMask(m, n)", "((m)->tt_words[{i}] &= ~(n)->tt_words[{i}])", ) add_generated_mask_macro( "TTMaskClearMask3(m, n, o)", "((m)->tt_words[{i}] = (n)->tt_words[{i}] & ~(o)->tt_words[{i}])", ) p("#endif /* _DATABASE_H */\n") with open(sys.argv[2], "w", encoding="utf8") as f: f.write(out_string)