1f08c3bdfSopenharmony_ci#!/usr/bin/env python 2f08c3bdfSopenharmony_ci# 3f08c3bdfSopenharmony_ci# Merge gcov graph from several test cases. This can be used to check 4f08c3bdfSopenharmony_ci# the coverage of several test cases. 5f08c3bdfSopenharmony_ci# 6f08c3bdfSopenharmony_ci# Copyright (C) 2008, Intel Corp. 7f08c3bdfSopenharmony_ci# Author: Huang Ying <ying.huang@intel.com> 8f08c3bdfSopenharmony_ci# 9f08c3bdfSopenharmony_ci# This file is released under the GPLv2. 10f08c3bdfSopenharmony_ci 11f08c3bdfSopenharmony_ciimport sys 12f08c3bdfSopenharmony_ci 13f08c3bdfSopenharmony_cidef die(str): 14f08c3bdfSopenharmony_ci print str 15f08c3bdfSopenharmony_ci sys.exit(-1) 16f08c3bdfSopenharmony_ci 17f08c3bdfSopenharmony_cidef die_on(cond, str): 18f08c3bdfSopenharmony_ci if cond: 19f08c3bdfSopenharmony_ci die(str) 20f08c3bdfSopenharmony_ci 21f08c3bdfSopenharmony_ciclass GCovLine(object): 22f08c3bdfSopenharmony_ci def __init__(self, l): 23f08c3bdfSopenharmony_ci object.__init__(self) 24f08c3bdfSopenharmony_ci self.parse(l) 25f08c3bdfSopenharmony_ci def parse(self, l): 26f08c3bdfSopenharmony_ci sep = l.find(':') 27f08c3bdfSopenharmony_ci die_on(sep <= 0, 'input error format error') 28f08c3bdfSopenharmony_ci remain = l[sep:] 29f08c3bdfSopenharmony_ci scnt = l[:sep] 30f08c3bdfSopenharmony_ci if scnt[-1] == '-': 31f08c3bdfSopenharmony_ci count = -1 32f08c3bdfSopenharmony_ci elif scnt[-1] == '#': 33f08c3bdfSopenharmony_ci count = 0 34f08c3bdfSopenharmony_ci else: 35f08c3bdfSopenharmony_ci count = int(scnt) 36f08c3bdfSopenharmony_ci self.sep = sep 37f08c3bdfSopenharmony_ci self.count = count 38f08c3bdfSopenharmony_ci self.remain = remain 39f08c3bdfSopenharmony_ci def merge(self, gcl): 40f08c3bdfSopenharmony_ci self.count = self.count + gcl.count 41f08c3bdfSopenharmony_ci def write(self, of): 42f08c3bdfSopenharmony_ci if self.count < 0: 43f08c3bdfSopenharmony_ci of.write("%*s" % (self.sep, '-')) 44f08c3bdfSopenharmony_ci elif self.count == 0: 45f08c3bdfSopenharmony_ci of.write("%*s" % (self.sep, '#####')) 46f08c3bdfSopenharmony_ci else: 47f08c3bdfSopenharmony_ci of.write("%*d" % (self.sep, self.count)) 48f08c3bdfSopenharmony_ci of.write(self.remain) 49f08c3bdfSopenharmony_ci 50f08c3bdfSopenharmony_cidef parse(f): 51f08c3bdfSopenharmony_ci return [GCovLine(l) for l in f] 52f08c3bdfSopenharmony_ci 53f08c3bdfSopenharmony_cidef merge(gcls1, gcls2): 54f08c3bdfSopenharmony_ci for gcl1, gcl2 in zip(gcls1, gcls2): 55f08c3bdfSopenharmony_ci gcl1.merge(gcl2) 56f08c3bdfSopenharmony_ci 57f08c3bdfSopenharmony_cidef gcov_merge(fns, of): 58f08c3bdfSopenharmony_ci f = file(fns[0]) 59f08c3bdfSopenharmony_ci gcls_base = parse(f) 60f08c3bdfSopenharmony_ci 61f08c3bdfSopenharmony_ci for fn in fns[1:]: 62f08c3bdfSopenharmony_ci f = file(fn) 63f08c3bdfSopenharmony_ci gcls = parse(f) 64f08c3bdfSopenharmony_ci merge(gcls_base, gcls) 65f08c3bdfSopenharmony_ci 66f08c3bdfSopenharmony_ci for gcl in gcls_base: 67f08c3bdfSopenharmony_ci gcl.write(of) 68f08c3bdfSopenharmony_ci 69f08c3bdfSopenharmony_cidef usage(): 70f08c3bdfSopenharmony_ci print 'Usage: %s <gcov graph files>' % (sys.argv[0]) 71f08c3bdfSopenharmony_ci 72f08c3bdfSopenharmony_ciif __name__ == '__main__': 73f08c3bdfSopenharmony_ci if len(sys.argv) <= 1: 74f08c3bdfSopenharmony_ci usage() 75f08c3bdfSopenharmony_ci exit -1 76f08c3bdfSopenharmony_ci gcov_merge(sys.argv[1:], sys.stdout) 77