| 
#!/usr/local/plan9/bin/rc
rfork e
fn usage {
	echo 'usage: noifdefs [-DFOO]... [file]...' >[1=2]
	exit usage
}
defs=()
ifs='
'
while(! ~ $#* 0 && ~ $1 -* && ! ~ $1 --){
	switch($1){
	case -D
		if(~ $#* 1)
			usage
		defs=($defs $2)
		shift
		shift
	case -D*
		x=`{echo $1 | sed s/-D//}
		defs=($defs $x)
		shift
	case *
		usage
	}
}
if(~ $1 --)
	shift
{
	for(i in $defs)
		echo '#define '^$i
	echo '#show'
	cat $*
} | awk '
BEGIN{
	show = 0
	skipping = 0
	depth = 0
}
{ prag = "" }
/^#[ 	]+/ { prag = $2; arg = $3 }
/^#[a-z]+/ { prag = substr($1, 2); arg = $2 }
prag=="if" { isif[depth] = 1; sat[depth++] = skipping; }
prag=="ifdef" { isif[depth] = 0; sat[depth++] = skipping; if(!defs[arg]) skipping = 1; next }
prag=="ifndef" { isif[depth] = 0; sat[depth++] = skipping; if(defs[arg]) skipping = 1; next }
prag=="else" && !isif[depth-1] { if(!sat[depth-1]) skipping = !skipping; next }
prag=="endif" { skipping = sat[--depth]; if(!isif[depth]) next }
prag=="define" { defs[arg] = 1 }
prag=="undef" { delete defs[arg] }
show==0 && /^#show/ { show = 1; next }
!show || skipping { next }
{ print }
'
 |