Author: rwhitcomb
Date: Wed Mar 24 20:32:51 2021
New Revision: 1888040
URL: http://svn.apache.org/viewvc?rev=1888040&view=rev
Log:
PIVOT-1056: Some small code cleanup and optimizations (I hope) in MacroReader
since this could be used in reading the default styles file.
Modified:
pivot/trunk/core/src/org/apache/pivot/serialization/MacroReader.java
Modified: pivot/trunk/core/src/org/apache/pivot/serialization/MacroReader.java
URL:
http://svn.apache.org/viewvc/pivot/trunk/core/src/org/apache/pivot/serialization/MacroReader.java?rev=1888040&r1=1888039&r2=1888040&view=diff
==============================================================================
--- pivot/trunk/core/src/org/apache/pivot/serialization/MacroReader.java
(original)
+++ pivot/trunk/core/src/org/apache/pivot/serialization/MacroReader.java Wed
Mar 24 20:32:51 2021
@@ -74,13 +74,13 @@ public final class MacroReader extends R
}
/**
- * Add all the characters of the given string to the lookahead queue
- * for reprocessing.
- * @param str The string to be queued up again.
+ * Add all the characters of the given character sequence to the
+ * lookahead queue for reprocessing.
+ * @param seq The character sequence to be queued up again.
*/
- private void queue(final String str) {
- for (int i = 0; i < str.length(); i++) {
- lookaheadQueue.add((int) str.charAt(i));
+ private void queue(final CharSequence seq) {
+ for (int i = 0; i < seq.length(); i++) {
+ lookaheadQueue.add((int) seq.charAt(i));
}
}
@@ -96,6 +96,7 @@ public final class MacroReader extends R
do {
ch = getNextChar(true);
} while (ch != -1 && Character.isWhitespace(ch));
+
if (ch != -1) {
buf.append((char) ch);
while ((ch = getNextChar(true)) != -1
@@ -103,6 +104,7 @@ public final class MacroReader extends R
|| (buf.length() > 0 &&
Character.isUnicodeIdentifierPart(ch)))) {
buf.append((char) ch);
}
+
// Re-queue the character that terminated the word
queue(ch);
}
@@ -110,10 +112,6 @@ public final class MacroReader extends R
}
private void skipToEol() throws IOException {
- int ch;
- do {
- ch = getNextChar(true);
- } while (ch != -1 && ch != '\n');
}
/**
@@ -131,82 +129,109 @@ public final class MacroReader extends R
*/
private int getNextChar(final boolean handleMacros) throws IOException {
int ret = -1;
- if (!lookaheadQueue.isEmpty()) {
- ret = lookaheadQueue.poll().intValue();
+ Integer queuedChar = lookaheadQueue.poll();
+ if (queuedChar != null) {
+ ret = queuedChar.intValue();
} else {
ret = in.read();
}
- // Check for macro define or undefine (starting with "#"
- // at the beginning of a line) (unless we're recursing to
- // skip an unknown declaration keyword).
- if (ret == '#' && lastCh == '\n' && handleMacros) {
- String keyword = getNextWord();
- if (keyword.equalsIgnoreCase("undef")) {
- String name = getNextWord();
- skipToEol();
- variableMap.remove(name);
- return getNextChar(true);
- } else if (!keyword.equalsIgnoreCase("define")) {
- // Basically ignore any commands we don't understand
- // by simply queueing the text back to be read again
- // but with the flag set to ignore this command (so
- // we don't get into infinite recursion!)
- queue(ret);
- queue(keyword);
- queue(' ');
- return getNextChar(false);
- }
- // Define a macro
- String name = getNextWord();
- StringBuilder buf = new StringBuilder();
+
+ if (handleMacros) {
int ch;
- do {
- ch = getNextChar(true);
- } while (ch != -1 && Character.isWhitespace(ch) && ch != '\\' &&
ch != '\n');
- queue(ch);
- do {
- while ((ch = getNextChar(true)) != -1 && ch != '\\' && ch !=
'\n') {
- buf.append((char) ch);
+
+ // Check for macro define or undefine (starting with "#"
+ // at the beginning of a line) (unless we're recursing to
+ // skip an unknown declaration keyword).
+ if (ret == '#' && lastCh == '\n') {
+ String keyword = getNextWord();
+
+ if (keyword.equalsIgnoreCase("undef")) {
+ String name = getNextWord();
+
+ do {
+ ch = getNextChar(false);
+ } while (ch != -1 && ch != '\n');
+
+ variableMap.remove(name);
+
+ return getNextChar(true);
+ } else if (!keyword.equalsIgnoreCase("define")) {
+ // Basically ignore any commands we don't understand
+ // by simply queueing the text back to be read again
+ // but with the flag set to ignore this command (so
+ // we don't get into infinite recursion!)
+ ch = getNextChar(false);
+ queue(ret);
+ queue(keyword);
+ queue(ch);
+
+ return getNextChar(false);
}
- // Check for line continuation character
- if (ch == '\\') {
- int next = getNextChar(true);
- if (next == '\n') {
- buf.append((char) next);
- } else {
+
+ // Define a macro
+ String name = getNextWord();
+ StringBuilder buf = new StringBuilder();
+
+ // Skip whitespace after the macro name
+ do {
+ ch = getNextChar(true);
+ } while (ch != -1 && Character.isWhitespace(ch) && ch != '\\'
&& ch != '\n');
+
+ queue(ch);
+
+ do {
+ while ((ch = getNextChar(true)) != -1 && ch != '\\' && ch
!= '\n') {
buf.append((char) ch);
- buf.append((char) next);
}
- }
- } while (ch != -1 && ch != '\n');
- variableMap.put(name, buf.toString());
- return getNextChar(true);
- } else if (ret == '$' && handleMacros) {
- // Check for macro expansion
- // Note: this allows for nested expansion
- int next = getNextChar(true);
- if (next == '{') {
- // Beginning of macro expansion
- StringBuilder buf = new StringBuilder();
- int ch;
- while ((ch = getNextChar(true)) != -1 && ch != '}') {
- buf.append((char) ch);
- }
- String expansion = variableMap.get(buf.toString());
- if (expansion == null) {
- queue(ret);
- queue(next);
- queue(buf.toString());
- queue(ch);
- ret = getNextChar(false);
+
+ // Check for line continuation character
+ if (ch == '\\') {
+ int next = getNextChar(true);
+ if (next == '\n') {
+ buf.append((char) next);
+ } else {
+ buf.append((char) ch);
+ buf.append((char) next);
+ }
+ }
+ } while (ch != -1 && ch != '\n');
+
+ variableMap.put(name, buf.toString());
+
+ return getNextChar(true);
+ } else if (ret == '$') {
+ // Check for macro expansion
+ // Note: this allows for nested expansion
+ int next = getNextChar(true);
+ if (next == '{') {
+ StringBuilder buf = new StringBuilder();
+
+ while ((ch = getNextChar(true)) != -1 && ch != '}') {
+ buf.append((char) ch);
+ }
+
+ String expansion = variableMap.get(buf.toString());
+ if (expansion == null) {
+ // If the macro is undefined, then we put back the
+ // original text to be read again, but without
expansion
+ queue(ret);
+ queue(next);
+ queue(buf);
+ queue(ch);
+
+ ret = getNextChar(false);
+ } else {
+ queue(expansion);
+
+ // By allowing expansion here, we get recursive
expansion
+ ret = getNextChar(true);
+ }
} else {
- queue(expansion);
- ret = getNextChar(true);
+ queue(next);
}
- } else {
- queue(next);
}
}
+
return (lastCh = ret);
}