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