1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
#!/usr/bin/env python
from __future__ import print_function
import re, sys
from dist import all_c_files, all_h_files, compare_srcfile
# Automatically build flags values: read through all of the header files, and
# for each group of flags, sort them and give them a unique value.
#
# To add a new flag declare it at the top of the flags list as:
# #define WT_NEW_FLAG_NAME 0x0u
#
# and it will be automatically alphabetized and assigned the proper value.
def flag_declare(name):
tmp_file = '__tmp'
with open(name, 'r') as f:
tfile = open(tmp_file, 'w')
lcnt = 0
parsing = False
for line in f:
lcnt = lcnt + 1
if line.find('AUTOMATIC FLAG VALUE GENERATION START') != -1:
header = line
defines = []
parsing = True
elif line.find('AUTOMATIC FLAG VALUE GENERATION STOP') != -1:
# We only support 64 bits.
if len(defines) > 64:
print(name + ": line " + str(lcnt) +\
": exceeds maximum 64 bit flags", file=sys.stderr)
sys.exit(1)
# Calculate number of hex bytes, create format string
fmt = "0x%%0%dxu" % ((len(defines) + 3) / 4)
tfile.write(header)
v = 1
for d in sorted(defines):
tfile.write(re.sub("0x[01248u]*", fmt % v, d))
v = v * 2
tfile.write(line)
parsing = False
elif parsing and line.find('#define') == -1:
print(name + ": line " + str(lcnt) +\
": unexpected flag line, no #define", file=sys.stderr)
sys.exit(1)
elif parsing:
defines.append(line)
else:
tfile.write(line)
tfile.close()
compare_srcfile(tmp_file, name)
# Update function argument declarations.
for name in all_h_files():
flag_declare(name)
for name in all_c_files():
flag_declare(name)
|