| # Summarize the installation log, printing errors along with | 
 | # enough context to make sense of them. | 
 |  | 
 | BEGIN { | 
 | #	print verbose  | 
 | 	cd = "" | 
 | 	out = "/dev/stdout" | 
 | 	statuslen = 0 | 
 | 	debug = 0 | 
 | 	updates = "/dev/stderr" | 
 | 	if(ENVIRON["winid"] != "") # running in acme window | 
 | 		updates = "" | 
 | } | 
 |  | 
 | function myflush(f) | 
 | { | 
 | 	# fflush is not available on sun, but system("") appears to work everywhere | 
 | 	system("") | 
 | } | 
 |  | 
 | function clearstatus(noflush, i) | 
 | { | 
 | 	if(!updates) | 
 | 		return | 
 | 	for(i=0; i<statuslen; i++) | 
 | 		printf("\b \b") >updates | 
 | 	statuslen = 0 | 
 | 	if(!noflush) | 
 | 		myflush(updates) | 
 | } | 
 |  | 
 | function status(s) | 
 | { | 
 | 	if(!updates) | 
 | 		return | 
 | 	clearstatus(1) | 
 | 	printf("    %s ", s) >updates | 
 | 	statuslen = length(s)+5 | 
 | 	myflush(updates) | 
 | } | 
 |  | 
 | debug!=0 { print "# " $0 } | 
 |  | 
 | /^$/ { next } | 
 |  | 
 | /^echo cd / { next } | 
 | /^\+\+ pwd/ { next } | 
 |  | 
 | /^\* /{ | 
 | 	clearstatus() | 
 | 	if(debug) print "% mark" | 
 | 	print >out | 
 | 	myflush(out) | 
 | 	if(copy){ | 
 | 		print >copy | 
 | 		myflush(copy) | 
 | 	} | 
 | 	cmd = "" | 
 | 	printtabs = 1	# print indented lines immediately following | 
 | 	errors = 0 | 
 | 	next | 
 | } | 
 |  | 
 | /^	/ && printtabs!=0 { | 
 | 	clearstatus() | 
 | 	print >out | 
 | 	myflush(out) | 
 | 	if(copy){ | 
 | 		print >copy | 
 | 		myflush(copy) | 
 | 	} | 
 | 	next | 
 | } | 
 |  | 
 | { printtabs = 0 } | 
 |  | 
 | /^(9a|9c|9l|9ar|9?install|cat pdf|cp|rm|mv|mk|9 yacc|9 lex|9 rc|do|for i|if|mk|gcc|cpp|cp|sh|cmp|rc|\.\/o)($|[^:])/ { | 
 | 	if(debug) print "% start" | 
 | 	errors = 0 | 
 | 	cmd = "" | 
 | 	if(!verbose) | 
 | 		cmd = cmd cd | 
 | 	cmd = cmd $0 "\n" | 
 | 	next | 
 | } | 
 |  | 
 | /^cd .+; mk .+/ && !verbose { | 
 | 	dir = $2 | 
 | 	sub(/;$/, "", dir) | 
 | 	status(dir " mk " $4) | 
 | } | 
 |  | 
 | /^cd / { | 
 | 	if(debug) print "% cd" | 
 | 	errors = 0 | 
 | 	if(verbose){ | 
 | 		print >out | 
 | 		myflush(out) | 
 | 		if(copy){ | 
 | 			print >copy | 
 | 			myflush(copy) | 
 | 		} | 
 | 	} | 
 | 	cd = $0 "\n" | 
 | 	cmd = "" | 
 | 	next | 
 | } | 
 |  | 
 | { | 
 | 	cmd = cmd $0 "\n" | 
 | } | 
 |  | 
 | errors != 0 { | 
 | 	clearstatus() | 
 | 	if(debug) print "% errors" | 
 | 	printf "%s", cmd >out | 
 | 	myflush(out) | 
 | 	if(copy){ | 
 | 		printf "%s", cmd >copy | 
 | 		myflush(copy) | 
 | 	} | 
 | 	cmd = "" | 
 | 	next | 
 | } | 
 |  | 
 | /^(	|then|else|fi|done|[ar] - [^ ]*\.o$)/ { | 
 | 	next | 
 | } | 
 |  | 
 | /^(conflicts:)/ { | 
 | 	if(debug) print "% skip1" | 
 | 	next | 
 | } | 
 |  | 
 | /(up to date|nothing to see|assuming it will be|loop not entered)/ { | 
 | 	next | 
 | } | 
 |  | 
 | /(nodes\(%e\)|packed transitions)/ { | 
 | 	if(debug) print "% skip2" | 
 | 	next | 
 | } | 
 |  | 
 | {  | 
 | 	# unexpected line  | 
 | 	clearstatus() | 
 | 	if(debug) print "% errors1" | 
 | 	errors = 1 | 
 | 	printf ">>> %s", cmd >out | 
 | 	myflush(out) | 
 | 	if(copy){ | 
 | 		printf ">>> %s", cmd >copy | 
 | 		myflush(copy) | 
 | 	} | 
 | 	cmd = "" | 
 | } | 
 |  |