note
roboticus
<p>[dgsmith_50]:</p>
<p>The following definitely doesn't do everything you want, as it's a quick knockup. It'll need some tuning, but I think you can tweak it into something useful for you:</p>
<c>
$ cat C_preprocessor_light.pl
#!/usr/bin/perl
#
# see perlmonks 951682
#
use strict;
use warnings;
my %DEF;
my @fl_print = (1);
while (<DATA>) {
if (/^\s*#\s*define\s+(\w+)/) { $DEF{$1}=1; }
elsif (/^\s*#\s*undef\s+(\w+)/) { delete $DEF{$1}; }
elsif (/^\s*#\s*ifdef\s+(\w+)/) {
push @fl_print, (exists($DEF{$1}) and $fl_print[-1]);
}
elsif (/^\s*#\s*ifndef\s+(\w+)/){
push @fl_print, (!exists($DEF{$1}) and $fl_print[-1]);
}
elsif (/^\s*#\s*endif/){
pop @fl_print if @fl_print > 1;
}
print if ($fl_print[-1]);
}
__DATA__
/* Foo */
#ifndef BLARG2
BAR
#define BLARG
#define GRAK
zippy
#ifdef BLARG
happy
#ifndef GRAK
lucky
#endif
puppy
#endif
#foo
#endif
bloink
</c>
<p>It doesn't hide exactly the lines I would want to hide, but it's close...</p>
<p>...[roboticus]</p>
<p><i>When your only tool is a hammer, all problems look like your thumb.</i></p>
951682
951682