| #!/usr/bin/env python3 | |
| import sys | |
| import re | |
| import util | |
| def run(fnin, fnout=None, strict=False, verbose=False): | |
| lines = open(fnin, 'r').read().split('\n') | |
| tags = dict() | |
| bitss = dict() | |
| for line in lines: | |
| line = line.strip() | |
| if line == '': | |
| continue | |
| # TODO: figure out what to do with masks | |
| if line.startswith("bit "): | |
| continue | |
| tag, bits, mode, _ = util.parse_db_line(line) | |
| if strict: | |
| if mode != "always": | |
| assert not mode, "strict: got ill defined line: %s" % (line, ) | |
| if tag in tags: | |
| print("Original line: %s" % tags[tag], file=sys.stderr) | |
| print("New line: %s" % line, file=sys.stderr) | |
| assert 0, "strict: got duplicate tag %s" % (tag, ) | |
| assert bits not in bitss, "strict: got duplicate bits %s: %s %s" % ( | |
| bits, tag, bitss[bits]) | |
| tags[tag] = line | |
| if bits != None: | |
| bitss[bits] = tag | |
| if fnout: | |
| with open(fnout, "w") as fout: | |
| for line in sorted(lines): | |
| line = line.strip() | |
| if line == '': | |
| continue | |
| fout.write(line + '\n') | |
| def main(): | |
| import argparse | |
| parser = argparse.ArgumentParser( | |
| description="Parse a db file, checking for consistency") | |
| util.db_root_arg(parser) | |
| parser.add_argument('--verbose', action='store_true', help='') | |
| parser.add_argument( | |
| '--strict', | |
| action='store_true', | |
| help='Complain on unresolved entries (ex: <0 candidates>, <const0>)') | |
| parser.add_argument('fin', help='') | |
| parser.add_argument('fout', nargs='?', help='') | |
| args = parser.parse_args() | |
| run(args.fin, args.fout, strict=args.strict, verbose=args.verbose) | |
| if __name__ == '__main__': | |
| main() |