Blame


1 0a61c07d 2004-04-19 devnull // Coverage library
2 0a61c07d 2004-04-19 devnull
3 0a61c07d 2004-04-19 devnull defn coverage()
4 0a61c07d 2004-04-19 devnull {
5 0a61c07d 2004-04-19 devnull local lmap, lp, e, pc, n, l;
6 0a61c07d 2004-04-19 devnull
7 0a61c07d 2004-04-19 devnull new();
8 0a61c07d 2004-04-19 devnull
9 0a61c07d 2004-04-19 devnull bblock = {};
10 0a61c07d 2004-04-19 devnull
11 0a61c07d 2004-04-19 devnull // find the first location in the text
12 0a61c07d 2004-04-19 devnull e = (map()[0][1])\i;
13 0a61c07d 2004-04-19 devnull
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];
21 0a61c07d 2004-04-19 devnull }
22 0a61c07d 2004-04-19 devnull e++;
23 0a61c07d 2004-04-19 devnull }
24 0a61c07d 2004-04-19 devnull
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;
29 0a61c07d 2004-04-19 devnull }
30 0a61c07d 2004-04-19 devnull
31 0a61c07d 2004-04-19 devnull while 1 do {
32 0a61c07d 2004-04-19 devnull cont();
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;
39 0a61c07d 2004-04-19 devnull }
40 0a61c07d 2004-04-19 devnull else {
41 0a61c07d 2004-04-19 devnull pstop(pid);
42 0a61c07d 2004-04-19 devnull return {};
43 0a61c07d 2004-04-19 devnull }
44 0a61c07d 2004-04-19 devnull }
45 0a61c07d 2004-04-19 devnull }
46 0a61c07d 2004-04-19 devnull
47 0a61c07d 2004-04-19 devnull defn eblock(addr)
48 0a61c07d 2004-04-19 devnull {
49 0a61c07d 2004-04-19 devnull addr = addr\i;
50 0a61c07d 2004-04-19 devnull
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);
54 0a61c07d 2004-04-19 devnull addr++;
55 0a61c07d 2004-04-19 devnull }
56 0a61c07d 2004-04-19 devnull return 0;
57 0a61c07d 2004-04-19 devnull }
58 0a61c07d 2004-04-19 devnull
59 0a61c07d 2004-04-19 devnull defn basic(stsrc, ensrc, file)
60 0a61c07d 2004-04-19 devnull {
61 0a61c07d 2004-04-19 devnull local src, text;
62 0a61c07d 2004-04-19 devnull
63 0a61c07d 2004-04-19 devnull if stsrc >= ensrc then
64 0a61c07d 2004-04-19 devnull return {};
65 0a61c07d 2004-04-19 devnull
66 0a61c07d 2004-04-19 devnull print(file, ":", stsrc, ",", ensrc, "\n");
67 0a61c07d 2004-04-19 devnull src = match(file, srcfiles);
68 0a61c07d 2004-04-19 devnull
69 0a61c07d 2004-04-19 devnull if src >= 0 then
70 0a61c07d 2004-04-19 devnull src = srctext[src];
71 0a61c07d 2004-04-19 devnull else
72 0a61c07d 2004-04-19 devnull src = findsrc(file);
73 0a61c07d 2004-04-19 devnull
74 0a61c07d 2004-04-19 devnull if src == {} then
75 0a61c07d 2004-04-19 devnull print("no source for ", file, "\n");
76 0a61c07d 2004-04-19 devnull else {
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;
82 0a61c07d 2004-04-19 devnull }
83 0a61c07d 2004-04-19 devnull }
84 0a61c07d 2004-04-19 devnull }
85 0a61c07d 2004-04-19 devnull
86 0a61c07d 2004-04-19 devnull defn analyse(fnaddr)
87 0a61c07d 2004-04-19 devnull {
88 0a61c07d 2004-04-19 devnull local addr, l, tfn;
89 0a61c07d 2004-04-19 devnull
90 0a61c07d 2004-04-19 devnull new();
91 0a61c07d 2004-04-19 devnull
92 0a61c07d 2004-04-19 devnull tfn = fnbound(fnaddr);
93 0a61c07d 2004-04-19 devnull
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;
97 0a61c07d 2004-04-19 devnull
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));
100 0a61c07d 2004-04-19 devnull
101 0a61c07d 2004-04-19 devnull l = tail l;
102 0a61c07d 2004-04-19 devnull }
103 0a61c07d 2004-04-19 devnull kill(pid);
104 0a61c07d 2004-04-19 devnull }
105 0a61c07d 2004-04-19 devnull
106 0a61c07d 2004-04-19 devnull defn report()
107 0a61c07d 2004-04-19 devnull {
108 0a61c07d 2004-04-19 devnull local addr, l;
109 0a61c07d 2004-04-19 devnull
110 0a61c07d 2004-04-19 devnull new();
111 0a61c07d 2004-04-19 devnull
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;
115 0a61c07d 2004-04-19 devnull
116 0a61c07d 2004-04-19 devnull basic(pcline(addr), eblock(addr), pcfile(addr));
117 0a61c07d 2004-04-19 devnull
118 0a61c07d 2004-04-19 devnull l = tail l;
119 0a61c07d 2004-04-19 devnull }
120 0a61c07d 2004-04-19 devnull kill(pid);
121 0a61c07d 2004-04-19 devnull }
122 0a61c07d 2004-04-19 devnull
123 0a61c07d 2004-04-19 devnull defn stopped(pid)
124 0a61c07d 2004-04-19 devnull {
125 0a61c07d 2004-04-19 devnull return {};
126 0a61c07d 2004-04-19 devnull }
127 0a61c07d 2004-04-19 devnull
128 0a61c07d 2004-04-19 devnull print(acidfile);