make/src/classes/build/tools/spp/Spp.java
Print this page
@@ -80,19 +80,20 @@
System.err.println("Usage: java build.tools.spp.Spp [-be] [-Kkey] -Dvar=value ... <in >out");
System.exit(-1);
}
}
- StringBuffer out = new StringBuffer();
+ StringBuilder out = new StringBuilder();
new Spp().spp(new Scanner(System.in),
out, "",
keys, vars, be,
false);
System.out.print(out.toString());
}
static final String LNSEP = System.getProperty("line.separator");
+ static final String TWO_LNSEPS = LNSEP + LNSEP;
static final String KEY = "([a-zA-Z0-9]+)";
static final String VAR = "([a-zA-Z0-9_\\-]+)";
static final String TEXT = "([a-zA-Z0-9&;,.<>/#() \\$]+)"; // $ -- hack embedded $var$
static final int GN_NOT = 1;
@@ -105,11 +106,11 @@
Matcher elsekey = Pattern.compile("^#else\\[(!)?" + KEY + "\\]").matcher("");
Matcher endkey = Pattern.compile("^#end\\[(!)?" + KEY + "\\]").matcher("");
Matcher vardef = Pattern.compile("\\{#if\\[(!)?" + KEY + "\\]\\?" + TEXT + "(:"+ TEXT + ")?\\}|\\$" + VAR + "\\$").matcher("");
Matcher vardef2 = Pattern.compile("\\$" + VAR + "\\$").matcher("");
- void append(StringBuffer buf, String ln,
+ void append(StringBuilder buf, String ln,
Set<String> keys, Map<String, String> vars) {
vardef.reset(ln);
while (vardef.find()) {
String repl = "";
if (vardef.group(GN_VAR) != null)
@@ -131,11 +132,11 @@
}
vardef.appendTail(buf);
}
// return true if #end[key], #end or EOF reached
- boolean spp(Scanner in, StringBuffer buf, String key,
+ boolean spp(Scanner in, StringBuilder buf, String key,
Set<String> keys, Map<String, String> vars,
boolean be, boolean skip) {
while (in.hasNextLine()) {
String ln = in.nextLine();
if (be) {
@@ -152,38 +153,47 @@
if (ifkey.reset(ln).find()) {
String k = ifkey.group(GN_KEY);
boolean test = keys.contains(k);
if (ifkey.group(GN_NOT) != null)
test = !test;
- buf.append(LNSEP);
+ lineBreak(buf);
if (!spp(in, buf, k, keys, vars, be, skip || !test)) {
spp(in, buf, k, keys, vars, be, skip || test);
}
continue;
}
if (elsekey.reset(ln).find()) {
if (!key.equals(elsekey.group(GN_KEY))) {
throw new Error("Mis-matched #if-else-end at line <" + ln + ">");
}
- buf.append(LNSEP);
+ lineBreak(buf);
return false;
}
if (endkey.reset(ln).find()) {
if (!key.equals(endkey.group(GN_KEY))) {
throw new Error("Mis-matched #if-else-end at line <" + ln + ">");
}
- buf.append(LNSEP);
+ lineBreak(buf);
return true;
}
if (ln.startsWith("#warn")) {
ln = "// -- This file was mechanically generated: Do not edit! -- //";
} else if (ln.trim().startsWith("// ##")) {
ln = "";
}
if (!skip) {
append(buf, ln, keys, vars);
}
- buf.append(LNSEP);
+ lineBreak(buf);
}
return true;
}
+
+ // Avoid printing more than two linebreaks in a row, to prevent generating test files
+ // with hundreds of consecutive blank lines.
+ private void lineBreak(StringBuilder buf) {
+ if (buf.length() < TWO_LNSEPS.length()
+ || !buf.substring(buf.length() - TWO_LNSEPS.length()).equals(TWO_LNSEPS)) {
+ buf.append(LNSEP);
+ }
+ }
}