|  | # 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" | 
|  | } | 
|  |  | 
|  | 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 = "" | 
|  | } | 
|  |  |