#!/usr/bin/env python
"""
Summarize the information in the given coverage files.

Emits the number of rules covered or the percentage of rules covered depending
on whether --num-rules has been used to specify the total number of rules.
"""

import argparse
import struct

class FileFormatError(Exception):
  pass

def backend_int_pair(s):
  backend, sep, value = s.partition('=')
  if (sep is None):
    raise argparse.ArgumentTypeError("'=' missing, expected name=value")
  if (not backend):
    raise argparse.ArgumentTypeError("Expected name=value")
  if (not value):
    raise argparse.ArgumentTypeError("Expected name=value")
  return backend, int(value)

def main():
  parser = argparse.ArgumentParser(description=__doc__)
  parser.add_argument('input', nargs='+')
  parser.add_argument('--num-rules', type=backend_int_pair, action='append',
                      metavar='BACKEND=NUM',
                      help='Specify the number of rules for a backend')
  args = parser.parse_args()

  covered_rules = {}

  for input_filename in args.input:
    with open(input_filename, 'rb') as input_fh:
      data = input_fh.read()
      pos = 0
      while data:
        backend, _, data = data.partition('\0')
        pos += len(backend)
        pos += 1

        if len(backend) == 0:
          raise FileFormatError()
        backend, = struct.unpack("%ds" % len(backend), backend)

        while data:
          if len(data) < 8:
            raise FileFormatError()
          rule_id, = struct.unpack("Q", data[:8])
          pos += 8
          data = data[8:]
          if rule_id == (2 ** 64) - 1:
            break
          covered_rules[backend] = covered_rules.get(backend, {})
          covered_rules[backend][rule_id] = covered_rules[backend].get(rule_id, 0) + 1

  num_rules = dict(args.num_rules)
  for backend, rules_for_backend in covered_rules.items():
    if backend in num_rules:
      print "%s: %3.2f%% of rules covered" % (backend, (float(len(rules_for_backend.keys())) / num_rules[backend]) * 100)
    else:
      print "%s: %d rules covered" % (backend, len(rules_for_backend.keys()))

if __name__ == '__main__':
  main()
