#!/usr/bin/env python # # Merge gcov graph from several test cases. This can be used to check # the coverage of several test cases. # # Copyright (C) 2008, Intel Corp. # Author: Huang Ying # # This file is released under the GPLv2. import sys def die(str): print str sys.exit(-1) def die_on(cond, str): if cond: die(str) class GCovLine(object): def __init__(self, l): object.__init__(self) self.parse(l) def parse(self, l): sep = l.find(':') die_on(sep <= 0, 'input error format error') remain = l[sep:] scnt = l[:sep] if scnt[-1] == '-': count = -1 elif scnt[-1] == '#': count = 0 else: count = int(scnt) self.sep = sep self.count = count self.remain = remain def merge(self, gcl): self.count = self.count + gcl.count def write(self, of): if self.count < 0: of.write("%*s" % (self.sep, '-')) elif self.count == 0: of.write("%*s" % (self.sep, '#####')) else: of.write("%*d" % (self.sep, self.count)) of.write(self.remain) def parse(f): return [GCovLine(l) for l in f] def merge(gcls1, gcls2): for gcl1, gcl2 in zip(gcls1, gcls2): gcl1.merge(gcl2) def gcov_merge(fns, of): f = file(fns[0]) gcls_base = parse(f) for fn in fns[1:]: f = file(fn) gcls = parse(f) merge(gcls_base, gcls) for gcl in gcls_base: gcl.write(of) def usage(): print 'Usage: %s ' % (sys.argv[0]) if __name__ == '__main__': if len(sys.argv) <= 1: usage() exit -1 gcov_merge(sys.argv[1:], sys.stdout)