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);
+        }
+    }
 }