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