Le jeudi 21 juillet, Xavier Bestel a écrit :
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
>
> [...]
Voici une version Perl légèrement inspirée de ce code.
Edgar.
--
Edgar Bonet Maison : 04 76 21 29 16 Bureau : 04 76 88 10 96
3 rue Jean Prévost Mobile : 06 77 19 79 39 Fax : 04 76 88 11 91
38000 Grenoble guilde@??? www.edgar-bonet.org
#!/usr/bin/perl -w
while ($_ = $ARGV[0]) {
if (/^-D(\w+)$/) {
$accept{$1} = 1;
shift;
}
elsif (/^-U(\w+)$/) {
$reject{$1} = 1;
shift;
}
elsif (/^-/) {
die "Usage: defines [-DDEFINE] [-UDEFINE] ... input > output";
}
else { last; }
}
%known = (%accept, %reject);
while (<>) {
if (/^\s*#\s*if(n?)def\s+(\w+)/) { #if[n]def OPTION
$opt = {name => $2, sign => $1?-1:+1};
push @options, $opt;
$skip++ if $reject{$opt->{name}};
next if $known{$opt->{name}};
}
if (/^\s*#\s*if\b/) { #if ...
push @options, {name => 0, sign => -1};
}
elsif (/^\s*#\s*else\b$/) { #else
$opt = $options[$#options];
$opt->{sign} *= -1;
$skip++ if $accept{$opt->{name}};
$skip-- if $reject{$opt->{name}};
next if $known{$opt->{name}};
}
elsif (/^\s*#\s*endif\b$/) { #endif
$opt = pop @options;
if (!defined($opt)) {
die "Error: unbalanced #if... #endif\n";
}
$skip-- if $accept{$opt->{name}} && $opt->{sign} == -1
|| $reject{$opt->{name}} && $opt->{sign} == +1;
next if $known{$opt->{name}};
}
print unless $skip;
}
if (defined(pop @options)) {
die "Error: unbalanced #if... #endif\n";
}