]> mj.ucw.cz Git - libucw.git/commitdiff
Support for the following syntax in configuration files:
authorPavel Charvat <pavel.charvat@netcentrum.cz>
Wed, 17 Jan 2007 00:20:56 +0000 (01:20 +0100)
committerPavel Charvat <pavel.charvat@netcentrum.cz>
Wed, 17 Jan 2007 00:20:56 +0000 (01:20 +0100)
#if CONFIG_ABC || !CONFIG_DEF
#elsif (CONFIG_GHI && CONFIG_JKL) || CONFIG_MNO
#else
#endif

Alternatively I can cache it to C-like "defined(CONFIG_ABC)"
(CONFIG_ABC alone could expand to its value)
or to pure Perl code without substitutions.

build/genconf

index 0d7bc7370e24dd0b423a940c5265cf0e2dd385fb..75c957fe10a9c8490452ac0b16d215e419748be1 100755 (executable)
@@ -15,6 +15,9 @@ while (<CF>) {
 }
 close CF;
 
+my $opt_regex = join("|", keys %options);
+sub eval_expr { $_ = "@_"; s/\b($opt_regex)\b/ 1 /g if $opt_regex; s/\bCONFIG_\w+\b/ 0 /g; return eval $_; }
+
 open IN, $ARGV[0] or die "Unable to open $ARGV[0]";
 open OUT, ">$ARGV[1]" or die "Unable to create $ARGV[1]";
 my @ifs = ();  # stack of conditions, 1=satisfied, -1=unsatisfied, 0=shadowed
@@ -24,12 +27,18 @@ while (<IN>) {
                push @ifs, (@ifs && $ifs[$#ifs] <= 0) ? 0 : (defined $options{$1}) ? 1 : -1;
        } elsif (/^#ifndef\s+(\w+)/) {
                push @ifs, (@ifs && $ifs[$#ifs] <= 0) ? 0 : (defined $options{$1}) ? -1 : 1;
+       } elsif (/^#if\s(.*)$/) {
+               push @ifs, (@ifs && $ifs[$#ifs] <= 0) ? 0 : (eval_expr $1) ? 1 : -1;
        } elsif (/^#endif/) {
                defined pop @ifs || die "Improper nesting of conditionals";
        } elsif (/^#else/) {
                my $x = pop @ifs;
                defined $x || die "Improper nesting of conditionals";
-               push @ifs, -$x;
+               push @ifs, $x >= 0 ? 0 : 1;
+       } elsif (/^#elsif\s(.*)$/) {
+               my $x = pop @ifs;
+               defined $x || die "Improper nesting of conditionals";
+               push @ifs, $x >= 0 ? 0 : (eval_expr $1) ? 1 : -1;
        } else {
                @ifs && $ifs[$#ifs] <= 0 && next;
                if (/^$/) {