xref: /freebsd/contrib/unifdef/ifdef-how.pl (revision fb3ef04d2028110f06d68b09009f1f2ca0f4128e)
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