1 0a61c07d 2004-04-19 devnull // Coverage library
3 0a61c07d 2004-04-19 devnull defn coverage()
5 0a61c07d 2004-04-19 devnull local lmap, lp, e, pc, n, l;
9 0a61c07d 2004-04-19 devnull bblock = {};
11 0a61c07d 2004-04-19 devnull // find the first location in the text
12 0a61c07d 2004-04-19 devnull e = (map()[0][1])\i;
14 0a61c07d 2004-04-19 devnull while e < etext-4 do {
15 0a61c07d 2004-04-19 devnull l = follow(e);
16 0a61c07d 2004-04-19 devnull if tail l != {} then {
17 0a61c07d 2004-04-19 devnull if match(l[0], bblock) < 0 then
18 0a61c07d 2004-04-19 devnull bblock = append bblock, l[0];
19 0a61c07d 2004-04-19 devnull if match(l[1], bblock) < 0 then
20 0a61c07d 2004-04-19 devnull bblock = append bblock, l[1];
25 0a61c07d 2004-04-19 devnull l = bblock;
26 0a61c07d 2004-04-19 devnull while l != {} do {
27 0a61c07d 2004-04-19 devnull *fmt(head l, bpfmt) = bpinst;
28 0a61c07d 2004-04-19 devnull l = tail l;
31 0a61c07d 2004-04-19 devnull while 1 do {
33 0a61c07d 2004-04-19 devnull pc = *PC;
34 0a61c07d 2004-04-19 devnull n = match(pc, bblock);
35 0a61c07d 2004-04-19 devnull if n >= 0 then {
36 0a61c07d 2004-04-19 devnull pc = fmt(pc, bpfmt);
37 0a61c07d 2004-04-19 devnull *pc = @pc;
38 0a61c07d 2004-04-19 devnull bblock = delete bblock, n;
41 0a61c07d 2004-04-19 devnull pstop(pid);
42 0a61c07d 2004-04-19 devnull return {};
47 0a61c07d 2004-04-19 devnull defn eblock(addr)
49 0a61c07d 2004-04-19 devnull addr = addr\i;
51 0a61c07d 2004-04-19 devnull while addr < etext do {
52 0a61c07d 2004-04-19 devnull if (tail follow(addr)) != {} then
53 0a61c07d 2004-04-19 devnull return pcline(addr);
56 0a61c07d 2004-04-19 devnull return 0;
59 0a61c07d 2004-04-19 devnull defn basic(stsrc, ensrc, file)
61 0a61c07d 2004-04-19 devnull local src, text;
63 0a61c07d 2004-04-19 devnull if stsrc >= ensrc then
64 0a61c07d 2004-04-19 devnull return {};
66 0a61c07d 2004-04-19 devnull print(file, ":", stsrc, ",", ensrc, "\n");
67 0a61c07d 2004-04-19 devnull src = match(file, srcfiles);
69 0a61c07d 2004-04-19 devnull if src >= 0 then
70 0a61c07d 2004-04-19 devnull src = srctext[src];
72 0a61c07d 2004-04-19 devnull src = findsrc(file);
74 0a61c07d 2004-04-19 devnull if src == {} then
75 0a61c07d 2004-04-19 devnull print("no source for ", file, "\n");
77 0a61c07d 2004-04-19 devnull while stsrc <= ensrc do {
78 0a61c07d 2004-04-19 devnull text = src[stsrc];
79 0a61c07d 2004-04-19 devnull if text != {} then
80 0a61c07d 2004-04-19 devnull print("\t", stsrc, ":", text, "\n");
81 0a61c07d 2004-04-19 devnull stsrc = stsrc+1;
86 0a61c07d 2004-04-19 devnull defn analyse(fnaddr)
88 0a61c07d 2004-04-19 devnull local addr, l, tfn;
92 0a61c07d 2004-04-19 devnull tfn = fnbound(fnaddr);
94 0a61c07d 2004-04-19 devnull l = bblock;
95 0a61c07d 2004-04-19 devnull while l do {
96 0a61c07d 2004-04-19 devnull addr = head l;
98 0a61c07d 2004-04-19 devnull if addr >= tfn[0] && addr < tfn[1] then
99 0a61c07d 2004-04-19 devnull basic(pcline(addr), eblock(addr), pcfile(addr));
101 0a61c07d 2004-04-19 devnull l = tail l;
103 0a61c07d 2004-04-19 devnull kill(pid);
106 0a61c07d 2004-04-19 devnull defn report()
108 0a61c07d 2004-04-19 devnull local addr, l;
112 0a61c07d 2004-04-19 devnull l = bblock;
113 0a61c07d 2004-04-19 devnull while l do {
114 0a61c07d 2004-04-19 devnull addr = head l;
116 0a61c07d 2004-04-19 devnull basic(pcline(addr), eblock(addr), pcfile(addr));
118 0a61c07d 2004-04-19 devnull l = tail l;
120 0a61c07d 2004-04-19 devnull kill(pid);
123 0a61c07d 2004-04-19 devnull defn stopped(pid)
125 0a61c07d 2004-04-19 devnull return {};
128 0a61c07d 2004-04-19 devnull print(acidfile);