Re: comment enlever des #define ?

Top Page

Reply to this message
Author: Edgar Bonet
Date:  
To: Liste Guilde
Subject: Re: comment enlever des #define ?
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";
}