Home | History | Annotate | Line # | Download | only in cf
roken-h-process.pl revision 1.1.1.2
      1      1.1     elric #!/usr/bin/perl
      2      1.1     elric 
      3  1.1.1.2  christos use Getopt::Std;
      4      1.1     elric 
      5      1.1     elric my $debug = 0;
      6      1.1     elric 
      7  1.1.1.2  christos getopts('dc:p:o:') || die "foo";
      8      1.1     elric 
      9      1.1     elric if ($opt_d) {
     10      1.1     elric     $debug = 1;
     11      1.1     elric }
     12      1.1     elric 
     13      1.1     elric die "missing arg" if (!defined $opt_c || !defined $opt_p || !defined $opt_o);
     14      1.1     elric 
     15      1.1     elric my %defines;
     16      1.1     elric my $IN;
     17      1.1     elric my $OUT;
     18      1.1     elric 
     19      1.1     elric print "parse config.h\n" if ($debug);
     20      1.1     elric 
     21      1.1     elric open IN, $opt_c || die "failed open ${opt_c}";
     22      1.1     elric 
     23      1.1     elric my @nesting;
     24      1.1     elric 
     25      1.1     elric push @nesting, 1;
     26      1.1     elric 
     27      1.1     elric while (<IN>) {
     28      1.1     elric     if (m/\s*#ifdef\s+(.*)/) {
     29      1.1     elric 	my $var = $1;
     30      1.1     elric 	if (defined $defines{$var}) {
     31      1.1     elric 	    push @nesting, 1;
     32      1.1     elric 	} else {
     33      1.1     elric 	    push @nesting, 0;
     34      1.1     elric 	}
     35      1.1     elric 	next;
     36      1.1     elric     } elsif (m/\s*#ifndef\s+(.*)/) {
     37      1.1     elric 	my $var = $1;
     38      1.1     elric 	if (defined $defines{$var}) {
     39      1.1     elric 	    push @nesting, 0;
     40      1.1     elric 	} else {
     41      1.1     elric 	    push @nesting, 1;
     42      1.1     elric 	}
     43      1.1     elric 	next;
     44      1.1     elric     } elsif (m/\s*#else/) {
     45      1.1     elric 	my $var = pop @nesting;
     46      1.1     elric 	$var = !$var;
     47      1.1     elric 	push @nesting, $var;
     48      1.1     elric 	next;
     49      1.1     elric     } elsif ($nesting[$#nesting] and m/\s*#define\s+(\w+)\s+(\S+)/) {
     50      1.1     elric 	my $res = $2;
     51      1.1     elric 	$res = 1 if (!defined $res);
     52      1.1     elric 	$defines{$1} = $res;
     53      1.1     elric     }
     54      1.1     elric }
     55      1.1     elric 
     56      1.1     elric close IN;
     57      1.1     elric 
     58      1.1     elric if ($debug) {
     59      1.1     elric     foreach my $i (keys %defines) {
     60      1.1     elric 	print "k: $i v: $defines{$i}\n";
     61      1.1     elric     }
     62      1.1     elric }
     63      1.1     elric 
     64      1.1     elric open IN, "$opt_p" || die "failed open ${opt_p}";
     65      1.1     elric open OUT, ">$opt_o" || die "failed open ${opt_o}";
     66      1.1     elric 
     67      1.1     elric print "parse roken.h.in\n" if ($debug);
     68      1.1     elric 
     69      1.1     elric print OUT "/* This is an OS dependent, generated file */\n";
     70      1.1     elric print OUT "\n";
     71      1.1     elric print OUT "\n";
     72      1.1     elric print OUT "#ifndef __ROKEN_H__\n";
     73      1.1     elric print OUT "#define __ROKEN_H__\n";
     74      1.1     elric print OUT "\n";
     75      1.1     elric 
     76      1.1     elric @nesting = (1);
     77      1.1     elric 
     78      1.1     elric while (<IN>) {
     79      1.1     elric     if (m/\s*#ifdef\s+(.*)/) {
     80      1.1     elric 	my $var = $1;
     81      1.1     elric 	if (defined $defines{$var}) {
     82      1.1     elric 	    push @nesting, 1;
     83      1.1     elric 	} else {
     84      1.1     elric 	    push @nesting, 0;
     85      1.1     elric 	}
     86      1.1     elric 	next;
     87      1.1     elric     } elsif (m/\s*#ifndef\s+(.*)/) {
     88      1.1     elric 	my $var = $1;
     89      1.1     elric 	if (defined $defines{$var}) {
     90      1.1     elric 	    push @nesting, 0;
     91      1.1     elric 	} else {
     92      1.1     elric 	    push @nesting, 1;
     93      1.1     elric 	}
     94      1.1     elric 	next;
     95      1.1     elric     } elsif (m/\s*#if\s+(.*)/) {
     96      1.1     elric 	my $res = parse_if($1);
     97      1.1     elric 	print "line = $res: $1\n" if ($debug);
     98      1.1     elric 	push @nesting, $res;
     99      1.1     elric 	next;
    100      1.1     elric     } elsif (m/\s*#elif\s+(.*)/) {
    101      1.1     elric 	my $res = pop @nesting;
    102      1.1     elric 	if ($res gt 0) {
    103      1.1     elric 	    $res = -1;
    104      1.1     elric 	} else {
    105      1.1     elric 	    my $res = parse_if($1);
    106      1.1     elric 	}
    107      1.1     elric 	push @nesting, $res;
    108      1.1     elric 	next;
    109      1.1     elric     } elsif (m/\s*#else/) {
    110      1.1     elric 	my $var = pop @nesting;
    111      1.1     elric 	$var = !$var;
    112      1.1     elric 	push @nesting, $var;
    113      1.1     elric 	next;
    114      1.1     elric     } elsif (m/\s*#endif/) {
    115      1.1     elric 	pop @nesting;
    116      1.1     elric 	next;
    117      1.1     elric     }
    118      1.1     elric     print "line: $_\n"  if ($debug);
    119      1.1     elric     print "nesting dep $#{nesting}\n"  if ($debug);
    120      1.1     elric     my $i = 0, $t = 1;
    121      1.1     elric     while ($i le $#nesting) {
    122      1.1     elric 	$t = 0 if ($nesting[$i] le 0);
    123      1.1     elric 	print "nesting $i val $nesting[$i] -> $t\n" if ($debug);
    124      1.1     elric 	$i++;
    125      1.1     elric     }
    126      1.1     elric     if ($t) {
    127      1.1     elric 	print OUT;
    128      1.1     elric     }
    129      1.1     elric }
    130      1.1     elric 
    131      1.1     elric print OUT "\n";
    132      1.1     elric print OUT "#endif /* __ROKEN_H__ */\n";
    133      1.1     elric 
    134      1.1     elric 
    135      1.1     elric close IN;
    136      1.1     elric 
    137      1.1     elric exit 0;
    138      1.1     elric 
    139      1.1     elric sub parse_if
    140      1.1     elric {
    141      1.1     elric     my ($neg, $var);
    142      1.1     elric 
    143      1.1     elric     $_ = shift;
    144      1.1     elric 
    145      1.1     elric     if (m/^\s*$/) {
    146      1.1     elric 	print "end $_\n" if ($debug);
    147      1.1     elric 	return 1;
    148  1.1.1.2  christos     } elsif (m/^\(([^&]+)\&\&(.*)\)\s*\|\|\s*\(([^&]+)\&\&(.*)\)$/) {
    149  1.1.1.2  christos 	print "($1 and $2) or ($3 and $4)\n" if ($debug);
    150  1.1.1.2  christos 	return ((parse_if($1) and parse_if($2)) or (parse_if($3) and parse_if($4)));
    151      1.1     elric     } elsif (m/^([^&]+)\&\&(.*)$/) {
    152      1.1     elric 	print "$1 and $2\n" if ($debug);
    153      1.1     elric 	return parse_if($1) and parse_if($2);
    154      1.1     elric     } elsif (m/^([^\|]+)\|\|(.*)$/) {
    155      1.1     elric 	print "$1 or $2\n" if ($debug);
    156  1.1.1.2  christos 	return (parse_if($1) or parse_if($2));
    157      1.1     elric     } elsif (m/^\s*(\!)?\s*defined\((\w+)\)/) {
    158      1.1     elric 	($neg, $var) = ($1, $2);
    159      1.1     elric 	print "def: ${neg}-defined(${var})\n" if ($debug);
    160      1.1     elric 	my $res = defined $defines{$var};
    161      1.1     elric 	if ($neg eq "!") {
    162      1.1     elric 	    if ($res) {
    163      1.1     elric 		$res = 0;
    164      1.1     elric 	    } else {
    165      1.1     elric 		$res = 1;
    166      1.1     elric 	    }
    167      1.1     elric 	}
    168      1.1     elric 	print "res: $res\n" if ($debug);
    169      1.1     elric 	return $res;
    170      1.1     elric     } elsif (m/^\s*(\!)?(\w+)/) {
    171      1.1     elric 	($neg, $var) = ($1, $2);
    172      1.1     elric 	print "var: $neg $var\n" if ($debug);
    173      1.1     elric 	my $res;
    174      1.1     elric 	if (defined $defines{$var}) {
    175      1.1     elric 	    $res = $defines{$var};
    176      1.1     elric 	} else {
    177      1.1     elric 	    $res = 0;
    178      1.1     elric 	}
    179      1.1     elric 	$res = ! $res if ($neg =~ m/!/);
    180      1.1     elric 	print "res: $res\n" if ($debug);
    181      1.1     elric 	return $res;
    182      1.1     elric     }
    183      1.1     elric     die "failed parse: $_\n";
    184      1.1     elric }
    185