magic/scripts/makedbh

108 lines
2.6 KiB
Python
Executable File

#!/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)