xref: /plan9/sys/lib/acid/coverage (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1219b2ee8SDavid du Colombier// Coverage library
2219b2ee8SDavid du Colombier
3219b2ee8SDavid du Colombierdefn coverage()
4219b2ee8SDavid du Colombier{
5*7dd7cddfSDavid du Colombier	local lmap, lp, e, pc, n, l;
6219b2ee8SDavid du Colombier
7219b2ee8SDavid du Colombier	new();
8219b2ee8SDavid du Colombier
9219b2ee8SDavid du Colombier	bblock = {};
10219b2ee8SDavid du Colombier
11219b2ee8SDavid du Colombier	// find the first location in the text
12219b2ee8SDavid du Colombier	e = (map()[0][1])\i;
13219b2ee8SDavid du Colombier
14219b2ee8SDavid du Colombier	while e < etext-4 do {
15219b2ee8SDavid du Colombier		l = follow(e);
16219b2ee8SDavid du Colombier		if tail l != {} then {
17*7dd7cddfSDavid du Colombier			if match(l[0], bblock) < 0 then
18*7dd7cddfSDavid du Colombier				bblock = append bblock, l[0];
19*7dd7cddfSDavid du Colombier			if match(l[1], bblock) < 0 then
20*7dd7cddfSDavid du Colombier				bblock = append bblock, l[1];
21219b2ee8SDavid du Colombier		}
22219b2ee8SDavid du Colombier		e++;
23219b2ee8SDavid du Colombier	}
24219b2ee8SDavid du Colombier
25*7dd7cddfSDavid du Colombier	l = bblock;
26*7dd7cddfSDavid du Colombier	while l != {} do {
27*7dd7cddfSDavid du Colombier		*fmt(head l, bpfmt) = bpinst;
28*7dd7cddfSDavid du Colombier		l = tail l;
29*7dd7cddfSDavid du Colombier	}
30*7dd7cddfSDavid du Colombier
31219b2ee8SDavid du Colombier	while 1 do {
32219b2ee8SDavid du Colombier		cont();
33219b2ee8SDavid du Colombier		pc = *PC;
34219b2ee8SDavid du Colombier		n = match(pc, bblock);
35219b2ee8SDavid du Colombier		if n >= 0 then {
36219b2ee8SDavid du Colombier			pc = fmt(pc, bpfmt);
37219b2ee8SDavid du Colombier			*pc = @pc;
38219b2ee8SDavid du Colombier			bblock = delete bblock, n;
39219b2ee8SDavid du Colombier		}
40219b2ee8SDavid du Colombier		else {
41219b2ee8SDavid du Colombier			pstop(pid);
42219b2ee8SDavid du Colombier			return {};
43219b2ee8SDavid du Colombier		}
44219b2ee8SDavid du Colombier	}
45219b2ee8SDavid du Colombier}
46219b2ee8SDavid du Colombier
47219b2ee8SDavid du Colombierdefn eblock(addr)
48219b2ee8SDavid du Colombier{
49219b2ee8SDavid du Colombier	addr = addr\i;
50219b2ee8SDavid du Colombier
51219b2ee8SDavid du Colombier	while addr < etext do {
52219b2ee8SDavid du Colombier		if (tail follow(addr)) != {} then
53219b2ee8SDavid du Colombier			return pcline(addr);
54219b2ee8SDavid du Colombier		addr++;
55219b2ee8SDavid du Colombier	}
56219b2ee8SDavid du Colombier	return 0;
57219b2ee8SDavid du Colombier}
58219b2ee8SDavid du Colombier
59219b2ee8SDavid du Colombierdefn basic(stsrc, ensrc, file)
60219b2ee8SDavid du Colombier{
61219b2ee8SDavid du Colombier	local src, text;
62219b2ee8SDavid du Colombier
63219b2ee8SDavid du Colombier	if stsrc >= ensrc then
64219b2ee8SDavid du Colombier		return {};
65219b2ee8SDavid du Colombier
66219b2ee8SDavid du Colombier	print(file, ":", stsrc, ",", ensrc, "\n");
67219b2ee8SDavid du Colombier	src = match(file, srcfiles);
68219b2ee8SDavid du Colombier
69219b2ee8SDavid du Colombier	if src >= 0 then
70219b2ee8SDavid du Colombier		src = srctext[src];
71219b2ee8SDavid du Colombier	else
72219b2ee8SDavid du Colombier		src = findsrc(file);
73219b2ee8SDavid du Colombier
74219b2ee8SDavid du Colombier	if src == {} then
75219b2ee8SDavid du Colombier		print("no source for ", file, "\n");
76219b2ee8SDavid du Colombier	else {
77219b2ee8SDavid du Colombier		while stsrc <= ensrc do {
78219b2ee8SDavid du Colombier			text = src[stsrc];
79219b2ee8SDavid du Colombier			if text != {} then
80219b2ee8SDavid du Colombier				print("\t", stsrc, ":", text, "\n");
81219b2ee8SDavid du Colombier			stsrc = stsrc+1;
82219b2ee8SDavid du Colombier		}
83219b2ee8SDavid du Colombier	}
84219b2ee8SDavid du Colombier}
85219b2ee8SDavid du Colombier
86219b2ee8SDavid du Colombierdefn analyse(fnaddr)
87219b2ee8SDavid du Colombier{
88219b2ee8SDavid du Colombier	local addr, l, tfn;
89219b2ee8SDavid du Colombier
90219b2ee8SDavid du Colombier	new();
91219b2ee8SDavid du Colombier
92219b2ee8SDavid du Colombier	tfn = fnbound(fnaddr);
93219b2ee8SDavid du Colombier
94219b2ee8SDavid du Colombier	l = bblock;
95219b2ee8SDavid du Colombier	while l do {
96219b2ee8SDavid du Colombier		addr = head l;
97219b2ee8SDavid du Colombier
98219b2ee8SDavid du Colombier		if addr >= tfn[0] && addr < tfn[1] then
99219b2ee8SDavid du Colombier			basic(pcline(addr), eblock(addr), pcfile(addr));
100219b2ee8SDavid du Colombier
101219b2ee8SDavid du Colombier		l = tail l;
102219b2ee8SDavid du Colombier	}
103219b2ee8SDavid du Colombier	kill(pid);
104219b2ee8SDavid du Colombier}
105219b2ee8SDavid du Colombier
106219b2ee8SDavid du Colombierdefn report()
107219b2ee8SDavid du Colombier{
108219b2ee8SDavid du Colombier	local addr, l;
109219b2ee8SDavid du Colombier
110219b2ee8SDavid du Colombier	new();
111219b2ee8SDavid du Colombier
112219b2ee8SDavid du Colombier	l = bblock;
113219b2ee8SDavid du Colombier	while l do {
114219b2ee8SDavid du Colombier		addr = head l;
115219b2ee8SDavid du Colombier
116219b2ee8SDavid du Colombier		basic(pcline(addr), eblock(addr), pcfile(addr));
117219b2ee8SDavid du Colombier
118219b2ee8SDavid du Colombier		l = tail l;
119219b2ee8SDavid du Colombier	}
120219b2ee8SDavid du Colombier	kill(pid);
121219b2ee8SDavid du Colombier}
122219b2ee8SDavid du Colombier
123219b2ee8SDavid du Colombierdefn stopped(pid)
124219b2ee8SDavid du Colombier{
125219b2ee8SDavid du Colombier	return {};
126219b2ee8SDavid du Colombier}
127219b2ee8SDavid du Colombier
128219b2ee8SDavid du Colombierprint("/sys/lib/acid/coverage");
129