roken-h-process.pl 3.3 KB

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