| #!/usr/bin/env python3 | 
 | # -*- coding: utf-8 -*- | 
 | # | 
 | # Copyright (C) 2017-2020  The Project X-Ray Authors. | 
 | # | 
 | # Use of this source code is governed by a ISC-style | 
 | # license that can be found in the LICENSE file or at | 
 | # https://opensource.org/licenses/ISC | 
 | # | 
 | # SPDX-License-Identifier: ISC | 
 |  | 
 | import sys, re | 
 | from prjxray.util import OpenSafeFile, db_root_arg, parse_db_line | 
 |  | 
 |  | 
 | def run(fnin, fnout=None, strict=False, verbose=False): | 
 |     with OpenSafeFile(fnin) as f: | 
 |         lines = f.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, _ = 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 OpenSafeFile(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") | 
 |  | 
 |     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() |