don't clean out crypto-headers.h, its a static file
[heimdal.git] / cf / roken-h-process.pl
blob2c4e305edf108ee00e97bdd97855cbe165e9f4a7
1 #!/usr/bin/perl
3 require 'getopts.pl';
5 my $debug = 0;
7 Getopts('dc:p:o:') || die "foo";
9 if ($opt_d) {
10 $debug = 1;
13 die "missing arg" if (!defined $opt_c || !defined $opt_p || !defined $opt_o);
15 my %defines;
16 my $IN;
17 my $OUT;
19 print "parse config.h\n" if ($debug);
21 open IN, $opt_c || die "failed open ${opt_c}";
23 my @nesting;
25 push @nesting, 1;
27 while (<IN>) {
28 if (m/\s*#ifdef\s+(.*)/) {
29 my $var = $1;
30 if (defined $defines{$var}) {
31 push @nesting, 1;
32 } else {
33 push @nesting, 0;
35 next;
36 } elsif (m/\s*#ifndef\s+(.*)/) {
37 my $var = $1;
38 if (defined $defines{$var}) {
39 push @nesting, 0;
40 } else {
41 push @nesting, 1;
43 next;
44 } elsif (m/\s*#else/) {
45 my $var = pop @nesting;
46 $var = !$var;
47 push @nesting, $var;
48 next;
49 } elsif ($nesting[$#nesting] and m/\s*#define\s+(\w+)\s+(\S+)/) {
50 my $res = $2;
51 $res = 1 if (!defined $res);
52 $defines{$1} = $res;
56 close IN;
58 if ($debug) {
59 foreach my $i (keys %defines) {
60 print "k: $i v: $defines{$i}\n";
64 open IN, "$opt_p" || die "failed open ${opt_p}";
65 open OUT, ">$opt_o" || die "failed open ${opt_o}";
67 print "parse roken.h.in\n" if ($debug);
69 print OUT "/* This is an OS dependent, generated file */\n";
70 print OUT "\n";
71 print OUT "\n";
72 print OUT "#ifndef __ROKEN_H__\n";
73 print OUT "#define __ROKEN_H__\n";
74 print OUT "\n";
76 @nesting = (1);
78 while (<IN>) {
79 if (m/\s*#ifdef\s+(.*)/) {
80 my $var = $1;
81 if (defined $defines{$var}) {
82 push @nesting, 1;
83 } else {
84 push @nesting, 0;
86 next;
87 } elsif (m/\s*#ifndef\s+(.*)/) {
88 my $var = $1;
89 if (defined $defines{$var}) {
90 push @nesting, 0;
91 } else {
92 push @nesting, 1;
94 next;
95 } elsif (m/\s*#if\s+(.*)/) {
96 my $res = parse_if($1);
97 print "line = $res: $1\n" if ($debug);
98 push @nesting, $res;
99 next;
100 } elsif (m/\s*#elif\s+(.*)/) {
101 my $res = pop @nesting;
102 if ($res gt 0) {
103 $res = -1;
104 } else {
105 my $res = parse_if($1);
107 push @nesting, $res;
108 next;
109 } elsif (m/\s*#else/) {
110 my $var = pop @nesting;
111 $var = !$var;
112 push @nesting, $var;
113 next;
114 } elsif (m/\s*#endif/) {
115 pop @nesting;
116 next;
118 print "line: $_\n" if ($debug);
119 print "nesting dep $#{nesting}\n" if ($debug);
120 my $i = 0, $t = 1;
121 while ($i le $#nesting) {
122 $t = 0 if ($nesting[$i] le 0);
123 print "nesting $i val $nesting[$i] -> $t\n" if ($debug);
124 $i++;
126 if ($t) {
127 print OUT;
131 print OUT "#define ROKEN_VERSION " . $defines{"PACKAGE_VERSION"} . "\n";
132 print OUT "\n";
133 print OUT "#endif /* __ROKEN_H__ */\n";
136 close IN;
138 exit 0;
140 sub parse_if
142 my ($neg, $var);
144 $_ = shift;
146 if (m/^\s*$/) {
147 print "end $_\n" if ($debug);
148 return 1;
149 } elsif (m/^([^&]+)\&\&(.*)$/) {
150 print "$1 and $2\n" if ($debug);
151 return parse_if($1) and parse_if($2);
152 } elsif (m/^([^\|]+)\|\|(.*)$/) {
153 print "$1 or $2\n" if ($debug);
154 return parse_if($1) or parse_if($2);
155 } elsif (m/^\s*(\!)?\s*defined\((\w+)\)/) {
156 ($neg, $var) = ($1, $2);
157 print "def: ${neg}-defined(${var})\n" if ($debug);
158 my $res = defined $defines{$var};
159 if ($neg eq "!") {
160 if ($res) {
161 $res = 0;
162 } else {
163 $res = 1;
166 print "res: $res\n" if ($debug);
167 return $res;
168 } elsif (m/^\s*(\!)?(\w+)/) {
169 ($neg, $var) = ($1, $2);
170 print "var: $neg $var\n" if ($debug);
171 my $res;
172 if (defined $defines{$var}) {
173 $res = $defines{$var};
174 } else {
175 $res = 0;
177 $res = ! $res if ($neg =~ m/!/);
178 print "res: $res\n" if ($debug);
179 return $res;
181 die "failed parse: $_\n";