git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@351 379699f6-c40d-0410-875b-85095c16579estable
parent
6eab48d761
commit
2158dd232d
@ -0,0 +1,107 @@ |
||||
#!/usr/bin/perl |
||||
|
||||
# This is a program to allow preprocessing of java files. The key idea is, |
||||
# not to have a file that must go through the preprocessor, but to work on |
||||
# the java files directly and make use of comments. |
||||
# |
||||
# The comments all have the form /// to distinguish them from normal |
||||
# comments. You should use such comments yourself. |
||||
# |
||||
# Usage is simple: jcpp -Ddefine1 -Ddefine2 first.java second.java |
||||
# The files should contain comments of the form |
||||
# |
||||
# ///#ifdef JDK12 |
||||
# jdk1.2 code |
||||
# ///#else |
||||
# jdk1.1 code |
||||
# ///#endif |
||||
# |
||||
# After running jcpp the false branch is commented out. If the true |
||||
# branch was commented out it will get commented in. |
||||
|
||||
my @files; |
||||
my %defs; |
||||
|
||||
for (@ARGV) { |
||||
if ($_ =~ /^-D([^=]*)$/) { |
||||
$defs{$1} = 1; |
||||
} elsif ($_ =~ /^-D([^=]*)=([^=]*)$/) { |
||||
$defs{$1} = $2; |
||||
} else { |
||||
push @files, $_; |
||||
} |
||||
} |
||||
|
||||
for (@files) { |
||||
my $file = $_; |
||||
my $branch = "none"; |
||||
my $level = 0; |
||||
rename "$file", "$file.orig" or do { |
||||
print STDERR "Can't open file $file\n"; |
||||
next; |
||||
}; |
||||
open OLD, "<$file.orig"; |
||||
open NEW, ">$file"; |
||||
my $linenr = 0; |
||||
while (<OLD>) { |
||||
$linenr++; |
||||
if (/^\/\/\/\#/) { |
||||
# This is a directive. First we print it out. |
||||
print NEW $_; |
||||
if (/^\/\/\/\#ifdef (\S*)$/) { |
||||
my $label=$1; |
||||
# An ifdef directive, look if -D is defined, but only |
||||
# if we are not in a false branch. In a false branch |
||||
# we simply increase level. |
||||
if ($branch eq "false") { |
||||
$level++; |
||||
} else { |
||||
if (defined $defs{$label}) { |
||||
$branch = "true"; |
||||
} else { |
||||
$branch = "false"; |
||||
$level = 0; |
||||
} |
||||
} |
||||
} elsif (/^\/\/\/\#else/) { |
||||
# An else directive. We switch from true to false and |
||||
# if level is zero we switch from false to true |
||||
if ($branch eq "true") { |
||||
$branch = "false"; |
||||
$level = 0; |
||||
} elsif ($branch eq "false") { |
||||
$branch = "true" if ($level == 0); |
||||
} else { |
||||
# An else outside of any directives; warn. |
||||
print STDERR "$file: $linenr: ignoring unmatched $_"; |
||||
} |
||||
} elsif (/^\/\/\/\#endif/) { |
||||
if ($branch eq "none") { |
||||
# An endif outside of any directives; warn. |
||||
print STDERR "$file: $linenr: ignoring unmatched $_"; |
||||
} elsif ($branch eq "false") { |
||||
$branch = "true" if ($level-- == 0); |
||||
} |
||||
} else { |
||||
print STDERR "$file: $linenr: ignoring unknown directive $_"; |
||||
} |
||||
} elsif (/^\/\/\/(.*)/) { |
||||
$line = $1; |
||||
if ($branch eq "true") { |
||||
# remove comments in true branch; |
||||
print NEW "$line\n"; |
||||
} else { |
||||
# print out with directly: |
||||
print NEW $_; |
||||
} |
||||
} else { |
||||
if ($branch eq "false") { |
||||
# add comments in false branch |
||||
print NEW "///$_"; |
||||
} else { |
||||
print NEW $_; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
Loading…
Reference in new issue