public class Munge
extends java.lang.Object
To avoid creating a separate Java dialect, the conditional tags are contained in Java comments. This allows one build to compile the source files without pre-processing, to facilitate faster incremental development. Other builds from the same source have their code contained within that comment. The format of the tags is a little verbose, so that the tags won't accidentally be used by other comment readers such as javadoc. Munge tags must be in C-style comments; C++-style comments may be used to comment code within a comment.
To demonstrate this, our sample source has 1.1 and 1.2-specific code, with 1.1 as the default build:
public void setSystemProperty(String key, String value) {
/*if[JDK1.1]*/
Properties props = System.getProperties();
props.setProperty(key, value);
System.setProperties(props);
/*end[JDK1.1]*/
/*if[JDK1.2]
// Use the new System method.
System.setProperty(key, value);
end[JDK1.2]*/
}
When the above code is directly compiled, the code bracketed by the JDK1.1 tags will be used. If the file is run through Munge with the JDK1.2 tag defined, the second code block will used instead. This code can also be written as:
public void setSystemProperty(String key, String value) {
/*if[JDK1.2]
// Use the new System method.
System.setProperty(key, value);
else[JDK1.2]*/
Properties props = System.getProperties();
props.setProperty(key, value);
System.setProperties(props);
/*end[JDK1.2]*/
}
Munge also performs text substitution; the Swing build uses this to
convert its package references from javax.swing
to java.awt.swing
, for example. This substitution is
has no knowledge of Java syntax, so only use it to convert strings
which are unambiguous. Substitutions are made in the same order as
the arguments are specified, so the first substitution is made over
the whole file before the second one, and so on.
Munge's command line takes one of the following forms:
java Munge [-D<symbol> ...] [-s <old>=<new> ...] [<in file>] [<out file>]
java Munge [-D<symbol> ...] [-s <old>=<new> ...] <file> ... <directory>
In the first form, if no output file is given, System.out is used. If
neither input nor output file are given, System.in and System.out are used.
Munge can also take an @<cmdfile>
argument. If one is
specified then the given file is read for additional command line arguments.
Like any preprocessor, developers must be careful not to abuse its capabilities so that their code becomes unreadable. Please use it as little as possible.
Modifier and Type | Class and Description |
---|---|
(package private) static class |
Munge.CommandLine
This class was cut and pasted from the JDK1.2 sun.tools.util package.
|
Modifier and Type | Field and Description |
---|---|
(package private) java.lang.String |
block |
(package private) int |
CODE |
(package private) java.lang.String[] |
commands |
(package private) int |
COMMENT |
(package private) int |
ELSE |
(package private) int |
END |
(package private) int |
EOF |
(package private) int |
errors |
(package private) int |
IF |
(package private) int |
IF_NOT |
(package private) java.io.BufferedReader |
in |
(package private) java.lang.String |
inName |
(package private) int |
line |
(package private) static java.util.Vector |
newTextStrings |
(package private) int |
numCommands |
(package private) static java.util.Vector |
oldTextStrings |
(package private) java.io.PrintWriter |
out |
(package private) boolean |
printing |
(package private) java.lang.String |
source |
(package private) java.util.Stack |
stack |
(package private) static java.util.Hashtable |
symbols |
Constructor and Description |
---|
Munge(java.lang.String inName,
java.lang.String outName) |
Modifier and Type | Method and Description |
---|---|
void |
close() |
(package private) void |
cmd_else() |
(package private) void |
cmd_end() |
(package private) void |
cmd_if_not(java.lang.String version) |
(package private) void |
cmd_if(java.lang.String version) |
(package private) int |
countLines(java.lang.String s) |
(package private) static int |
countQuotes(java.lang.String input) |
void |
error(java.lang.String text) |
(package private) static int |
findCommentStart(java.lang.String source,
int fromIndex) |
(package private) int |
getCommand(java.lang.String s) |
boolean |
hasErrors() |
static void |
main(java.lang.String[] args)
Munge's main entry point.
|
(package private) int |
nextBlock() |
(package private) void |
print(java.lang.String s) |
void |
printErrorCount() |
void |
process() |
(package private) void |
processComment(java.lang.String comment) |
(package private) void |
substitute() |
static void |
usage()
Report how this utility is used and exit.
|
static void |
usage(java.lang.String msg) |
static java.util.Hashtable symbols
static java.util.Vector oldTextStrings
static java.util.Vector newTextStrings
int errors
int line
java.lang.String inName
java.io.BufferedReader in
java.io.PrintWriter out
java.util.Stack stack
boolean printing
java.lang.String source
java.lang.String block
final java.lang.String[] commands
final int IF
final int IF_NOT
final int ELSE
final int END
final int numCommands
final int EOF
final int COMMENT
final int CODE
int getCommand(java.lang.String s)
public void error(java.lang.String text)
public void printErrorCount()
public boolean hasErrors()
public void close() throws java.io.IOException
java.io.IOException
void cmd_if(java.lang.String version)
void cmd_if_not(java.lang.String version)
void cmd_else()
void cmd_end() throws java.util.EmptyStackException
java.util.EmptyStackException
void print(java.lang.String s) throws java.io.IOException
java.io.IOException
int countLines(java.lang.String s)
void processComment(java.lang.String comment) throws java.io.IOException
java.io.IOException
int nextBlock() throws java.io.IOException
java.io.IOException
static int findCommentStart(java.lang.String source, int fromIndex)
static int countQuotes(java.lang.String input)
void substitute()
public void process() throws java.io.IOException
java.io.IOException
public static void usage()
public static void usage(java.lang.String msg)
public static void main(java.lang.String[] args)