ref: 4cd46e8601a04d2dc4fa91f95f5be4be14943c96
dir: /sys/lib/acid/coverage/
// Coverage library
defn coverage()
{
	local lmap, lp, e, pc, n, l;
	new();
	bblock = {};
	// find the first location in the text
	e = (map()[0][1])\i;
	while e < etext-4 do {
		l = follow(e);
		if tail l != {} then {
			if match(l[0], bblock) < 0 then
				bblock = append bblock, l[0];
			if match(l[1], bblock) < 0 then
				bblock = append bblock, l[1];
		}
		e++;
	}
	l = bblock;
	while l != {} do {
		*fmt(head l, bpfmt) = bpinst;
		l = tail l;
	}
	while 1 do {
		cont();
		pc = *PC;
		n = match(pc, bblock);
		if n >= 0 then {
			pc = fmt(pc, bpfmt);
			*pc = @pc;
			bblock = delete bblock, n;
		}
		else {
			pstop(pid);
			return {};
		}
	}
}
defn eblock(addr)
{
	addr = addr\i;
	while addr < etext do {
		if (tail follow(addr)) != {} then
			return pcline(addr);
		addr++;
	}
	return 0;
}
defn basic(stsrc, ensrc, file)
{
	local src, text;
	if stsrc >= ensrc then
		return {};
	print(file, ":", stsrc, ",", ensrc, "\n");
	src = match(file, srcfiles);
	if src >= 0 then
		src = srctext[src];
	else
		src = findsrc(file);
	if src == {} then
		print("no source for ", file, "\n");
	else {
		while stsrc <= ensrc do {
			text = src[stsrc];
			if text != {} then
				print("\t", stsrc, ":", text, "\n");
			stsrc = stsrc+1;
		}
	}
}
defn analyse(fnaddr)
{
	local addr, l, tfn;
	new();
	tfn = fnbound(fnaddr);
	l = bblock;
	while l do {
		addr = head l;
		if addr >= tfn[0] && addr < tfn[1] then
			basic(pcline(addr), eblock(addr), pcfile(addr));
		
		l = tail l;
	}
	kill(pid);
}
defn report()
{
	local addr, l;
	new();
	l = bblock;
	while l do {
		addr = head l;
		basic(pcline(addr), eblock(addr), pcfile(addr));
		
		l = tail l;
	}
	kill(pid);
}
defn stopped(pid)
{
	return {};
}
print("/sys/lib/acid/coverage");