1*fb3ef04dSDag-Erling Smørgrav#!/usr/bin/perl 2*fb3ef04dSDag-Erling Smørgrav 3*fb3ef04dSDag-Erling Smørgravuse warnings; 4*fb3ef04dSDag-Erling Smørgravuse strict; 5*fb3ef04dSDag-Erling Smørgrav 6*fb3ef04dSDag-Erling Smørgravif (@ARGV != 2) { 7*fb3ef04dSDag-Erling Smørgrav die <<END; 8*fb3ef04dSDag-Erling Smørgravusage: ifdef-how <file> <line> 9*fb3ef04dSDag-Erling Smørgrav 10*fb3ef04dSDag-Erling SmørgravPrint the sequence of preprocessor conditionals which lead to the 11*fb3ef04dSDag-Erling Smørgravgiven line being retained after preprocessing. There is no output 12*fb3ef04dSDag-Erling Smørgravif the line is always retained. Conditionals that must be true are 13*fb3ef04dSDag-Erling Smørgravprinted verbatim; conditionals that musy be false have their 14*fb3ef04dSDag-Erling Smørgravpreprocessor keyword prefixed with NOT. 15*fb3ef04dSDag-Erling Smørgrav 16*fb3ef04dSDag-Erling SmørgravWarning: this program does not parse comments or strings, so it will 17*fb3ef04dSDag-Erling Smørgravnot handle tricky code correctly. 18*fb3ef04dSDag-Erling SmørgravEND 19*fb3ef04dSDag-Erling Smørgrav} 20*fb3ef04dSDag-Erling Smørgrav 21*fb3ef04dSDag-Erling Smørgravmy $file = shift; 22*fb3ef04dSDag-Erling Smørgravmy $line = shift; 23*fb3ef04dSDag-Erling Smørgrav 24*fb3ef04dSDag-Erling Smørgravopen my $fh, '<', $file 25*fb3ef04dSDag-Erling Smørgrav or die "ifdef-how: open $file: $!\n"; 26*fb3ef04dSDag-Erling Smørgrav 27*fb3ef04dSDag-Erling Smørgravmy @stack; 28*fb3ef04dSDag-Erling Smørgravwhile (<$fh>) { 29*fb3ef04dSDag-Erling Smørgrav last if $. == $line; 30*fb3ef04dSDag-Erling Smørgrav if (m{^\s*#\s*(if|ifdef|ifndef)\b}) { 31*fb3ef04dSDag-Erling Smørgrav push @stack, $_; 32*fb3ef04dSDag-Erling Smørgrav } 33*fb3ef04dSDag-Erling Smørgrav if (m{^\s*#\s*(elif|else)\b}) { 34*fb3ef04dSDag-Erling Smørgrav $stack[-1] =~ s{^(\s*#\s*)(?!NOT)\b}{${1}NOT}gm; 35*fb3ef04dSDag-Erling Smørgrav $stack[-1] .= $_; 36*fb3ef04dSDag-Erling Smørgrav } 37*fb3ef04dSDag-Erling Smørgrav if (m{^\s*#\s*endif\b}) { 38*fb3ef04dSDag-Erling Smørgrav pop @stack; 39*fb3ef04dSDag-Erling Smørgrav } 40*fb3ef04dSDag-Erling Smørgrav} 41*fb3ef04dSDag-Erling Smørgrav 42*fb3ef04dSDag-Erling Smørgravprint @stack; 43