$scndlastline = "";
$lastline = "";
+$eat = 0;
+$multiline = 0;
+
foreach $line (@lines) {
- if (($line =~ /^\#/) ) {
+ if ($line =~ /\#ifdef __cplusplus/) {
+# There is extern "C" in some header files guarded by #ifdef __cplusplus
+# crecoder does not grok the extern "C", so remove thses three lines.
+ $eat = 2;
+ } elsif ($eat > 0) {
+ $eat = $eat -1;
+ } elsif ($line =~ /wchar_t/) {
+ # of course crecoder cannot handle wchar_t, what else?
+ } elsif ($multiline > 0) {
+ # this line connects a previous one, kill it
+ if ($line =~ /\\$/) {
+ $multiline = 1;
+ } else {
+ $multiline = 0;
+ }
+ } elsif ($line =~ /^\#/) {
# eat the line
$scndlastline = $lastline;
$lastline = $line;
- } elsif ($openbracket == 1) {
+ if ($line =~ /\\$/) {
+ $multiline = 1;
+ } else {
+ $multiline = 0;
+ }
+ } elsif ($openbracket >= 1) {
print TDF "$line";
- if ((index($line, "}") > -1)) {
- $openbracket = 0;
- if (($guardedtypedef == 1)) {
- print TDF "#endif\n";
- $guardedtypedef = 0;
+ $openbracket += num_brackets($line);
+ if ($openbracket == 0) {
+ if (($guardedtypedef == 1)) {
+ print TDF "#endif\n";
+ $guardedtypedef = 0;
}
}
$lastline = "";
print TDF "$lastline"; $lastline = "";
}
print TDF "$line";
- if ((index($line, "{") > -1)) {
- $openbracket = 1;
- } elsif (($guardedtypedef == 1)) {
- print TDF "#endif\n";
- $guardedtypedef = 0;
- }
- if ((index($line, "}") > -1)) {
- $openbracket = 0;
+ $openbracket += num_brackets($line);
+ if ($openbracket == 0) {
if (($guardedtypedef == 1)) {
- print TDF "#endif\n";
+ print TDF "#endif\n";
$guardedtypedef = 0;
}
}
- } elsif ($line =~ /extern "C"/) {
- print OUT "/* extern C */ {";
} else {
print OUT "$line";
$scndlastline = $lastline;
close(TDF);
close(OUT);
+
+# count the bracket ballance
+sub num_brackets {
+ my $line = shift;
+ my $lastpos;
+ my $cnt = 0;
+
+ $lastpos = -1;
+ while(1) {
+ $lastpos = index($line, "{", $lastpos+1);
+ if ($lastpos < 0) {
+ last;
+ }
+ $cnt++;
+ }
+ $lastpos = -1;
+ while(1) {
+ $lastpos = index($line, "(", $lastpos+1);
+ if ($lastpos < 0) {
+ last;
+ }
+ $cnt++;
+ }
+ $lastpos = -1;
+ while(1) {
+ $lastpos = index($line, "}", $lastpos+1);
+ if ($lastpos < 0) {
+ last;
+ }
+ $cnt--;
+ }
+ $lastpos = -1;
+ while(1) {
+ $lastpos = index($line, ")", $lastpos+1);
+ if ($lastpos < 0) {
+ last;
+ }
+ $cnt--;
+ }
+ return $cnt;
+}